Алгоритмы поиска пути в графе. Часть 2


Новые возможности, ранее реализованных алгоритмов поиска пути в графе на платформе 1С 8.3.

Это продолжение публикации Алгоритмы поиска пути в графе. Добавлены следующие возможности:

  1. Несколько точек "Б". Теперь можно посмотреть поведение различных алгоритмов для множеств конечных точек "Б", и оценить длину путей.
  2. Окрестности Мура. Теперь поиск можно осуществлять не только по четырем направлениям но и по восьми, т.е. учитывать диагональные направления. В связи с этим выведены настройки стоимостей путей.

Сами алгоритмы поиска будут выглядеть следующим образом (они не сильно изменились по сравнению с предыдущей публикации):

 

 Поиск в ширину

 

 Поиск в ширину с ранним выходом

 

 Жадный поиск

 

 Алгоритм Дейкстры

 

 Алгоритм А*

 

 Волновой алгоритм

Алгоритмы поиска на выходе предоставляют структуру ПосещенныеВершины. По ней строится путь от точки "А" до интересующей нас точки "Б". Для этого используются следующие функции: 

 

 Восстановление пути

 

 Восстановление пути волнового алгоритма

При такой реализации на выходе получаем стек с вершинами в порядке следования. Начиная путь с точки "А" берем из стека вершину и движемся к ней, после ее достижения берем следующую, и так пока не опустошим стек.

Про то как реализовать стек можно посмотреть здесь (реализуем Стек, Очередь и Приоритетную очередь в 1С).

В алгоритмах поиска пути используется функция получения соседей поэтому приведу код для их вычислений:

 

 Получение соседей

Для демонстрации новых возможностей доработал обработку. Выглядит она теперь так:

Добавляйте точки "Б", перетаскивайте их, изменяйте карту, жмякайте "Старт" и наблюдайте пошагово работу выбранного алгоритма. Стрелками "Влево"(кнопка A) или "Вправо"(D) можно шагать по выполненному алгоритму.

Обработка сделана средствами платформы 1С 8.3.10 без использования внешних компонент. 

 

ПС: для любителей автоматного программирования — обработка выполнена в стиле автоматного программирования и к ней идет спецификация, состоящая из схем связей и графов перехода (диаграмм состояний). Список литературы по автоматному программированию и конечным автоматам:

[1] — http://is.ifmo.ru/books/_book.pdf — Н. И. Поликарпова, А. А. Шалыто. Автоматное программирование. СПб 2008. 

[2] — http://is.ifmo.ru/automata/

[3] — http://softcraft.ru/auto/

9 Comments

  1. herfis

    Еще и конструктор уровней 🙂

    Поддержал стартманями.

    Reply
  2. herfis

    А что это за схема префиксации методов и переменных? Навскидку не соображу.

    z12_1_ПоказатьНадписьВыбораНовойТочки() — что это означает?

    Reply
  3. RonX01

    (2) Спасибо.

    Reply
  4. RonX01

    (3) Это связано с изоморфной реализацией конечного автомата согласно спецификации.

    Другими словами — сложная логика реализована в виде конечных автоматов. Они сначала проектируются — создается схема связей и граф перехода. На схеме связей как раз и происходит кодирование элементов (буква + число). Начальные буквы означают: е — событие, х — булева переменная, а z — это действие которое будет выполнено.

    Кодирование помогает компактно отражать логику на графе перехода.

    После окончания проектирования конечных автоматов они реализуются изморфно, т.е. по спецификации. Таким образом, z12_1_ПоказатьНадписьВыбораНовойТочки(), где z12_1 — номер действия, который можно найти в спецификации, а ПоказатьНадписьВыбораНовойТочки — текст, который расшифровывает действие.

    Reply
  5. herfis

    (5) А, привязка к спецификации! Ок.

    Но разобраться в спецификации методом научного тыка не удалось 🙂

    Reply
  6. Yashazz

    Нравится однозначно, спасибо!

    Reply
  7. RonX01

    (6) Да, к сожалению приходится погрузиться хоть немного в тему, чтобы читать спецификацию.

    Если интересно, то вот книга, по которотой спецификация и сделана —

    http://is.ifmo.ru/books/_book.pdf — Н. И. Поликарпова, А. А. Шалыто. Автоматное программирование. СПб 2008.

    На мой взгляд очень легко и интересно написано.

    Reply
  8. RonX01

    (6) Кстати, мне кажется, что протокол тестирования должен помочь разобраться в спецификации (кнопка «Показать протокол тестирования»).

    Например, нажав на клетку в протокле тестирования будет трассировка автоматов, это по сути интерактивная отладка.

    Reply
  9. shard

    В случае поиска путей по маршруту из нескольких точек будет иметь смысл предусмотреть величину забираемого груза в точке. Пригодится например в случае поиска оптимального маршрута кладовщика по складу: если в первой точке он зацепит 300кило, то будет тяжело потом заехать потом еще в 5 мест и забрать оттуда мелочевки по 1-2кг.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *