为分支创建特里(或树)并绑定多个TSP

时间:2015-07-11 00:30:56

标签: javascript algorithm math graph-algorithm trie

我正在努力提高我的伪分支和速度。约束算法我认为特里结构可能很合适,但我被卡住了。

问题(我可以简化和隔离):

我有9个节点& 3辆车。每辆车必须访问3个独特的节点。所以,我创造了每一个可能的旅行(9选择3 = 84)&把它粘在一个数组中。现在,我想找到每一个组合。 例如,旅程1可以是111000000。行程2为000110001,行程3为000001110。 (84 ^ 3 = 592704组合)。 为了确定它们是否匹配,我只是按位&并接受行程组合,如果值为0。

我不能使用嵌套循环,因为车辆的数量可能会发生变化,因此我会跟踪一个计时器的组合,这个计数器像里程表一样深度上升(例如0,0,820,0,830,1,0)。

我通过保持以下数字大于刚增加的数字来减少组合(例如11,83,83转到12,13,14,因为第二列中小于12的任何数字都是重复的例如12,1,11,1,12}的副本。

我还在每次更改时执行按位AND检查(例如,如果(val[12] & val[13]) > 0不打扰检查第3列中的71种可能性,因为12和13使路由无效。这会将组合减少到24720。

由于我正在做深度优先,它真的是节省空间(没有队列可以保存),但计算成本很高。我想要做的是使用宽度优先方法来创建子集并最小化搜索空间。例如,假设计数器位于11,19,20。目前,在将第19列增加到20之前,它将检查第3列中的20-83。我想在继续之前计算第2列中19-83的AND。在这样做的时候,我会知道第一列中不适用于11的所有值,并且可以将该子数组用于第3列(例如,如果(val[11] & val[45]) > 0,则不要打扰检查{ {1}},而是使用从第3列中排除45的数组。

我的想法是创建一个trie,其中每个键都是AND操作的结果,使用11 & 19 & 45键作为子数组。

例如:

end

我的问题是我不能为我的生活弄清楚如何迭代我的数据来增长trie。或者可能有更好的方法?任何建议或代码片段都会很棒,感谢您阅读文本墙。

0 个答案:

没有答案