Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2011, 21:01   #1
Маргарита 123
Новичок
Джуниор
 
Регистрация: 07.12.2011
Сообщений: 1
По умолчанию эвристика для пятнашек

помогите, пожалуйста написать код для пятнашек с эвристикой. чтобы компьютер демонстрировал решение. Нашла код, но он не работает, разобраться не получается.

вот код, помогите исправить

Код:
function A*(start,goal)
     closedset := the empty set    // Множество вершин, которые уже были обработаны(раскрыты)
     openset := {start}            // Множество вершин(очередь), которые предстоит обработать(раскрыть). 
                                       // Изначально здесь присутствует только начальная вершина start.
     path_map := the empty set     // Карта пройденных вершин. Используется функцией reconstruct_path
 
     //Заполняем свойства вершины start
     start.g := 0   // g(x). Стоимость пути от начальной вершины. У start g(x) = 0
     start.h := heuristic_cost_estimate(start, goal) // Эвристическая оценка расстояние до цели. h(x)
     start.f := g_score[start] + h_score[start]      // f(x) = g(x) + h(x)
     start.came_from := start //Вершина с которой мы пришли. Используется для реконструкции пути.
 
     while openset is not empty
         x := вершина из openset имеющая самую низкую оценку f(x)
         if x = goal 
             return reconstruct_path(goal) //заполняем карту path_map
 
         remove x from openset // Вершина x пошла на обработку, а значит её следует удалить из очереди на обработку
         add x to closedset    // И добавить в список уже обработанных
         foreach y in neighbor_nodes(x) // Проверяем каждого соседа x
             if y in closedset          // Пропускаем соседей из закрытого списка
                 continue
 
             tentative_g_score := x.g + dist_between(x,y)  // Вычисляем g(x) для обрабатываемого соседа
 
             if y not in openset // Если сосед x ещё не в открытом списке - добавим его туда
                 add y to openset
                 tentative_is_better := true
             else               // Сосед был в открытом списке, а значит мы уже знаем его g(x), h(x) и f(x)
                 if tentative_g_score < y.g  
                     // Вычисленная g(x) оказалась меньше, а значит нужно будет обновить  g(x), h(x), f(x)
                     tentative_is_better := true   
                 else
                     // Вычесленная g(x) оказалась больше, чем имеющаяся в openset. 
                     // Это означает, что из вершины x путь через этого соседа дороже
                     // т.е. существует менее дорогой маршрут, пролегающий через этого соседа (из какой-то другой вершины, не из x)
                     // Поэтому данного соседа мы игнорируем
                     tentative_is_better := false 
 
             // Обновление свойств соседа. 
             if tentative_is_better = true
                 y.came_from := x
                 y.g := tentative_g_score
                 y.h := heuristic_cost_estimate(y, goal)
                 y.f := g_score[y] + h_score[y]
             // Обратите внимание, что если происходит обновление свойств - значит y(сосед x) 
             // так или иначе находится в openset.
             // Т.е. при следующей итерации внешнего цикла из openset будет извлечена вершина с наименьшей оценкой f(x)
             // Не исключено, что она окажется соседом нашего x, которого мы только что добавили.
             // В общем это самая важная особенность алгоритма А*
 
     return failure //управление передаётся сюда когда openset пуст, а goal не найден.
 
// Заполняет карту path_map
// Путь можно проследить только от заданной вершины(чаще всего это goal) 
// к старту(каждая вершина имеет свойство came_from, чем мы и воспользуемся)
function reconstruct_path(start_node, goal_node)
// Добавляем в карту все вершины от finish_node до start_node.
// Если встречается вершина с не заполненным полем came_from - путь отсутствует
     current_node := goal_node // поиск начинается от финиша
     while current_node.came_from <> start_node 
         if current_node.came_from <> NULL
             path_map.add_node(current_node) // Добавить вершину в карту
             current_node := current_node.came_from
         else
             return path_not_found //нельзя найти путь, т.к. цепочка came_from оборвалась
 
     return path_found
// TODO: По-моему, функция может зациклиться если вызвать её для не найденного пути и если на графе есть петли. 
// В любом случае, код приведен для демонстрации алгоритма и конкретная реализация должна учитывать возможность зацикливания. 
// Проблем быть не должно,если вызывать функцию только для найденных путей.

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 07.12.2011 в 23:08.
Маргарита 123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какие есть компоненты для Delphi для создания такого интерфейса? Marsel737 Свободное общение 7 24.09.2011 18:25
Хорошая программа для разрезания жестких дисков для 7-ой винды и других ОС. Pumik2010 Windows 3 01.03.2011 01:28
составить функцию для вычисления значения y=P(x) многочлена для заданного аргумента x KASPEER Помощь студентам 2 12.01.2010 15:03
Насколько можетбыть коротким код для решения задчки для Экселя? saga Microsoft Office Excel 0 04.04.2009 13:35
Бесплатный движок для САЙТА на Java Script для Бесплатных Хостингов антигерой HTML и CSS 0 15.04.2007 21:39