python - 8 带爬山算法的女王不返回任何东西?
问题描述
我知道这有点长,但你知道为什么我的 8 皇后算法不返回任何东西吗?我创建了一个空板,类似的邻居板和皇后(用于跟踪它们的位置)我为每一列放置一个皇后并将它们放入随机行然后我计算总碰撞然后我将皇后放在其他行(在同一列) 并再次计算总碰撞。之后,我找到了会产生最小碰撞的位置,直到我用完可以最小化碰撞的位置,并且在打破第一个(计算邻居碰撞)循环之后,我打破了第二个循环(重置所有皇后位置)如果碰撞为 0。
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])
解决方案
您已将无限循环与while True
. 你的循环永远不会中断。所以你的程序流程永远不会到达print(a)
和print(board[i][j])
行。我检查了你的代码,你的第二个while
循环永远不会中断并且可以连续工作。请检查您的休息条件。
实际上,我在您的代码中注意到了一个问题:据我阅读算法,如果我理解正确,那么您计算的碰撞次数是错误的。
这张图片是你的棋盘状态。如果我对算法的理解正确,那里有 4 次碰撞。(如果我错了,请纠正我)但是您的 totalcoll() 函数将其计算为 18。为了确定,我再次运行了代码。我看到了:虽然有 3 次碰撞,但 totalcoll() 返回 13 次碰撞。
还有另一个示例:
这是你的板,有 5 次碰撞。但这就是您的程序关于碰撞(23 碰撞)的内容:
你应该检查你的 totalcoll() 函数。
推荐阅读
- permissions - IOS14、IpadOS14、tvOS14、AppStore 中的新用户权限需要跟踪吗?
- symfony - 在 SonataAdmin 中使用 ModelListType 与我们的关系
- python - 如何有效地从大型数据集中获取指定窗口内数据的平均值?
- django - Django OneToOne 字段 - 没有对 AUTH_USER_MODEL 的反向访问器
- css - CSS 切换 bootstrap-vue 卡全屏
- c# - 在正文中发送 json 以进行 API 后期测试
- html - 使用 ActionLink 将目录的值从锚标记传递到控制器
- mysql - Mysql经常关机/重启
- python - 我可以解析 PDF 文件以进行抓取吗?
- javascript - 使用 javascript 修复正则表达式以支持 wiki 中的电子邮件示例?