图形构建算法给出了无限的步行

时间:2017-01-10 03:24:08

标签: graph machine-learning mapping graph-algorithm mud

我需要帮助编写弹性的映射(图形构建)算法。这是问题所在:

想象一下,你有一个面向文本的虚拟现实(TORG / MUD),你可以通过telnet发送移动命令(n,s,w,e,up,down,in,out ......等)来移动你的角色从房间到房间。并且服务器在每个移动步骤之后发回相应的房间描述。您的任务是生成一个表示底层地图结构的图形,这样您就可以在客户端执行DFS,以确定如何从一个房间到另一个房间。您还想设计系统,以便需要最少的用户输入

以下是假设:

  • 服务器上的基础图拓扑永远不会改变。

  • 房间描述不是唯一的。大多数房间都有不同的描述,但有些房间的描述完全相同。房间描述每隔一段时间(几天或几周)稍有变化

  • 您的动作可能会以较小的概率随机失败,您将收到错误消息而不是新房间描述,例如“您停下来等待货车通过”,“门被锁定” ,你的角色仍然在当前的房间里。

  • 您不能假设每个动作的单位空间距离。例如,您可能具有如下所示的拓扑,因此假设每个相邻房间的单位距离并为每个房间分配硬坐标不起作用。但是,您可以假设相对方向是一致的,即沿X(西,东)和Y(南,北)的拓扑排序中没有循环。

  • 目标:给定您之前访问过的目的地,算法保证最终将您移动到该位置,并且大多数时间都会找到最短路径。允许出现错误,但算法应能够即时检测并纠正错误。

示例图:

A--B---B
|      | <- k
C--D-E-F

我已经实现了一个非常简单的解决方案,可以记录房间描述并构建图表。以下是我的程序在json中生成的图形表示的示例。 “退出”是映射到节点id的移动方向。 -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,但是映射器无法确定它是否是之前看到的B.

简而言之,我希望能够编写一个弹性图形构建算法,该算法在隐藏目标图形中进行步行(可能是无限的)并生成(并保持更新)可以(希望)与目标图形相似的图形。然后,我们使用生成的图形来帮助在目标图中导航。是否存在针对此类问题的现有算法?

我还考虑过将一些机器学习技术应用于这个问题,但我无法写出具体的模型。我正在考虑为我们看到的每个房间(房间描述,出口,相邻节点)定义功能列表,每次我们看到房间时,我们都会尝试找到最适合功能的图形节点,并基于一些更新规则(如Winnow或Perceptron)会根据一些错误检测指标更新我们看到的描述。

非常感谢任何想法/建议!

1 个答案:

答案 0 :(得分:0)

许多MU *会为您提供获取房间唯一标识符的方法。 (关于MUSH及其分支,即think %L。)其他人可能会设置为以缩写形式描述您已去过的房间。如果没有,您需要一些方法来确定您之前是否曾在一个房间。一种简单的方法是计算关于每个房间的足够信息的散列以获得唯一密钥。但是,可能会故意设置迷宫,以诱使您认为自己位于不同的位置。 巫术特别是设计用于让老派玩家在他们意识到他们的地图出错时将他们的头发撕掉,并且 Zork 系列有一个你在其他地方放置的物品,你在迷宫中标记你的位置时会被移动。在实践中,编写工具来解决这些谜题是不值得的。

您应该能够记住所有对最短路径的表并更新它以匹配您在搜索新出口时探索过的子图。这可以实现为 N × N 表,其中行 i ,列 j 告诉您下一步从位置 i 到位置 j 的最短路径。通常,对于有向图。即使每次运行Dijkstra算法都应该足够,但实际上每次移动都会为地图增加一个空间,并且不会在许多其他房间之间添加更短的路径。您可能希望自动映射您已经存在的房间之间的连接(除非它们应该被隐藏)并且不要强迫资源管理器繁琐地遍历每个单独的出口并返回以查看它的位置。

如果你可以设计地图,你也可以布置这些区域,以便它们之间易于导航,然后你可以保持你的桌子很小:每个只需要包含你故意放置的各个区域的地图作为迷宫探索。也就是说,如果你想从一个地下城转到另一个地牢,你只需要查看最近的出口,然后查看世界地图上的地牢之间的方向,而不是一个与整个地点的数量成比例增长的巨大的桌子。游戏。例如,如果您将世界布局为嵌套层次结构,其中房间位于行星上某个国家/地区的城市中某个街区的街道上的建筑物中,则您可以将位置存储为一棵树,从一个区域导航到另一个区域只需要走到树上,直到你到达目的地的路径上的一个分支。

我不确定神经网络或其他机器学习如何在这里有所帮助;如果您正在寻找的那种技巧可能是一个看起来与您之前看到的相同的房间真的是重复的,那么处理这个问题的方法就是一次性维护多个可能的地图。假设明显相同的房间是重复的,是一个分叉路径的花园。