Python 8皇后带爬山算法不';我什么也不退吗?
我知道这有点长,但是你知道为什么我的8皇后算法没有返回任何东西吗。我创建了一个空的板,类似的相邻板和皇后(用于跟踪它们所在的位置)我为每列放置一个皇后,并将它们放入随机行中,然后我计算总碰撞,然后我将皇后逐个放置在其他行(在同一列中),并再次计算总碰撞。在那之后,我找到了将创建最小碰撞的位置,直到我用完了可以最小化碰撞的位置,在打破第一个(碰撞)循环后,如果碰撞为0,我将打破第二个循环(重置所有皇后位置)Python 8皇后带爬山算法不';我什么也不退吗?,python,n-queens,hill-climbing,Python,N Queens,Hill Climbing,我知道这有点长,但是你知道为什么我的8皇后算法没有返回任何东西吗。我创建了一个空的板,类似的相邻板和皇后(用于跟踪它们所在的位置)我为每列放置一个皇后,并将它们放入随机行中,然后我计算总碰撞,然后我将皇后逐个放置在其他行(在同一列中),并再次计算总碰撞。在那之后,我找到了将创建最小碰撞的位置,直到我用完了可以最小化碰撞的位置,在打破第一个(碰撞)循环后,如果碰撞为0,我将打破第二个循环(重置所有皇后位置) import random from array import array board
import random
from array import array
board = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]
neighbour = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]
queens = [0,0,0,0,0,0,0,0]
def collision_count(column,row):
coll = 0
for j in range(8):
if j == row:
continue
if board[column][j] == 1 :
coll += 1
while(column < 7 and row < 7):
row += 1
column +=1
if board[column][row] == 1:
coll += 1
while(column > 0 and row > 0):
row -= 1
column -=1
if board[column][row] == 1:
coll += 1
while(column > 0 and row < 7):
row += 1
column -=1
if board[column][row] == 1:
coll += 1
while(column < 7 and row > 0):
row -= 1
column +=1
if board[column][row] == 1:
coll += 1
return coll
def totalcoll():
totcoll = 0
for i in range(8):
totcoll += collision_count(i,queens[i])
return totcoll
while True:
for i in range(8):
queens[i] = random.randrange(0,8)
board[i][queens[i]] = 1
totalcollision = totalcoll()
while True:
for i in range(8):
oldqueen = queens[i]
for j in range(8):
queens[i] = j
neighbour[i][j] = totalcoll()
queens[i] = oldqueen
min = neighbour[0][0]
minqueencol = 0
minqueenrow = 0
for i in range(8):
for j in range(8):
if(neighbour[i][j]<min):
min = neighbour[i][j]
minqueenrow = j
minqueencol = i
if min<totalcollision:
totalcollision = min
queens[minqueencol] = minqueenrow
else:
break
if totalcollision == 0:
break
print("a")
for i in range(8):
for j in range(8):
print(board[i][j])
随机导入
从数组导入数组
董事会=[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
邻居=[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0]]
皇后区=[0,0,0,0,0,0,0,0]
def碰撞_计数(列、行):
coll=0
对于范围(8)内的j:
如果j==行:
持续
如果board[列][j]==1:
coll+=1
而(列<7,行<7):
行+=1
列+=1
如果板[列][行]==1:
coll+=1
而(列>0,行>0):
行-=1
列-=1
如果板[列][行]==1:
coll+=1
而(列>0,行<7):
行+=1
列-=1
如果板[列][行]==1:
coll+=1
而(列<7,行>0):
行-=1
列+=1
如果板[列][行]==1:
coll+=1
返回科尔
def totalcoll():
totcoll=0
对于范围(8)中的i:
totcoll+=碰撞计数(i,皇后[i])
返回托科尔
尽管如此:
对于范围(8)中的i:
queens[i]=random.randrange(0,8)
董事会[i][皇后区[i]]=1
totalcollision=totalcoll()
尽管如此:
对于范围(8)中的i:
老皇后
对于范围(8)内的j:
皇后[i]=j
邻居[i][j]=totalcoll()
皇后[我]=老皇后
最小值=邻居[0][0]
minqueencol=0
minqueenrow=0
对于范围(8)中的i:
对于范围(8)内的j:
如果(邻居[i][j]你用设置了无限循环,而为True
。你的循环从未中断。因此你的程序流从未达到打印(a)
和打印(board[i][j])
行。我检查了你的代码和你的第二个,而循环从未中断并持续工作。请检查你的中断条件。
事实上,我注意到你的代码中有一个问题:就我阅读的算法而言,如果我理解正确的话,你是在错误计算冲突的数量
这张图片是你的电路板状态。如果我正确理解了算法,其中有4个冲突。(如果我错了,请纠正我),但你的totalcoll()函数将其计算为18。我再次运行代码只是为了确定。我看到:虽然有3个冲突,totalcoll()返回13个冲突
还有另一个例子:
这是你的5碰撞板。但这是你的程序关于碰撞(23碰撞)的说明:
你应该检查一下你的totalcoll()函数。@NikhilKumar你的建议行得通,但是为什么[0]*8
不是同一个列表的8个副本呢?@user\na因为列表是不可变的。一个详细的解释。@Reti43我不明白这是关于board的问题吗?@user\na:构造n个列表的更简洁的习惯用法是board=[0,0,0,0,0,0,0,0]对于使用列表理解的u.in-range(8)]
,在Python中是一个不需要关心的变量,无法读取。我不明白它为什么不中断?总冲突永远不会达到零?