我一直在研究逻辑方案模拟器。整个过程非常有效,但有一个问题似乎无法解决。
逻辑方案中的连接应该是垂直和水平的。它们应该避开逻辑门并尽可能少地转动(避免阶梯效应)。连接也可以相交,但它们永远不会重叠。
我使用AStar算法找到两个逻辑门之间最短和最好的路径。寻路的启发式是曼哈顿距离,而两个节点之间的成本是画布上单个方块的尺寸。
整个问题出现在两个条件之间。 “Min转”和“没有重叠”。我通过在尝试转弯时以正常成本加倍来惩罚算法来解决“最小转弯”问题。这导致算法将所有转弯推迟到导致我下一张图片的最新可能时刻。
我没有重叠的条件是禁止第二个输入连接到AND门的第二个空闲输入(注意:模拟器是针对Android制作的,输入数量是可变的,这就是为什么输入彼此接近的原因)。像这样的情况迟早会发生,但我想尽可能晚地做出来。
我试过:
有没有关于如何在中间重新分配转弯的想法,以便尽可能多地在逻辑门之间建立连接,同时仍然满足“转弯”条件?
如果您想查看代码:https://gist.github.com/linaran/c8c493bb54cfca764aeb
注意:我正在使用的画布没有限制。 编辑:计算成本和启发式的方法是 - “calculateCost”和“manhattan”
答案 0 :(得分:0)
<强> 1。你写道,你已经尝试过交换开始/结束位置
<强> 2。无论如何,我会改变你的转弯成本政策:
P0,P1
成为路径端点Pm=(P0+P1)/2
成为中间点tc
更改为与Pm
tc(x,y)=const0+const1*|(x,y)-Pm|
第3。另一种方法是
<强> 4。你可以将1.和2.混合在一起
Pm
Pm
最近的自由点,并将其设为P2
P0->P2
和P1->P2
P2
,接近Pm
<强> [注释] 强>