著名算法matlab编程 贪心算法 背包问题 递归算法 Hanoi塔问题 回溯算法 n皇后问题_第1页
著名算法matlab编程 贪心算法 背包问题 递归算法 Hanoi塔问题 回溯算法 n皇后问题_第2页
著名算法matlab编程 贪心算法 背包问题 递归算法 Hanoi塔问题 回溯算法 n皇后问题_第3页
著名算法matlab编程 贪心算法 背包问题 递归算法 Hanoi塔问题 回溯算法 n皇后问题_第4页
著名算法matlab编程 贪心算法 背包问题 递归算法 Hanoi塔问题 回溯算法 n皇后问题_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

《数学实验》七贪心算法—背包问题递归算法—Hanoi塔问题回溯算法—n皇后问题贪心算法背包问题贪心算法意为见到好的就抓住不放,用贪心算法求解问题,一般可以获得比较好的求解速度。本问题的具体做法为:先计算物品的价值密度,并把物品按价值密度从大到小的顺序排列:function[sch,tolval,tolwei]=backpack(maxwei,weight,value)n=size(weight,2);sch=zeros(1,n);p=value./weight;[a,b]=sort(p);%a从小到大排序后的向量,b是对应元素原始下标b=b(n:-1:1);tw=0;%已装入背包的物品重量fori=1:nif(tw+weight(b(i)))<=maxwei

tw=tw+weight(b(i));

sch(b(i))=1;endendtolwei=tw;tolval=sum(value(find(sch)));>>[s,v,t]=backpack(110,[110204045223055],[1020305055324060])s=11100110v=132t=83递归算法Hanoi塔问题传说在贝拿勒斯的圣庙里,有块黄铜板,上面竖着3根宝石柱,这些宝石柱,径不及小指,长仅半臂。大梵天王(印度教的一位主神)在创造世界的时候,在其中一根柱上放置了64片中心有插孔的金片。这些金片的大小不一样,大的在下面,小的在上面,从下而上叠成塔形,这就是所谓的梵天宝塔。大梵天王立下法则:金片从一柱移到另一柱时,每次只能移动一片,且移动过程中,小金片永远在大金片上面,绝不允许颠倒。大梵天王预言:当金片从它创造世界时的宝石柱移到另一宝石柱上时,世界末日就要来临,一声霹雳会将梵塔、庙宇和众生都消灭干净。12nABC问题分析:把柱C作为目标柱子,设an为n块金片从其中一柱移到另一柱的搬运次数,则把n块金片从A移到C,可以先把前n-1片移到B,需搬an-1次;接着把第n片从A称到C,再从B把剩下的n-1片搬到C,又需搬an-1次。所以从A到n块金片称到柱C,共需次数为:2an-1+1次。显然,当n=1时,a1=1,所以Hanoi塔的移动次数相当于一个带初值的递归关系:假如你手脚比较麻利,1秒钟移动一片,那么:n=1时,1秒钟可以完成任务n=2时,3秒钟可以完成任务n=3时,7秒钟可以完成任务…….n=8时,4.25分钟可以完成任务…….n=64时,需时18,446,744,073,709,551,615秒,相当于5846亿年,比太阳的寿命都长(太阳的寿命不超过200亿年)。首先构造数据结构。对金片,从上到下,分别有用整数1,2,3,……,n表示;三根宝石柱,从左到右分别用1,2,3表示。对于每一次移动,我们用一个行向量表示,例如把编号为4的金片从柱1移到柱3时,我们用向量[413]表示。本算法在hanoi.m文件中用两个函数实现,其中一个是主函数,定义如下:function[tolnum,scheme]=

hanoi(disknum,beginpillar,midpillar,endpillar)返回参数tolnum表示移到次数,scheme是移动方案矩阵,一行表示一次移动方式。输入参数disknum表示本次移动的金片数(即最上面的disknum个金片),beginpillar表示金片所在原始柱,endpillar表示目标柱,midpillar表示中间柱(即辅助柱子)。第二个是子函数,外部不能调用,只供主函数hanoi调用。该函数是实现递归生成的关键,而主函数hanoi实际上只起到了一个转换参数的作用,其定义如下:functiontemphanoi(disknum,beginpillar,midpillar,endpillar)该子函数没有返回参数,它使用了一个全局变量与主函数共享数据。输入的四个参数与主函数的四个输入参数含义相同。下面演示了三个金片从柱1移动到目标柱3的过程:在命令窗口输入:>>[n,s]=hanoi(3,1,2,3)n=7s=113

