Mi a baj a pyatnashek algoritmus

emberi elvégre

távolság + = abs ((I - m [i] [j] / 4)) + ABS ((I - m [i] [j]% 4)) Ha kiszámolja a "Manhattan" távolság az aktuális és az ideális helyzete a cserép, Ezért a modulus jelek minden esetben kizárólag egy i index. Úgy vélem, helyes, hogy korrigálni kell:






távolság + = abs ((I - m [i] [j] / 4)) + ABS ((j - m [i] [j]% 4))

UPD.
algoritmus hozza egy üres mindig pozícióban [0, 0] és ha inkább egy másik helyen, hogy „lóg” Azt hiszem, ez azért van, mert a számolás tartományban. Te nulla (azaz a helyzet az üres kdetki) figyelmen kívül valamilyen okból.
Ha a helyes szöveget úgy, hogy megadott példa ([[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 11, 12], [13, 10, 14, 15] ]) általában gyorsírás








def puzz_astar (kezdete, vége):
„” "
A * algoritmus
„” "
elülső = [[heuristic_2 (start), start]]
print (elöl)
expandált = []

míg az első:
i = 0
j tartományban (1, len (elöl)):
ha elülső [i] [0]> előtt [j] [0]:
i = j
path = elülső [i]
elülső = elöl [: i] + elülső [i + 1:]
végpontja = path [-1]
ha végpontja == vége:
szünet
ha végpontja a kibontott: folytatni
A k mozog (végpontja):
ha k kiterjesztett: folytatni
newpath = [útvonal [0] + abs (heuristic_2 (k) - heuristic_2 (végpontja))] + path [1:] + [K]
front.append (newpath)
expanded.append (végpontja)
expanded_nodes + = 1

print "Expanded csomópontok", expanded_nodes
print "Megoldás:"
pp.pprint (path)

def heuristic_2 (Puzz):
„” "
manhattan távolság
„” "
távolság = 0
m = Eval (Puzz)
for i in tartományban (4):
j a tartományban (4):
ha m [i] [j] == 0: távolság + = 3-i + 3-j
távolság + = abs ((I - m [i] [j] / 4)) + ABS ((j - m [i] [j]% 4))
visszatérés távolság