BFS прохождение графа пустыни по определенным правилам

1

В настоящее время я решаю вопрос, как показано на этой ссылке ниже: http://www.expertsmind.com/questions/python-implementation-of-a-solver-for-the-desert-crossing-30144185.aspx

Для решения этой проблемы требуется алгоритм Breadth-First-Search (BFS). Согласно моему пониманию, модифицированный BFS-алгоритм используется для поиска кратчайшего пути, соединяющего исходный узел с пунктом назначения. Тем не менее, я понятия не имею, как реализовать его в этом сценарии в соответствии с официальными правилами грузовика.

Может ли кто-нибудь предоставить мне руководство/идею, как использовать BFS для решения этой проблемы? Ваша помощь очень высоко ценится. Спасибо.

Теги:
breadth-first-search

1 ответ

0
Лучший ответ

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

  truck (gas: 3)
  v
 [0, 0, 0, 0, 0]
  ^           ^
start        goal

Из этой позиции назовите ее (A), какие переходы (ребра) на другой узел возможны? Вот они:

       (B)                  (C)                    (D)

     truck (gas: 0)          truck (gas: 0)           truck (gas: 0)
     v                       v                        v
 [0, 2, 0, 0, 0]      [0, 0, 1, 0, 0]       [0, 0, 0, 0, 0]

Здесь, как переходы выглядят в виде графа:

      A
     /|\
    / | \
   B  C  D

Узлы (B), (C) и (D) являются дочерними узлами (A), их родителями, то есть есть доступный переход от родителя к ребенку. Изучение этих детей по одному - это BFS, тогда как в DFS вы выбираете первого ребенка (B) и продолжаете исследовать свой первый ребенок до тех пор, пока он не достигнет листового узла без детей.

Ясно, что (D) является терминальным листовым узлом, потому что у него нет детей (это не цель, у грузовика нет газа, а в лагере у него нет газа, поэтому он застрял, нет доступных переходов для рассмотрения).

Следующим шагом является проверка всех возможных дочерних состояний, доступных узлам (B) и (C). Вот дети из (B):

       (E)                  (F)                   (G)

  truck (gas: 3)             truck (gas: 0)           truck (gas: 0)
  v                          v                        v
 [0, 1, 0, 0, 0]      [0, 0, 1, 0, 0]       [0, 0, 0, 0, 0]

       (H)   

        truck (gas: 0) 
        v         
 [0, 1, 0, 0, 0]   

Теперь график выглядит так:

         A
       / | \
      /  |  \
     /   |   \
    B    C    D
  /|\ \
 / | \ \
E  F  G H

Заметим, что узлы (F) и (G) идентичны (C) и (D) и (E), безусловно, являются наиболее перспективным маршрутом. Несмотря на это, (C) будет следующим расширением, поскольку это BFS, а не DFS. Я пропущу диаграмму, но должно быть ясно, что оба дочерних элемента (C) ((I) и (J)) являются концевыми листовыми узлами (у грузовика будет отсутствовать газ, движется ли он влево или вправо). На этом этапе график выглядит так:

           A
         / | \
        /  |  \
       /   |   \
      /    |    \
     /     |     \
    B      C      D
  /|\ \    |\
 / | \ \   | \
E  F  G H  I  J

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

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

Я надеюсь, что это упражнение сделает алгоритм более ясным; на самом деле, похоже, что (E) находится всего в двух шагах от цели - посмотрите, сможете ли вы найти остальную часть пути вручную.

В реализации имейте в виду, что использование стека (или рекурсивных вызовов) делает DFS, а в очереди - BFS. Кроме того, каждый узел должен иметь свою собственную копию массива "пустыня" или ему потребуется способ отменить его перемещение, если оно недействительно. Наконец, на каждом узле проведите все возможные дочерние элементы, уменьшив количество газа (или добавив 3, если в базовом лагере), и попробуйте как левый, так и правый ходы для каждого из них.

Последний шаг: оптимизация. Следя за уже изученными узлами и избегая их пересчета (это также может быть полезно для избежания бесконечных циклов на графике, которые в данном случае не кажутся проблемой (почему?)), Вы можете пожертвовать местом для хранения и получить скорость. Вы также можете использовать эвристические поиски для дальнейшего повышения скорости, назначая приоритеты более перспективным маршрутам через график.

  • 1
    Проблема в том, что я понятия не имею, чтобы сформулировать их в терминах графа. После прочтения вашего объяснения, и это имеет смысл, спасибо за вашу помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню