Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 8皇后带爬山算法不';我什么也不退吗?_Python_N Queens_Hill Climbing - Fatal编程技术网

Python 8皇后带爬山算法不';我什么也不退吗?

Python 8皇后带爬山算法不';我什么也不退吗?,python,n-queens,hill-climbing,Python,N Queens,Hill Climbing,我知道这有点长,但是你知道为什么我的8皇后算法没有返回任何东西吗。我创建了一个空的板,类似的相邻板和皇后(用于跟踪它们所在的位置)我为每列放置一个皇后,并将它们放入随机行中,然后我计算总碰撞,然后我将皇后逐个放置在其他行(在同一列中),并再次计算总碰撞。在那之后,我找到了将创建最小碰撞的位置,直到我用完了可以最小化碰撞的位置,在打破第一个(碰撞)循环后,如果碰撞为0,我将打破第二个循环(重置所有皇后位置) import random from array import array board

我知道这有点长,但是你知道为什么我的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])
随机导入
从数组导入数组
董事会=[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
邻居=[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,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中是一个不需要关心的变量,无法读取。我不明白它为什么不中断?总冲突永远不会达到零?