我想知道是否有针对TSP的分支和绑定算法的有用Java实现,或者通常是包含TSP的BnB的OR框架。
感谢您的帮助!
马
答案 0 :(得分:2)
BnB通常与完整的子问题解决方案进行交互:
best_cost_soln_so_far = +inf
while (better_cost_soln = search_for_soln_cheaper_than(best_cost_soln_so_far))
{
best_cost_soln_so_far = better_cost_soln
backtrack_into_search
}
也就是说,只要探索的任何部分解决方案的成本超过best_cost_soln_so_far
设置的边界,您的子问题搜索就会回溯。如果子问题搜索 找到更好的解决方案,则best_cost_soln_so_far
会更新,并且搜索从中断处继续,寻找更好的解决方案。这很容易实现。
那就是说,我非常怀疑你是否想要使用完整搜索来处理大型TSP,因为涉及的搜索空间很大;你可以用模拟退火等近似技术做得更好。
答案 1 :(得分:0)
虽然我们都知道"Java and Javascript are similar like Car and Carpet are similar",但我建议您查看SimplexJS这是一个用Javascript编写的简单线性和MIP求解器。由于它很小(少于400个LOC),因此可以很容易地转换为Java。该项目的作者也有一个很好的例子Solving TSPs with Integer Programming。
答案 2 :(得分:0)
OptaPlanner(开源,Java)有一个Branch and Bound实现。 See the docs section about BaB specifically.算法的实施从this class开始,但很难遵循。
它还有一个TSP示例:虽然默认情况下没有配置BaB,但通过这样调整tspSolverConfig.xml
可以做到这一点很简单:
<solver>
...
<exhaustiveSearch>
<exhaustiveSearchType>BRANCH_AND_BOUND</exhaustiveSearchType>
</exhaustiveSearch>
</solver>
还有额外的可选参数来控制节点排序,节点探索方式等。