首页 > 解决方案 > 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])

标签: pythonn-queenshill-climbing

解决方案


您已将无限循环与while True. 你的循环永远不会中断。所以你的程序流程永远不会到达print(a)print(board[i][j])行。我检查了你的代码,你的第二个while循环永远不会中断并且可以连续工作。请检查您的休息条件。
实际上,我在您的代码中注意到了一个问题:据我阅读算法,如果我理解正确,那么您计算的碰​​撞次数是错误的。

在此处输入图像描述

这张图片是你的棋盘状态。如果我对算法的理解正确,那里有 4 次碰撞。(如果我错了,请纠正我)但是您的 totalcoll() 函数将其计算为 18。为了确定,我再次运行了代码。我看到了:虽然有 3 次碰撞,但 totalcoll() 返回 13 次碰撞。

还有另一个示例:

在此处输入图像描述

这是你的板,有 5 次碰撞。但这就是您的程序关于碰撞(23 碰撞)的内容: 在此处输入图像描述

你应该检查你的 totalcoll() 函数。


推荐阅读