212132

313121

223113123123231321312123123123123function[tolnum,scheme]=hanoi(disknum,beginpillar,midpillar,endpillar)globalSCHEME_HANOI%全局变量,子函数可以直接访问SCHEME_HANOI=[];%设置为空temphanoi(disknum,beginpillar,midpillar,endpillar);tolnum=size(SCHEME_HANOI,1);%取得行数,即移动次数scheme=SCHEME_HANOI;%子函数,只能在本程序访问,外部不可见functiontemphanoi(disknum,beginpillar,midpillar,endpillar)%子函数globalSCHEME_HANOI%声明使用ifdisknum==1%添加一行移动方式

SCHEME_HANOI=[SCHEME_HANOI;1,beginpillar,endpillar];else%下面一句相当于把上面n-1片移到中间柱子

temphanoi(disknum-1,beginpillar,endpillar,midpillar);%然后把最后一片移到目标柱子上

SCHEME_HANOI=[SCHEME_HANOI;disknum,beginpillar,endpillar];%把中间当作第一根,原来第一根当作中间柱子,继续移动

temphanoi(disknum-1,midpillar,beginpillar,endpillar);end回溯算法一种可能的回溯树结构部分解搜索路径回溯路径正确解成功啦!n皇后问题国际象棋规定:一个皇后可以攻击与之同处在同一行或同一列或同一斜线上的其它任何棋子。问怎样在一个n×n的棋盘上放置n个皇后,使得它们彼此不受攻击?如右图,若一个皇后在第一行的第三格,则第二行的第二、三、四都不能放,只能放在第一格。设棋盘上两个皇后的位置坐标分别为(m,n)和(i,j),按照攻击规则,若两皇后产生攻击,则必然有:i=m,或n=j,或|i-m|=|j-n|(可从两点连线斜率为1或-1得到)。现分析在第i行第j列放一个皇后时,可能会产生哪些动作:若该位置不符合攻击规则,放入皇后后,则若i<n,则令i=i+1,重新进行判断i=n,则找到一种方案,回到上一行,继续搜索可行方案该位置符合攻击规则,若j<n,则令j=j+1,继续搜索本例使用了三个函数,主函数为:

function[num,scheme]=Queen(n)返回参数num表示n×n棋盘放置n个皇后总的可行方案数,scheme是方案矩阵,一行是一个可行方案,例如[2,4,1,3]表示4×4棋盘中第1个皇后放在第一行第2列,第2个皇后放在第2行第4列……。第二和第三个是子函数,定义为:functionsearch()functionresult=checkchess(row,col)search实现回溯搜索,checkchess检查当前row-1行皇后放好后,在第row行第col列是否可以放皇后。在命令窗口输入:>>[a,b]=queen(4)a=2b=24133142在命令窗口输入:>>[a,b]=queen(5)a=10b=13524142532413525314314253524141352425315241353142function[num,scheme]=Queen(n)globalSCHEME_MATRIXNCURROWN=n;SCHEME_MATRIX=zeros(1,n);%一个空方案CURROW=1;search;%搜索scheme=SCHEME_MATRIX(1:(end-1),:);num=size(scheme,1);这是主函数,定义了三个全局变量,便于程序间传递数据。其中CURROW保存当前正在搜索的行。search是自定义的子函数,end用来指示当前维的最后一个脚标。functionsearch()globalSCHEME_MATRIXNCURROWfori=1:N%在当前行逐列搜索

ifcheckchess(CURROW,i)%满足放置条件

SCHEME_MATRIX(end,CURROW)=i;%在当前行放入皇后

if(CURROW<N)CURROW=CURROW+1;search;%进入下一行搜索

else%已在最后一行放入皇后,添加新的方案行

SCHEME_MATRIX=[SCHEME_MATRIX;SCHEME_MATRIX(end,:)];break;endendendCURROW=CURROW-1;%回溯到上一行,继续搜索function

温馨提示

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

评论

0/150

提交评论