ПредишенСледващото

човешкото в края на краищата

разстояние + = абсолютен ((I - м [Ь] [й] / 4)) + ABS ((I - м [Ь] [й]% 4)) Ако се изчисли разстоянието "Manhattan" между тока и идеална позиция на плочката, защо модул знаци във всеки отделен случай, използвайки само един индекс аз. Вярвам, че правилно да се поправи:
разстояние + = абсолютен ((I - м [Ь] [й] / 4)) + ABS ((J - м [Ь] [й]% 4))

UPD.
алгоритъм поставя празен лист винаги е в позиция [0, 0] и ако го поставите на друго място, той "виси" Предполагам, че това е така, защото на вашето броене диапазон. Можете нула (т.е. позицията на празен kdetki) не се отчитат по някаква причина.
Ако е правилно текст, така че определен пример ([[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 11, 12], [13, 10, 14, 15] ]) обикновено шортхендед


Def puzz_astar (начало, край):
"" "
A * алгоритъм
"" "
предната = [[heuristic_2 (начало), започнете]]
печат (отпред)
разширени = []

докато пред:
I = 0
за й в диапазон (1, LEN (отпред)):
ако предната [Ь] [0]> пред [к] [0]:
I = й
пътека = предната [Ь]
предната = предната [: Ь] + пред [Ь + 1:]
endnode = път [-1]
ако endnode == край:
почивка
ако endnode в разширен: продължи
за к в хода (endnode):
ако к в разширеното: продължи
newpath = [път [0] + ABS (heuristic_2 (к) - heuristic_2 (endnode))] + път [1:] + [к]
front.append (newpath)
expanded.append (endnode)
expanded_nodes + = 1

Печат "Разширените възли:", expanded_nodes
печат "Решение:"
pp.pprint (път)

дефиниция heuristic_2 (Puzz):
"" "
Манхатън разстояние
"" "
разстояние = 0
m = Оценка (Puzz)
защото в диапазон (4):
за й в диапазон (4):
ако m [Ь] [й] == 0: разстояние + = 3-и + 3-й
разстояние + = абсолютен ((I - м [Ь] [й] / 4)) + ABS ((J - м [Ь] [й]% 4))
връщане разстояние

Подкрепете проекта - споделете линка, благодаря!