修改AStar算法以逻辑方案连接门

时间:2015-07-02 22:36:00

标签: java algorithm android-canvas a-star

我一直在研究逻辑方案模拟器。整个过程非常有效,但有一个问题似乎无法解决。

逻辑方案中的连接应该是垂直和水平的。它们应该避开逻辑门并尽可能少地转动(避免阶梯效应)。连接也可以相交,但它们永远不会重叠。

我使用AStar算法找到两个逻辑门之间最短和最好的路径。寻路的启发式是曼哈顿距离,而两个节点之间的成本是画布上单个方块的尺寸。

整个问题出现在两个条件之间。 “Min转”和“没有重叠”。我通过在尝试转弯时以正常成本加倍来惩罚算法来解决“最小转弯”问题。这导致算法将所有转弯推迟到导致我下一张图片的最新可能时刻。

The issue!

我没有重叠的条件是禁止第二个输入连接到AND门的第二个空闲输入(注意:模拟器是针对Android制作的,输入数量是可变的,这就是为什么输入彼此接近的原因)。像这样的情况迟早会发生,但我想尽可能晚地做出来。

我试过:

  • 介绍“int turnNumber”来计算到目前为止已经完成了多少次转弯并且惩罚了转弯太多的路径。 (算法需要很长时间才能完成,有时非常长)
  • 计算从开始到结束的曼哈顿距离。将该数除以2,然后从启发式接近中间的节点中删除“双倍成本”惩罚。 (对于某些情况,算法陷入无限循环)

有没有关于如何在中间重新分配转弯的想法,以便尽可能多地在逻辑门之间建立连接,同时仍然满足“转弯”条件?

如果您想查看代码:https://gist.github.com/linaran/c8c493bb54cfca764aeb

注意:我正在使用的画布没有限制。 编辑:计算成本和启发式的方法是 - “calculateCost”和“manhattan”

1 个答案:

答案 0 :(得分:0)

<强> 1。你写道,你已经尝试过交换开始/结束位置

  • 但我的胆量告诉我你是否计算从 Out
  • 的路径
  • 然后转弯接近输出,这在大多数情况下是正常的,因为大多数盖茨都有单输出。

<强> 2。无论如何,我会改变你的转弯成本政策:

  • P0,P1成为路径端点
  • Pm=(P0+P1)/2成为中间点
  • 所以你希望转弯尽可能接近中点
  • 因此,将费用tc更改为与Pm
  • 的距离相关
  • tc(x,y)=const0+const1*|(x,y)-Pm|
  • 应该做的伎俩(但我没有对此进行测试,因此存在偏见)
  • 它可以创造一些奇怪的模式,所以尝试欧几里德和曼哈顿距离
  • 并选择了效果更佳的
  • enter image description here

第3。另一种方法是

  • 立即从起点和终点填充地图
  • 当他们见面时停止
  • 您需要区分开始和结束点的成本
  • 因此要么使用负数表示星号,要么使用正数值作为终点原点
  • 或分配两者的范围(范围应大于地图尺寸xs * ys in cells / pixels)
  • 或向地图单元格内的成本添加一些标记值

<强> 4。你可以将1.和2.混合在一起

  • 所以计算Pm
  • 找到离Pm最近的自由点,并将其设为P2
  • 并解决路径P0->P2P1->P2
  • 所以转弯将接近P2,接近Pm

<强> [注释]

  • 第3种方法是最强大的方法,应该会产生预期的结果