2016-04-26 14 views
1

これまでのところ、N-Queens問題の8x8ボード用の92個のソリューションを表示するこのコードがあります。すべての92のソリューションを表示するのではなく、実行するたびに1つのランダムなソリューションを表示するようにしたいと思っています。これどうやってするの?N-クイーンズディスプレイ1ランダムソリューション

import sys 

from ortools.constraint_solver import pywrapcp 

# by default, solve the 8x8 problem 
n = 8 if len(sys.argv) < 2 else int(sys.argv[1]) 

# creates the solver 
solver = pywrapcp.Solver("n-queens") 

# creates the variables 
# the array index is the row, and the value is the column 
queens = [solver.IntVar(0, n - 1, "x%i" % i) for i in range(n)] 
# creates the constraints 

# all columns must be different 
solver.Add(solver.AllDifferent(queens)) 

# no two queens can be on the same diagonal 
solver.Add(solver.AllDifferent([queens[i] + i for i in range(n)])) 
solver.Add(solver.AllDifferent([queens[i] - i for i in range(n)])) 

# tells solver what to solve 
db = solver.Phase(queens, solver.CHOOSE_MIN_SIZE_LOWEST_MAX, solver.ASSIGN_CENTER_VALUE) 

solver.NewSearch(db) 

# iterates through the solutions 
num_solutions = 0 
while solver.NextSolution(): 
    queen_columns = [int(queens[i].Value()) for i in range(n)] 

    # displays the solutions 
    for i in range(n): 
    for j in range(n): 
     if queen_columns[i] == j: 
     print "Q", 
     else: 
     print "_", 
    print 
    print 
    num_solutions += 1 

solver.EndSearch() 

print 
print "Solutions found:", num_solutions 

答えて

2

ソリューションのリストを生成し、その後、1を選ぶ:

solutions = [] 
while solver.NextSolution(): 
    queen_columns = [int(queens[i].Value()) for i in range(n)] 
    solutions.append(queen_columns) 

import random 
queen_columns = random.choice(solutions) 
+0

これは私にとって非常にうまく動作するようです!しかし、num_solutions + = 1行のコードの隣に "'int'オブジェクトが反復不可能であるというエラーがあります...どうすれば修正できますか? – Rataiczak24

+1

num_solutionsが必要ない場合は、その行を削除してください。 –

+0

大丈夫です。削除しても問題なくすべて正常に動作しますが、解決策の数を印刷する必要があります。私のプリントステートメントで使用しますか? – Rataiczak24

関連する問題