Esempio n. 1
0
    def test_sum(self) -> None:
        ip = IP()
        x = ip.add_boolean_grid(5, 5)
        self.assertIsInstance(sum(x[:][1]), Sum)
        self.assertIsInstance(sum(x[2][:]), Sum)

        x3 = ip.add_boolean_cube(5, 5, 6)
        self.assertIsInstance(sum(sum(x3[:][2][:])), Sum)
Esempio n. 2
0
def find_groups(num_weeks):
    print("Number of weeks:", num_weeks)
    all_weeks = list(range(num_weeks))

    start_time = time.time()

    ip = IP()
    x = ip.add_boolean_grid(len(all_groups), num_weeks)

    # Symmetry breaking
    start = set()
    for i in range(num_groups):
        start.add(tuple(range(group_size * i, group_size * (i + 1))))
    second_week = tuple([group_size * i for i in range(group_size)])
    for i, g in enumerate(all_groups):
        # First week is completely fixed.
        if g in start:
            ip.add_constraint(x[i, 0] == 1)
            for w in range(1, num_weeks):
                ip.add_constraint(x[i, w] == 0)
        else:
            ip.add_constraint(x[i, 0] == 0)

        # Second week 0 and 5 plays together.
        if num_weeks > 1:
            if second_week == g:
                ip.add_constraint(x[i, 1] == 1)
            else:
                for j in second_week:
                    if j in g:
                        ip.add_constraint(x[i, 1] == 0)

    # Everyone plays exactly once every week.
    for w in all_weeks:
        for p in all_players:
            s = Sum()
            for i, g in enumerate(all_groups):
                if p in g:
                    s += x[i, w]
            ip.add_constraint(s == 1)

    # Everyone plays together no more than once.
    for p1, p2 in itertools.combinations(all_players, 2):
        s = Sum()
        for i, g in enumerate(all_groups):
            if p1 in g and p2 in g:
                for w in all_weeks:
                    s += x[i, w]
        ip.add_constraint(s <= 1)

    print("Creation time:", int(time.time() - start_time))
    start_time = time.time()

    if not Solver().solutions(ip).get():
        return False

    print("Solve time:", int(time.time() - start_time))

    for w in all_weeks:
        print("Week", w + 1)
        for i, g in enumerate(all_groups):
            if x[i, w].value() > 0.5:
                print(g, end=" ")
        print("")

    return True