递归、回溯-旅行售货员问题

该博客介绍了如何使用递归和回溯算法解决旅行售货员问题,即寻找从1号城市出发,遍历所有城市并返回1号城市的最短路径。在递归算法Backtrack中,通过构建排列树并检查路径费用,找到最优解。算法的时间复杂度为O(n!)。
摘要由CSDN通过智能技术生成

某售货员到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条路线,经过每个城市一遍最后回到驻地的路线,使得总的路程(或总旅费)最小(默认从1号城市开始)。

输入:城市的数目n,城市a,b,以及其之间的路程d。

输出:最短的路程,最短的路径方案。

运行结果:

旅行售货员问题的解空间是一颗排列数,对于排列数的回溯搜索与生成1,2,...,n的所有排列的递归算法Perm类似。开始时x=[1,2,...n]。则相应的排列树由x[1:n]的所有排列构成。

在递归算法Backtrack中,当i=n时,当前扩展结点是排列树的叶结点的父结点。此时算法检测图G是否存在一条从顶点x[n-1]到顶点x[n]的边和一条从顶点x[n]到顶点1的边,如果这两条边都存在,则找到一条旅行售货员回路。此时,算法还需判断这条回路的费用是否优于已找到的当前最优回路的费用bestc。如果是,则必须更新当前最优值bestc和当前最优解bestx。

当i<n时,当前扩展结点位于排列数的第i-1层,图G中存在从顶点x[i-1]到顶点x[i]的边时,x[1:i]构成图G的一条路径,且当x[1:i]的费用小于当前最优值时算法进入排列树的第i层,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值