Мне нужна помощь при написании алгоритма упругого преобразования (построения графика). Вот проблема:Алгоритм построения графа, заданный бесконечным ходом
Представьте, что у вас есть текстовая виртуальная реальность (TORG/MUD), где вы можете отправлять команды перемещения (n, s, w, e, вверх, вниз, в, из ... и т. Д.), через telnet для перемещения вашего персонажа из комнаты в комнату. И сервер отправляет соответствующее описание комнаты после каждого шага движения. Ваша задача состоит в том, чтобы сгенерировать граф, который представляет основную структуру карты, чтобы вы могли просто сделать DFS на стороне клиента, чтобы выяснить, как добраться из одной комнаты в другую. Кроме того, вы хотите, чтобы спроектировать систему так, чтобы вход минимум пользователя требуется
Вот предположения:
Основная топология графа на сервере никогда не изменится.
Описание номеров не уникально. Большинство номеров имеют различные описания, но некоторые номера имеют то же самое описание. Описание комнаты меняются несколько раз в то время (дни или недели)
Ваше движение может произойти случайным образом с небольшой вероятностью, и вы получите сообщение об ошибке вместо нового описания комнаты, например «Вы остановитесь, чтобы подождать для прохождения вагона »,« Дверь заперта », и ваш персонаж все еще будет в текущей комнате.
Вы не можете взять единичное расстояние для каждого движения. Например, у вас может быть топология, подобная той, что показана ниже, поэтому, если предположить, что расстояние в одной комнате для каждой соседней комнаты и назначить жесткую координату для каждой комнаты, это не сработает. Однако вы можете предположить, что относительное направление должно быть последовательным, то есть не будет петли в топологическом виде вдоль X (запад, восток) и Y (юг, север).
Цель: при назначении адресата, который вы посетили ранее, алгоритм гарантирует, что в конечном итоге переместит вас в это место, и в большинстве случаев найдет самый короткий путь. Ошибки допускаются, но алгоритм должен иметь возможность обнаруживать и исправлять ошибки «на лету».
Пример граф:
A--B---B
| | <- k
C--D-E-F
Я уже реализован очень простое решение, которое было бы записать описание комнаты и построить график. Ниже приведен пример представления графа, который моя программа генерирует в json. «Выходы» - это направление движения, отображаемое на идентификатор узла. -1 представляет собой не отображаемую комнату. Если пользователь идет в направлении и обнаруживает -1 в представлении графика, алгоритм попытается найти узлы, уже находящиеся на графике. Если узлы с тем же описанием будут найдены, он предложит пользователю решить, является ли вновь увиденное помещение одним из старых узлов. Если нет, он добавляет новый узел и связывает его с графиком.
"node": [
{
"description": "You are standing in the heart of the Example city. There is a fountain with large marble statue in it...",
"exits": {
"east": -1,
"north": 31,
"south": 574,
"west": 42
},
"id": 0,
"name": "cot",
"tags": [],
"title": "Center of Town",
"title_color": "\u001b[1m\u001b[36m Center of Town\u001b[0;37;40m"
},
{
...
Это простое решение требует, чтобы при построении графика выполнялись циклы обнаружения входа человека. Например, на приведенном выше графике предполагается, что одни и те же буквы представляют собой одинаковые описания комнат. Если вы начнете отображать на первом B, а затем влево, вниз, вправо ... до тех пор, пока вы не выполните движение k, теперь вы снова увидите B, но картограф не может определить, является ли это тем, что он видел раньше.
Короче говоря, я хочу написать алгоритм построения гибкого графа, который совершает прогулку (возможно, бесконечную) в скрытом целевом графе и генерирует (и продолжает обновлять) график, который может (надеюсь) схож с целевым граф.Затем мы используем сгенерированный граф для навигации по целевому графику. Существует ли существующий алгоритм для этой категории проблем?
Я также подумал о применении некоторых методов машинного обучения к этой проблеме, но я не могу написать конкретную модель. Я подумываю о том, чтобы определить список функций для каждой комнаты, которую мы видим (описание комнаты, выходы, соседние узлы), и каждый раз, когда мы видим комнату, мы пытаемся найти узел графа, который наилучшим образом соответствует функциям, и основывается на некоторое правило обновления (например, Winnow или Perceptron) обновляет описание, которое мы видим на основе некоторых показателей обнаружения ошибок.
Любые мысли/предложения были бы очень признательны!