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):

O X X X
X X
X X
X X

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):

O X X X
X X O X
X X
X X X

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

O X X X
X X O X
X O X X
X X X X

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

O X X X
X X O X
X X X O
X X X

最后剩下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):

O X X X
X X X O
X X X
X X

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

O X X X
X X X O
X O X X
X X X

最后第四个棋子只能放在第三个位置,因此(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​<Si−1​),每个信封最多能贴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=1∑n​ti​Si​,  i=1∑n​ti​≤m

这个问题的输入是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​,⋯,SN​max​  Ns.t.  r=i=1∑n​ti​Si​,  i=1∑n​ti​≤m1≤r≤N

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

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

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

  1. S1=1S_1=1S1​=1, m=3⇒Int(S1)=3m=3 \Rightarrow Int(S_1)=3m=3⇒Int(S1​)=3,因此S2∈{2,3}S_2 \in \{2,3\}S2​∈{2,3},假设更小的数被优先搜索,下面考虑S2=2S_2=2S2​=2;
  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
  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
  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_3S3​和S2S_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​,⋯,Si−1​)−1​,  Si−1​<m2Int(S1​,⋯,Si−1​)−1​

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

  1. S1=1S_1=1S1​=1, m=3⇒Int(S1)=3m=3 \Rightarrow Int(S_1)=3m=3⇒Int(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/3与S2S_2S2​的可能取值比较,发现不符合剪枝条件,假设更小的数被优先搜索,下面考虑S2=2S_2=2S2​=2;
  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算法相关推荐

  1. UA SIE545 优化理论基础1 例题1 常见的凸集

    UA SIE545 优化理论基础1 例题1 常见的凸集 一些例题 在优化理论中,我们主要讨论下面几种凸集: 超平面:{x:pTx=β}\{x:p^Tx=\beta\}{x:pTx=β} 半空间:{x: ...

  2. UA SIE545 优化理论基础 用Farkas定理证明Farkas类的结论

    UA SIE545 优化理论基础 用Farkas定理证明Farkas类的结论 Farkas定理 AAA是一个m×nm\times nm×n的矩阵,下面两个系统有且仅有一个有解: I:Ax≤0,cTx& ...

  3. UA SIE545 优化理论基础 函数凸性的一些有趣的判断方法

    UA SIE545 优化理论基础 函数凸性的一些有趣的判断方法 Convex function f:S→Rf:S \to \mathbb{R}f:S→R where SSS is a nonempty ...

  4. UA SIE545 优化理论基础 例题 对偶函数的凸性与次梯度计算

    UA SIE545 优化理论基础 例题 对偶函数的凸性与次梯度计算 例 考虑对偶函数 θ(u1,u2)=min⁡x12+x22≤4x1(2−u1)+x2(3−u2)\theta(u_1,u_2) = ...

  5. UA SIE545 优化理论基础2 凸函数 概念 理论 总结

    UA SIE545 优化理论基础2 凸函数 概念 理论 总结 凸函数的概念与简单性质 Convex function f:S→Rf:S \to \mathbb{R}f:S→R where SSS is ...

  6. UA SIE545 优化理论基础3 Fritz-John与Kuhn-Tucker理论总结 带等式约束与不等式约束的极值问题

    UA SIE545 优化理论基础3 Fritz-John与Kuhn-Tucker理论总结 带等式约束与不等式约束的极值问题 对于函数f:X→Yf:X \to Yf:X→Y,我们希望XXX是一个凸的度量 ...

  7. UA SIE545 优化理论基础4 对偶理论简介6 求解对偶问题的梯度算法

    UA SIE545 优化理论基础4 对偶理论简介6 求解对偶问题的梯度算法 这一讲我们介绍求解对偶问题的另一个算法--梯度算法(gradient method). 假设原问题为 min⁡x∈Xf(x) ...

  8. UA SIE545 优化理论基础4 对偶理论简介4 求解对偶问题的割平面算法

    UA SIE545 优化理论基础4 对偶理论简介4 求解对偶问题的割平面算法 这一讲我们介绍一个求解对偶问题的算法--割平面算法(cutting plane algorithm). 假设原问题为 mi ...

  9. UA SIE545 优化理论基础4 对偶理论简介3 强对偶

    UA SIE545 优化理论基础4 对偶理论简介3 强对偶 上一讲介绍了弱对偶,弱对偶满足 inf⁡{f(x):x∈X,g(x)≤0,h(x)=0}≥sup⁡{θ(u,v):u≥0}\inf\{f(x ...

最新文章

  1. [Git] 写文章 史上最全文献检索、阅读及管理攻略
  2. ElasticSearch面试 - es 在数据量很大的情况下如何提高查询效率啊?
  3. linux c socket通信
  4. 性能优化篇(4):千万别使用CSS表达式
  5. 01 Spring学习之-事件驱动eventListener
  6. 开源框架相关面试问题-retrofit网络框架面试问题讲解
  7. 跨编程语言平台的通信
  8. Java 神级项目 yyds
  9. verilog语法基础
  10. Keil 系列软件安装(一)Keil C51(Keil4)
  11. 三维电子沙盘数字沙盘虚拟现实无人机倾斜摄影三维全景建模卫星图片矢量
  12. hihocoder题目选讲
  13. mysql information_schema库结构
  14. Expressive Body Capture: 3D Hands, Face, and Body from a Single Image
  15. 嵌入式学习(二)之SoC芯片的开发流程
  16. 用Arduino做一个“空心时钟”(只有表针,没有表盘)
  17. fastAPI简单使用
  18. vue 获取当前路由的title_使用vue-router为每个路由配置各自的title
  19. 0.91寸 SSD1306 OLED介绍(二) --- 命令介绍
  20. html Form表单嵌套

热门文章

  1. 算法导论之概率分析和随机算法
  2. 数据结构源码笔记(C语言):集合的位向量表示
  3. 函数的使用——未完待续
  4. 服务器端会话技术Session|| Session的原理||Session的细节||session的钝化session的活化||session的特点||session与Cookie的区别
  5. 用archoctopus下载花瓣
  6. Windows 技术篇-cmd强制关闭端口、解除端口占用方法,cmd查询端口相关的进程pid并杀死进程实例演示
  7. python 技术篇-时间戳的获取,记录程序处理时间
  8. hdu 2879【留坑】
  9. hdu 1788 Chinese remainder theorem again 【crt的具体过程】
  10. [YTU]_2444(C++习题 对象转换)