欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

UA SIE545 优化理论基础5 搜索与整数规划1 DFS算法

发布时间:2025/4/14 编程问答 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 UA SIE545 优化理论基础5 搜索与整数规划1 DFS算法 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

UA SIE545 优化理论基础5 搜索与整数规划1 DFS算法

  • DFS方法基础
  • 邮票问题

这部分的主要目标是建立求解整数规划的方法,早期解决整数规划需要穷举,后来人们把搜索技术应用到整数规划中,极大地提高了整数规划求解地效率,最常被用到的两种技术是DFS和分支定界,所以这部分就从这两种技术开始介绍,然后讨论怎么用来解决整数规划问题。

DFS方法基础

DFS全称是Depth First Search,也就是深度优先搜索。这个算法思路很简单,就是莽就完了,但莽的时候要记录莽过的路径,下一个位置不符合要求就可以退回来重新莽。下面用一个简单的例子说明,假设在一个4×44\times 44×4的棋盘上要放四个棋子,每两个棋子不能位于同一行同一列同一对角线,要计算所有的放法。

首先讨论一下穷举法,在4×44 \times 44×4的棋盘上放四个棋子的放法一共有44=2564^4=25644=256种,因此用穷举法需要对256种可能性进行判断。(如果我是随便做做估计就穷举了,毕竟不用动脑筋而且运算量也不大)但显然用穷举来做估计是拿不到分的,我们要根据题目的限制条件来做搜索。

简单阐述一下DFS解决这个问题的思想。假设第一个棋子放在第一行,第二个放在第二行,以此类推,用i,j,k,li,j,k,li,j,k,l表示第1-4行的棋子的位置。第一步,考虑(1,j,k,l)(1,j,k,l)(1,j,k,l):

OXXX
XX
XX
XX

O代表对应位置放上了棋子,X代表对应位置不能再放棋子了。从这个图可以看出,i=1i=1i=1,也就是第一个棋子放在第一行第一个位置以后,第二个棋子只能在j=3,4j=3,4j=3,4的位置,假设优先搜索靠左的位置,接下来我们考虑(1,3,k,l)(1,3,k,l)(1,3,k,l)

OXXX
XXOX
XX
XXX

现在放第三个棋子,显然它只能在k=2,4k=2,4k=2,4的位置,接下来就考虑(1,3,2,l)(1,3,2,l)(1,3,2,l):

OXXX
XXOX
XOXX
XXXX

于是路就走不通了,第四个棋子没位置了,那么我们退回去,考虑(1,3,4,l)(1,3,4,l)(1,3,4,l):

OXXX
XXOX
XXXO
XXX

最后剩下l=2l=2l=2这个位置,它是符合要求的,那么(1,3,4,2)(1,3,4,2)(1,3,4,2)就构成了第一条通路。现在我们记录下通路的信息,然后回到第二个棋子处,考虑(1,4,k,l)(1,4,k,l)(1,4,k,l):

OXXX
XXXO
XXX
XX

第三个棋子没得选,那就放在第二个位置

OXXX
XXXO
XOXX
XXX

最后第四个棋子只能放在第三个位置,因此(1,4,2,3)(1,4,2,3)(1,4,2,3)构成了第二条通路。这样我们就完成了i=1i=1i=1的所有搜索,下面的步骤就是对i=2,3,4i=2,3,4i=2,3,4做同样的搜索。

邮票问题

邮局发行了一套有nnn种不同面值的邮票,记面值为(S1,⋯,Sn)(S_1,\cdots,S_n)(S1,,Sn)Si<Si−1S_i < S_{i-1}Si<Si1),每个信封最多能贴mmm张邮票,为了保证这套邮票可以贴出(1,2,⋯,N)(1,2,\cdots,N)(1,2,,N)这些面值,请问面值应该怎么设计?

假设rrr是一个自然数,如果它是能被这套邮票表示的面值,那么∃{t1,⋯,tn}⊂N\exists \{t_1,\cdots,t_n\} \subset \mathbb{N}{t1,,tn}N,
r=∑i=1ntiSi,∑i=1nti≤mr = \sum_{i=1}^n t_i S_i,\ \ \sum_{i=1}^nt_i \le mr=i=1ntiSi,  i=1ntim

这个问题的输入是n,mn,mn,m,输出是(S1,⋯,Sn)(S_1,\cdots,S_n)(S1,,Sn)以及NNN,要实现的是
max⁡S1,⋯,SNNs.t.r=∑i=1ntiSi,∑i=1nti≤m1≤r≤N\max_{S_1,\cdots,S_N} \ \ N \\ s.t. \ \ r = \sum_{i=1}^n t_i S_i,\ \ \sum_{i=1}^nt_i \le m \\ 1 \le r \le NS1,,SNmax  Ns.t.  r=i=1ntiSi,  i=1ntim1rN

