专门路径寻路的方法?

我正在用我(非常少的)空闲时间开发一个roguelike游戏。每个关卡基本上都是由一些矩形房间通过路径连接在一起的。我希望房间之间的路径看起来自然且蜿蜒。例如,我不认为以下路径看起来自然:

       B       
       X       
       X       
       X       
      XX       
     XX        
    XX         
  AXX          

我真正想要的是这样的:

       B       
       X       
       XXXX    
          X    
          X    
          X    
          X    
  AXXXXXXXX    

这些路径必须满足以下几个属性:

  1. 我必须能够指定一个区域,它们在这个区域内受到限制。
  2. 我必须能够参数化它们的蜿蜒程度和长度。
  3. 这些线条不应该看起来像它们从一条路径开始并在另一条路径结束。例如,上面的第一个例子看起来好像是从 A 开始并在 B 结束,因为它基本上反复改变方向直到与 B 对齐,然后就直接过去了。

我本来希望使用 A* 算法,但老实说,我不知道我的启发式函数应该是什么。我也考虑过使用遗传算法,但我不知道这种方法最终会有多实用。

我的问题是,有什么好的方法可以得到我想要的结果?请不要仅仅指定一种方法,如“A*”或“Dijkstra 算法”,因为我还需要关于一个好的启发式函数的帮助。


回答:

在你弄清楚如何生成路径之前,你必须找到一种更精确的方式来表达你想要什么。一种方法是给每个路径分配一个分数,然后搜索高分路径。以下是一些需要考虑的问题:

  1. 你更喜欢长的直线段还是短的?你将如何量化这种偏好?(为了让搜索算法收敛,如果你的评分函数是非线性的,将会更容易。)

  2. 如果你不想直接到达目的地,你可能想奖励那些偏离主线的步骤。例如,在从 A 到 B 的路径上,考虑每个点,然后走三步并计算点之间的方向。现在取该方向与从 A 到 B 的直线方向的余弦值。取其负数。在线上的步骤对你来说算作 -1,垂直的步骤是中性的,而偏离线的步骤对你来说算作 +1。

以下是一些好的后续步骤:

  • 想出更多评分的想法。
  • 手工绘制十几个路径,并根据你喜欢的程度对它们进行排序。
  • 对于每个路径,手工创建几个小的变体。
  • 在所有路径上运行你的评分函数。不断调整,直到你得到一个评分函数,它喜欢喜欢的东西。

然后你就可以开始考虑搜索算法了。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注