NOI导刊 搜索顺序的选取与剪枝策略_第1页
NOI导刊 搜索顺序的选取与剪枝策略_第2页
NOI导刊 搜索顺序的选取与剪枝策略_第3页
NOI导刊 搜索顺序的选取与剪枝策略_第4页
NOI导刊 搜索顺序的选取与剪枝策略_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、搜索的剪枝 策略与搜索对象、搜索顺序的选择,条件1:v = n h = m 层 形状:每层都是一个圆柱体。 条件2: 设从下往上数第i(1ri+1且hihi+1。 条件3: 表面积q最小,令q= s 问题: 给出的n和m, 找出蛋糕的制作方案(适当的ri和hi的值),使s最小。 (除q外,以上所有数据皆为正整数) 输入 n (n=10000), m (m=20) 输出 s(若无解则s=0,圆柱公式 v=r2h s侧=2rh s底=r2,生日蛋糕(noi99,解析法,转变思路,搜索,数据库 用( i , ri , hi , vi , si )表示第i层蛋糕的一个状态。其中ri ,hi分别为第i层

2、蛋糕的半径和高,vi , si分别表示做完第i层蛋糕后剩下的蛋糕体积和当前蛋糕的表面积。可见, 初始状态:(1,r1,h1,n-r1*r1*h1,r1*r1+2*r1*h1) 目标状态:(m,rm,hm,0,sm) 于是,我们的目标是找到一条从初始状态到任意目标状态的路径,并且sm最小. 扩展的规则 ( i , ri , hi , vi , si ) ( i+1,ri+1,hi+1,vi+1,si+1) 满足: (1) ri ri+1 (2) hi hi+1 (3) vi+1 = vi - ri+1* ri+1* hi+1 (4) si+1 = si + 2 * ri+1* hi+1,确定第一

3、层蛋糕的大小 根据上一层蛋糕的大小确定下一层蛋糕该怎么做 看是否符合条件 1)是否做到了m层 2)是否最终体积为0 3)是否当前面积最小 若上述条件成立,则保留当前最优值,否则继续做下一层蛋糕,若重做蛋糕,基本算法,search (i, ri , hi , si , vi) 对每层蛋糕进行搜索 if (i=m) and (vi =0) then 更新最优值 else for ri + 1ri -1 downto i for hi + 1hi -1 downto i si + 1si + 2 * ri + 1* hi + 1 vi + 1vi - ri + 1* ri + 1* hi + 1 s

4、earch ( i+1, ri + 1, hi + 1, si + 1,vi + 1) problem-cake 枚举所有的初始状态 - 第一层蛋糕的大小 for r1m to sqrt ( n ) do /*假设 h1=1,只做一层蛋糕 */ for h1n div (r1*r1) downto m do s1=2 * r1* h1+ r1* r1 v1=n - r1* r1 * h1 search (1, r1, h1, s1, v1),优化,1)因为知道余下的蛋糕体积,因此可以估算一下余下侧面积, 这样我们可以就加入如下剪枝条件: if 当前的表面积 + 余下的側面积 当前最优值 the

5、n exit 设已经做了i层蛋糕,则还需做m-i层, si:为第i层蛋糕的侧面积, fsi:余下的侧面积,怎么求fsi ? 因为: 2vi= 2ri+1 * ri+1 * hi+1 + .+ 2rm * rm * hm = ri+1 * si+! + .+ rm * sm ri+1 * (si+1+ .+ sm) = ri+1 * fsi 所以: fsi 2vi / ri+1 因此剪枝条件为: if si-1 + 2 * vi-1 / ri 当前最优值 then exit,优化,2)如果剩下的蛋糕材料太少,不能保证做到m层,那么没有必要继续往下做了,设, 最m层半径和高都为1,rm=hm=1

6、第m-1层半径和高都为2,rm-1=hm-1=2 第 i +1层半径和高都为i, ri = hi = m i 这样, 余下的m-i层的最小体积为,因此,剪枝条件为, if vi mini then exit,3)如果剩下的蛋糕材料太多,以最大的方式做完m层, 仍有材料剩余,那么没有必要继续往下做了,设, 第i+1层半径和高分别为,ri+1 = ri 1 , hi+1 = hi 1 第i+2层半径和高分别为,ri+2 = ri 2 , hi+2 = hi 2 第 层半径和高分别为,ri+m = ri m ,hi+m= hi m 这样, 余下的m-i层的最大体积为,优化,因此,剪枝条件为, if

7、vi maxi,r,h then exit,计算mini for i1 to n do s s + i * i * i; minm-i s 计算maxi,r,h for r1 to sqrt(n) do for h1 to n div (r*r) do s 0; for im downto 1 do s s +(r-i)*(r-i)*(h-i); maxi,r,h s,初始化,search (i, ri , hi , si , vi) 对每层蛋糕进行搜索 if si + 2 * vi / ri 当前最优值 then exit; 剪枝1 if vi mini then exit; 剪枝2 if

