Пример #1
0
def solution(dimension, solver=None):
    """Generate binary puzzle solution."""
    problem = Problem()
    if solver is not None:
        problem.setSolver(solver)
    else:
        problem.setSolver(BacktrackingSolver())
    problem.addVariables(range(dimension**2), [0, 1])
    for i in range(dimension):
        row_positions = range(i * dimension, (i + 1) * dimension)
        column_positions = range(i, dimension**2, dimension)
        # same number of zeros and ones in each row
        problem.addConstraint(ExactSumConstraint(dimension / 2), row_positions)
        problem.addConstraint(ExactSumConstraint(dimension / 2),
                              column_positions)
        # maximum two of the same next to each other
        for triplet in _nwise(row_positions, 3):
            problem.addConstraint(MaxSumConstraint(2), triplet)
            problem.addConstraint(MinSumConstraint(1), triplet)
        for triplet in _nwise(column_positions, 3):
            problem.addConstraint(MaxSumConstraint(2), triplet)
            problem.addConstraint(MinSumConstraint(1), triplet)
    # unique rows and columns
    problem.addConstraint(
        FunctionConstraint(partial(_test_uniqueness, dimension=dimension)),
        range(dimension**2))
    if isinstance(solver, RecursiveBacktrackingSolver):
        return problem.getSolutions()
    if isinstance(solver, MinConflictsSolver):
        return (problem.getSolution(), )
    return problem.getSolutionIter()
Пример #2
0
while end - start < max_time:  # The program would wait upto 5 minutes for solving a problem
    problem = Problem()

    cols = range(N)  # Number of Columns
    rows = range(N)  # Number of Rows
    problem.addVariables(cols, rows)

    for col1 in cols:
        for col2 in cols:
            if col1 < col2:
                problem.addConstraint(
                    lambda row1, row2, col1=col1, col2=col2: abs(row1 - row2)
                    != abs(col1 - col2) and row1 != row2,
                    (col1, col2),
                )

    problem.setSolver(MinConflictsSolver())
    start = perf_counter()  # Starting Counter
    solution = problem.getSolution(
    )  # Minimum Conflict Solver only returns one solution
    end = perf_counter()  # Ending Counter
    times.append(
        (N, end -
         start))  # Stores Number of Queens and Time Taken to Solve the Puzzle
    N += 1

print('Total Time Taken to Solve The Puzzles using Iterative Approach:')
print('N\t Time')
for time in times:
    print(time[0], '\t', str(time[1]) + ' seconds')