专门寻路的方法?

时间:2009-04-25 22:30:55

标签: language-agnostic artificial-intelligence genetic-algorithm path-finding a-star

我正在我(很少)的空闲时间里做一个roguelike。每个级别基本上是由路径连接在一起的几个矩形房间。不过,我希望房间之间的路径看起来很自然。例如,我不会考虑以下看起来很自然:

       B       
       X       
       X       
       X       
      XX       
     XX        
    XX         
  AXX          

我真的想要更像这样的东西:

       B       
       X       
       XXXX    
          X    
          X    
          X    
          X    
  AXXXXXXXX    

这些路径必须满足一些属性:

  1. 我必须能够指定一个区域,
  2. 我必须能够参数化它们的风和冗长,
  3. 这些线条不应该看起来像是从一条路径开始,而是在另一条路径上结束。例如,上面的第一个示例看起来好像是从A开始并在B处结束,因为它基本上反复改变方向,直到它与B对齐,然后直接在那里。
  4. 我希望使用A *,但说实话,我不知道我的启发式是什么。我也考虑过使用遗传算法,但我不知道这种方法最终会有多实用。

    我的问题是,获得我想要的结果的好方法是什么?请不要只指定像“A *”或“Dijkstra算法”这样的方法,因为我还需要一个良好的启发式方法的帮助。

3 个答案:

答案 0 :(得分:4)

在你弄清楚如何制作路径之前,你必须找出一种更精确的方式来陈述你想要的东西。一种方法是为每条路径分配一个分数,然后搜索高分路径。以下是一些需要考虑的问题:

  1. 您喜欢长直道跑道吗?你如何量化这种偏好? (要使搜索算法收敛,如果您的评分函数是非线性的,将会更容易。)

  2. 如果您不想直接前往目的地,您可能需要奖励主线以外的步骤。例如,在从A到B的路径上,考虑每个点,然后采取三个步骤并计算点之间的方向。现在取该方向差异的余弦和从A到B的方向。否定它。线上的步数-1对你而言,垂直的步数是中性的,并且距离线数+1的步数为你。

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

    • 想想更多得分的想法。
    • 手工绘制十几条路径,按照你喜欢的程度对它们排序。
    • 对于每条路径,请手动创建几个小变化。
    • 在所有路径上运行您的评分功能。继续摆弄,直到你得到喜欢喜欢的评分函数。

    然后您将准备考虑搜索算法。

答案 1 :(得分:1)

我认为寻路是一个错误的术语:通常涉及找到从A到B的有效路线,而你的问题不在于找到那条路线,而在于创建适合你目的的路线。您故意创建次优路径,其质量难以量化。因此,我不认为具有任何启发式的搜索算法将是该问题的最佳解决方案。如果您有一个强制性标准(工作路径)和一些模糊的,未定义的标准(自然观察和缠绕),最好从满足强制性要求开始,并尝试将其变为其他要求。这样你总会有一些有用的东西。

我建议,鉴于您似乎更喜欢水平和垂直路径以直角转弯,从A到B的直线2段路径开始。(A *与曼哈顿距离启发式可以找到这个,但是你自己就这么容易了。)然后沿着两个分段中的一个和该分段的两个端点之一取一个随机点,并将该线的该分段平行移动一段随机距离。然后添加2个额外的线段以将线的新位置连接到旧连接点。你的第二个例子显示了这个算法的一次迭代:如果A是(0,0)而B是(5,7)那么你随机选择第二个线段(垂直线段),在(0,5)选择端点)和(5,5)的中点,然后将该部分向右推3个单位,然后重新加入。

答案 2 :(得分:0)

这是一个想法---

从A开始并沿着随机方向移动 - 向左,向上或向下。每次移动后,滚动一个随机数以查看您是否转动。让我们说75%的时间你继续朝着同一个方向旅行,25%的时间你会转向。当你转弯时,总是转向更靠近B的方向。这意味着如果你向左或向右移动,你将不得不向上,如果你向上移动,做出一个向右/向左的选择根据你目前在球门右侧或左侧的距离。此外,如果你击中世界的一个边界,转过来!

编码应该不会太难。我有一种感觉,你只是想让它变得比它需要的更复杂......