TSP问题求解,简单易懂(动态规划法、分支限界法、回溯法)
本文最后更新于 109 天前,其中的信息可能已经有所发展或是发生改变。

温馨提示:本文含有很多公式,若格式没有加载出来,请刷新页面

TSP问题:旅行家要旅行n个城市,每个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。


\begin{pmatrix}\infty\ \ 3\ \ 6\ \ 7\\5\ \ \infty\ \ 2\ \ 3\\6\ \ 4\ \ \infty\ \ 2\\3\ \ 7\ \ 5\ \ \infty \end{pmatrix}

1.动态规划法

对于图G=(V, E),假设从顶点i出发,令V’=V-i,则d(i, V’)表示从顶点i出发经过V’中各个顶点一次且仅一次,最后回到出发点$i$的最短路径长度, 显然,初始子问题是d(k, {}),即从顶点i出发只经过顶点k回到顶点i。现在考虑原问题的一部分,d(k, V’-{k})表示从顶点k出发经过V’-{k}中各个顶点一次且仅一次,最后回到出发点i的最短路径长度,则:

i为子问题起点,V’里就是子问题经过的点,V’里有几个点,min{}里就有几种情况

还不理解,就结合解题过程

解题过程:(括号内内容从下往上看,便于理解,即自底向上思考)

  1. 首先计算初始子问题,可以直接获得:

    d(1, \{ \ \})= c_{10} =5(1→0)

    d(2, \{\ \})= c_{20} =6(2→0)

    d(3, \{\ \})= c_{30} =3(3→0)

  2. 再求解下一个阶段的子问题,有:
    d(1, \{2\})= c_{12}+d(2, \{\ \})=2+6=8(1→2)

    d(1, \{3\})= c_{13}+d(3, \{\ \})=3+3=6(1→3)

    d(2, \{1\})= c_{21}+d(1, \{\ \})=4+5=9(2→1)

    d(2, \{3\})= c_{23}+d(3, \{\ \})=2+3=5(2→3)

    d(3, \{1\})= c_{31}+d(1, \{\ \})=7+5=12(3→1)

    d(3, \{2\})= c_{32}+d(2, \{\ \})=5+6=11(3→2)

    (反过来思考,求从1出发,经过2、3,考虑到所有情况就是先要知道

    从2出发,经过3;或从3出发,经过2。同理,另外两种情况一样考虑)

  3. 再求解下一个阶段的子问题,有:
    d(1, \{2, 3\})=min\{c_{12}+d(2,\{3\}), \ c_{13}+ d(3,\{2\})\}=min\{2+5, 3+11\}=7(1→2)
    d(2, \{1, 3\})=min\{c_{21}+d(1, \{3\}), \ c_{23}+d(3, \{1\})\}=min\{4+6, 2+12\}=10(2→1)
    d(3, \{1, 2\})=min\{c_{31}+d(1, \{2\}),\ c_{32}+ d(2, \{1\})\}=min\{7+8, 5+9\}=14(3→2)

    (反过来思考,求0经过1、2、3,考虑到所有情况就是先要知道

    从1出发,经过2、3;或从2出发,经过1、3;或从3出发,经过1、2)

  4. 直到最后一个阶段,有:
    d(0, \{1, 2, 3\})=min\{c_{01}+ d(1, \{ 2, 3\}), \ c_{02}+ d(2, \{1, 3\}), c_{03}+ d(3, \{1, 2\})\}\ =min\{3+7, 6+10, 7+14\}=10(0→1)

    (反过来思考,这题就是求从0出发,经过中间点1、2、3)

    所以,从顶点0出发的TSP问题的最短路径长度为10,再将状态进行回溯,得到最短路径是0→1→2→3→0。图示如下:


2.分支限界法

题目重抄一下:


\begin{pmatrix}\infty\ \ 3\ \ 6\ \ 7\\5\ \ \infty\ \ 2\ \ 3\\6\ \ 4\ \ \infty\ \ 2\\3\ \ 7\ \ 5\ \ \infty \end{pmatrix}

一般情况下,假设当前已确定的路径为U=(r1, r2, …, rk),即路径上已确定了k个顶点,此时,该部分解的目标函数值的计算方法如下:

lb=(2\sum_{i=1}^{k-1}{c[r_i][r_{i+1}]+\sum_{r_i\in U}{r_i行不在路径的最小元素}}+\sum_{r_j\notin U}{r_j行最小的两个元素})/2

(这个公式理解为:每个城市一进一出都取最小的路,每个城市都选,重复了一遍,所以除以二)

从根结点开始依次计算目标函数值加入待处理结点表中直至叶子结点

算法步骤:

  1. 根据限界函数计算目标函数的下界10;采用贪心法得到上界10;

    (下界:由lb的求解公式,每个节点一进一出都取最小的,相加除以二,所以[(3+3)+(2+3)+(2+2)+(2+3)]/2=10;上界:由贪心法,每次都取最近的路径到下一节点,除了已经经过的节点,初1->2(3最小),再2->3(2最小),再3->4(2最小,且只能到4),最后4->1(3)回起点,3+2+2+3=10)

  2. 计算根结点的目标函数值并加入待处理结点表PT;

  3. 循环直到某个叶子结点的目标函数值在表PT中取得极小值
    3.1 i = 表PT中具有最小值的结点;
    3.2 对结点i的每个孩子结点x执行下列操作:
    3.2.1 估算结点x的目标函数值lb;
    3.2.2 若(lb<=up),则将结点x加入表PT中;否则丢弃该结点;

  4. 将叶子结点对应的最优值输出,回溯求得最优解的各个分量;

题解二叉树:
对于每一个子问题,就是把对应最小的路径替换掉,比如:第4子问题,把从1出替换成1->4,即3替换成了7,其他不变,算得是12

注意:无向图的TSP就直接对于每一个节点,取两个最小的无向路劲

例:下界用限界求得14,上界用贪心求得是16,其他步骤同上


3.回溯法

对于TSP问题,回溯法最后构造的是横向的排列树,如下,解的个数是n!

题目重抄一下:


\begin{pmatrix}\infty\ \ 3\ \ 6\ \ 7\\5\ \ \infty\ \ 2\ \ 3\\6\ \ 4\ \ \infty\ \ 2\\3\ \ 7\ \ 5\ \ \infty \end{pmatrix}

实际画出的解空间树就是上上图n=4的解空间树,边代表问题中的节点,每种情况都走一遍,但一种情况走不通时或不满足条件时,就换兄弟节点走。较为繁琐,略。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