这是一个典型的整数规划问题,下面我们简单讨论一下怎么用DFS的思想解这个问题。先考虑搜素范围,显然
1=S1<S2<S3<⋯<Sn≤N1 = S_1 < S_2 < S_3 < \cdots < S_n \le N 1=S1<S2<S3<<SnN

在搜索SiS_iSi的可能取值时,要保证SiS_iSi不会大于能用前i−1i-1i1个面值的邮票连续表示的最大整数,记为Int(S1,⋯,Si−1)Int(S_1,\cdots,S_{i-1})Int(S1,,Si1),也就是
Si−1<Si≤Int(S1,⋯,Si−1)S_{i-1}<S_i \le Int(S_1,\cdots,S_{i-1})Si1<SiInt(S1,,Si1)

按这个记号,N=Int(S1,⋯,Sn)N=Int(S_1,\cdots,S_{n})N=Int(S1,,Sn)。下面以n=5n=5n=5,m=3m=3m=3为例说明一下搜索过程:

  • S1=1S_1=1S1=1, m=3⇒Int(S1)=3m=3 \Rightarrow Int(S_1)=3m=3Int(S1)=3,因此S2∈{2,3}S_2 \in \{2,3\}S2{2,3},假设更小的数被优先搜索,下面考虑S2=2S_2=2S2=2
  • Int(S1,S2)=6Int(S_1,S_2)=6Int(S1,S2)=6,因此S3∈{3,4,5,6}S_3 \in \{3,4,5,6\}S3{3,4,5,6},下一步考虑S3=3S_3=3S3=3
  • Int(S1,S2,S3)=9Int(S_1,S_2,S_3)=9Int(S1,S2,S3)=9,因此S4∈{4,5,6,7,8,9}S_4 \in \{4,5,6,7,8,9\}S4{4,5,6,7,8,9},下一步考虑S4=4S_4=4S4=4
  • Int(S1,S2,S3,S4)=12Int(S_1,S_2,S_3,S_4)=12Int(S1,S2,S3,S4)=12,因此S5∈{5,6,7,8,9,10,11,12}S_5\in \{5,6,7,8,9,10,11,12\}S5{5,6,7,8,9,10,11,12},如果S5=5S_5=5S5=5,则N=15N=15N=15。这就拿到了第一种可能面值为(1,2,3,4,5)(1,2,3,4,5)(1,2,3,4,5),三张邮票能表示的最大面值为15,记录下这个信息后转到S5=6S_5=6S5=6,计算得到N=16N=16N=16,记录这个信息后转到S5=7S_5=7S5=7,以此类推,讨论完S5S_5S5的所有可能性后回到S4S_4S4的其他可能,然后再回到S3S_3S3S2S_2S2的其他可能
  • Lunnon(1969)修正了这个算法,提出在搜索SiS_iSi的取值时可以先进行剪枝操作再搜索,可以降低算法复杂度。他认为
    Si<Int(S1,⋯,Si−1)−1m,Si−1<Int(S1,⋯,Si−1)−1m2S_i<\frac{Int(S_1,\cdots,S_{i-1})-1}{m},\ \ S_{i-1}<\frac{Int(S_1,\cdots,S_{i-1})-1}{m^2}Si<mInt(S1,,Si1)1,  Si1<m2Int(S1,,Si1)1

    这两个分支可以剪掉。沿用上面的数值例子,引入剪枝操作,简单说明一下搜索过程:

  • S1=1S_1=1S1=1, m=3⇒Int(S1)=3m=3 \Rightarrow Int(S_1)=3m=3Int(S1)=3,因此S2∈{2,3}S_2 \in \{2,3\}S2{2,3},计算Int(S1)−1m=2/3\frac{Int(S_1)-1}{m}=2/3mInt(S1)1=2/3S2S_2S2的可能取值比较,发现不符合剪枝条件,假设更小的数被优先搜索,下面考虑S2=2S_2=2S2=2
  • Int(S1,S2)=6Int(S_1,S_2)=6Int(S1,S2)=6,因此S3∈{3,4,5,6}S_3 \in \{3,4,5,6\}S3{3,4,5,6},计算Int(S1,S2)−1m=5/3\frac{Int(S_1,S_2)-1}{m}=5/3mInt(S1,S2)1=5/3,与S3S_3S3的可能取值比较,不符合剪枝条件;计算Int(S1,S2)−1m2=5/9\frac{Int(S_1,S_2)-1}{m^2}=5/9m2Int(S1,S2)1=5/9,与S2S_2S2的可能取值比较,不符合剪枝条件,下一步考虑S3=3S_3=3S3=3
  • 后续步骤以此类推,我就不打字详细说明了。

    总结

    以上是生活随笔为你收集整理的UA SIE545 优化理论基础5 搜索与整数规划1 DFS算法的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。