Если вы ищете простое решение, могу я предложить немного рандомизации?
Я имею в виду следующее: в примере кода cokeandcode есть вложенные циклы for, которые генерируют «состояния преемника» (используя термин AI). Я имею в виду точку, где он зацикливается на квадрате 3x3 вокруг «текущего» состояния, добавляя новые места в кучу для рассмотрения.
Относительно простое исправление будет (должно :)) немного изолировать этот код и, скажем, сгенерировать связанный список узлов до остальной части этапа обработки. Затем Containers.Shuffle (или это Generics.Shuffle?) этого связанного списка и продолжайте обработку там. По сути, есть процедура, скажем, "createNaiveNeighbors(node)", которая возвращает LinkedList = {(node.x-1,node.y), (node.x, node.y-1)... } (пожалуйста, извините за pidgin Java, я пытаюсь (и всегда терплю неудачу) быть кратким.
Однако после того, как вы создадите связанный список, вы сможете просто выполнить «for (Node n : myNewLinkedList)» вместо
for (int x=-1;x<2;x++) {
for (int y=-1;y<2;y++) {
И по-прежнему используйте тот же самый код тела!
В идеале это должно было бы как бы «встряхнуть» порядок рассматриваемых узлов и создать пути ближе к диагонали, но без изменения эвристики. Пути по-прежнему будут наиболее эффективными, но обычно ближе к диагонали.
Недостатком, конечно, является то, что если вы идете от А к Б несколько раз, вы можете выбрать другой путь. Если это неприемлемо, вам, возможно, придется рассмотреть более радикальное изменение.
Надеюсь это поможет! -Агор
person
agorenst
schedule
25.07.2009