8、vi maxi then exit; 剪枝3 if im then for ri + 1 ri downto i for hi + 1min(vi div (ri + 1*ri + 1), hi) downto i si + 1si + 2 * ri + 1* hi + 1 vi + 1vi - ri + 1* ri + 1* hi + 1 search ( i+1, ri + 1, hi + 1, si + 1,vi + 1) else if vi =0 then 更新最优值 problem-cake 1. 计算mini和maxi r,h ; 2. for r1m to sqrt ( n )

9、 do /*假设 h1=1,只做一层蛋糕 */ 3. for h1n div (r1*r1) downto m do 4. s1=2 * r1* h1+ r1* r1 5. v1=n - r1* r1 * h1 6. search (1, r1, h1, s1, v1) 7.,小节,可行性剪枝,剪枝2:if vi mini then exit,剪枝3:if vi maxi,r,h then exit,最优化剪枝,剪枝1: if si-1 + 2 * vi-1 / ri 当前最优值 then exit,剪枝原则,正确、高效,埃及分数,在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表

10、示一切有理数。如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。 对于一个分数a/b,表示方法有很多种,但是哪种最好呢?首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好。 如: 19/45=1/3 + 1/12 + 1/180 19/45=1/3 + 1/15 + 1/45 19/45=1/3 + 1/18 + 1/30, 19/45=1/4 + 1/6 + 1/180 19/45=1/5 + 1/6 + 1/18. 最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。 给出a,b(0ab1000),编程计算最好的表

11、达方式。 输入:a b 输出:若干个数,自小到大排列,依次是单位分数的分母。 例如: 输入:19 45 输出:5 6 18,分析,1.节点类型 是一个k元组(a1,a2,.ak), 代表当前解中的分母a1,a2.ak. 2.节点扩展方法 按照a1a2a3.ak的顺序扩展,扩展第k层节点的时候,最简单的办法就是从ak-1+1开始枚举ak,一直到预先确定的最大值。 但是这个最大值怎么确定呢? 直观的讲,ak总不能太大,因为如果ak太大,1/ak就很小,1/ak+1 . 1/ak+2. 就更小,那么,尽管加了很多项,还可能不够a/b. 例如: 例如已经扩展到 19/45=1/5+? 如果第二项是1/

12、100, 那么由于19/45-1/5=2/9=0.22222. 那么接下来至少要0.2222/(1/100)=22项加起来才足够2/9, 所以继续 扩展下去至少还要扩展22项,加起来才差不多够a/b,可变深度的搜索算法,procedure search(k,a,b); 决定第k个分母dk 1. if k=depth+1 then exit depth需要进行枚举 2. else if (a =1) and (bdk-1) then a整除b的情况 3. dk:=b; 4. if not found or (dkanswerk) then 更新解; 5. 6. else 7. s:=max b

13、div a,dk-1+1; 确定dk的上下界s,t; t:=(depth-k+1)*b div a 8. for i:=s to t do 9. dk:=i; 10. m := gcd(a,b); a,b的最大公约数为m 11. search(k+1,(i*a-b) div m,(b*i) div m); 12. 13.,汽车到站情况示例图,同一条线路上的公共汽车以相同的时间间隔到站 时间单位用“分”表示,从0 到59 。 每条公共汽车线路至少有两辆车到达本站。 公共汽车线路数k一定17,汽车数目n一定小于300。 来自不同线路的公共汽车可能在同一时刻到达本站。 不同公共汽车线路的车首次到站时

14、间和到站的时间间隔都有可能相同,目标: 编一个调度表,公共汽车线路数目最少的情况下,使公共汽车到达本站的时刻满足输入数据的要求,问题要素,时间,车辆,路线,题目要求的是车和线路的关系, 时间在其中起的是描述作用和条件制约作用, 搜索对象应该是车或线路这两个关键要素,以车辆为搜索对象,搜索策略是: 按到达的时间顺序,看车辆是属于哪条线路。 1)某车属于新线路的第一辆车 2)属于已有线路的第二辆车,此时确定了一条路线,以车辆为搜索对象扩展的搜索树,以线路为搜索对象,搜索策略是: 枚举每条线路包含哪些车,确定该线路,搜索每层都要确定一条路线。 1)将未确定归属路线的到达时间最小的车固定为 新路线的第

