0

この重要なメソッドを備えたシングルスレッドの Python モジュール (n-Queen 問題を解決するため) があります。

def step(self):
    r = Random()        
    poz = r.choice(self.available)   #!!!problem here
    #poz = 9 #this will work
    for p in self.available:
        if self.collision(poz, p):   # this method fails with the usage of random
            self.available.remove(p)
    self.state.queens.append(poz)
    self.debug()
    return True

9 などの定数値を指定すると、メソッドは正常に動作しますが、ランダム関数の選択を使用して、使用可能な (数値のリスト) から値を選択する場合、collision()メソッドは正しく動作しません。一部を逃すことによって。

これが役立つ場合の衝突方法は次のとおりです。

def collision(self, a, b):
    x1, y1 = a / self.n, a % self.n
    x2, y2 = b / self.n, b % self.n  
    return x1 == x2 or y1 == y2 or abs(x1 - x2) == abs(y1 - y2) 

基本的に、チェスのマス「b」がクイーン「a」によって攻撃可能かどうかをチェックします

4

1 に答える 1

1

ここで答えが見つかりました

反復中にリストからアイテムを削除します

反復を次のように置き換えました

self.available = [x for x in self.available if not self.collision(poz, x)]
于 2012-11-09T14:56:46.767 に答える