15、一辆车。 2)其后枚举这条路线的第二辆车,从而确定该路线,以线路为搜索对象扩展的搜索树,策略比较,1)谁易于优化剪枝 可行性剪枝(方法1好) 与已知最优解比较剪枝(方法1好) 排除重复剪枝(差不多,2)谁的操作量小 主递归程序的枚举循环 (1760) 剪枝函数消耗时间(差不多,两种搜索方法的实际比较,多处理机调度问题,设定有若干台相同的处理机p1,p2pn,和m个独立的作业j1,j2jm,处理机以互不相关的方式处理作业,现约定任何作业可以在任何一台处理机上运行,但未完工之前不允许中断作业,作业也不能拆分成更小的作业,已知作业ji需要处理机处理的时间为ti(i=1,2m)。编程完成以下两个任务:

16、 任务一:假设有n台处理机和m个作业及其每一个作业所需处理的时间ti存放在文件中,求解一个最佳调度方案,使得完成这m个作业的总工时最少并输出最少工时。 任务二:假设给定作业时间表和限定完工时间于文件中,求解在限定时间内完成这批作业所需要最少处理机台数和调度方案,搜索对象选取,方法一:按顺序搜索每个作业。当搜索一个作业时,将其放在每台处理机搜索一次。 方法二:按顺序搜索每台处理机。当搜索一台处理机时,将每个作业放在上面搜索一次,优劣性分析,对于方法一:只能根据目前已确定的需时最长的处理机的耗时与目前最佳解比较。 对于方法二:可约定time1time2time3 timen(timei表示第i台处

17、理机的处理时间),从而可以设定槛值:如当前处理机的处理时间=目前最佳解,或剩下的处理机台数上一台处理机的处理时间剩余的作业需要的处理时间,则回溯。因为在前面的约束条件下,已经不可能有解。 因此,从上面的比较来看,第二种方法显然是比第一种要好的。下面就针对第二种方法更深一层的进行探讨。 对于任务一,首先可以用贪心求出time1的上界。然后,还可以time1的下界,up(作业总时间/处理机台数)。(up表示大于等于该小数的最小整数)。搜索便从上界开始,找到一个解后,若等于下界即可停止搜索。 对于任务二,可采用深度+可变下界。下界为:up(作业总时间/限定时间),即至少需要的处理机台数。并设定tim

18、e1的上界为t,间隔排列】问题,有2n个木块,每个木块标上1到n的自然数中的一个,每个数字会出现在两个木块上。把这些木块排成一排,要求是:标号为i的两个木块之间要间隔i个其它木块。比如说n=3的情况,下面就是一个可行的排列: 3,1,2,1,3,2。 编程实现,对给定的n(n=40),求出一个可行排列,运行效果比较,选择搜索顺序的基本原则,1、取值范围小的搜索元素先搜索。 2、一个搜索元素确定以后对其它搜索元素取值范围的影响称为制约力。制约力较大的搜索元素先搜索。 3、先搜索对解影响较大的元素可以使剪枝时的估价函数更准确,使剪枝更加有效,算符破译】(noi2000,题意简述:古梅算符由小写字母

19、a到m组成,分别对应于现代算符中的0,1,2,3,4,5,6,7,8,9,+,*,=中的一个。给出一组古梅算符表示的等式,若存在满足等式的对应关系,则输出所有能够确定的古梅算符和现代算符的对应关系;否则输出noway。 input ouput 2 a6 abcdec b* cdefe d= f+ 在上例中,可能对应的现代表达式为6*2=12,2=1+1,6*4=24,4=2+2,6*8=48,8=4+4。可见,能够确定的对应关系只有a对应6,b对应*,d对应=,f对应+,应该输出,三个最特殊的元素,本题中有三个算符最特殊:= 、* 、+,它们要满足以下条件: 1、这三个算符不能出现在等式的最左

20、端和最右端。 2、这三个算符两两不能相邻。 3、,这是最特殊的算符,它在任何一个等式中必须出现且仅出现一次,确定搜索顺序,从取值范围方面考虑,*的取值范围在所有算符中是最小的;从制约力方面考虑,和,*的制约力无疑都强于0到9这十个数字;从对剪枝有利的角度考虑,这三个算符对解的影响最大,因此,*这三个算符应当放在搜索序列的前面。对于这三个算符,由于受到的限制更多,取值范围更小,所以应当优先搜索。 由此得出的最优搜索顺序:先搜索,其次是,*,最后是10个数字,静态优化搜索顺序,在一些问题中,搜索元素的制约力和取值范围在搜索过程中变化不大,或变化对搜索效率影响不大。如果要动态判断元素的取值范围和制约

21、力需要花费较大的代价,而且优化效果不好。在这种情况下只需在搜索开始前确定搜索顺序,而不必在搜索过程中再改变搜索顺序,动态调整搜索顺序,有时在搜索过程中元素的取值范围和制约力会有较大的变化,而且这些变化直接影响到搜索树的规模,因此需要动态的调整搜索顺序,也就是启发式搜索。启发式搜索继承了回溯法占用空间少,编程简单的优点,而启发式搜索的最大优点是可以在较短的时间内找到一组可行解,这最适合解决一类只需要求出一组可行解的搜索问题,质数方阵】(ioi94,题意简述:在一个5*5的方阵中填入数字,使得沿行,沿列及两个对角线的5个数字都能构成一个5位质数(5位质数的首位不为0)。所有质数的各位数字之和必须等于一个常数。这个常数和方阵左上角中的数字预先给出。若存在多个解,必须全部得出。 input 11 1 output,搜索元素的性质,1、最后一行和最后一列:可以填的数字只有1,3,7,9。 2、两条对角线:与方阵中的所有五位素数有关。 3、其他行列:特殊性取决于行列中已经确定的格子个数,根据元素取值范围和制约力确定搜索顺序,1、最后一行和最后一列是取值范围最小的搜索元素,而且它们对其他所有的元素都有一定的制约力,因此要放在搜索序列的最前面。 2、两条对角线同样影响到其他所有的搜索

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论