1、硕士生考查课程考试试卷考试科目: MATLAB 教程 考生姓名: 考生学号: 学 院: 专 业: 考 生 成 绩: 任课老师 (签名) 考试日期:20 年 月 日 午 时至 时MATLAB 教程试题:A、利用 MATLAB 设计遗传算法程序,寻找下图 11 个端点的最短路径,其中没有连接的端点表示没有路径。要求设计遗传算法对该问题求解。abcdefghijk121683179467294211B、设计遗传算法求解 f(x)极小值,具体表达式如下:32121(,)5,iiifxx要求必须使用 m 函数方式设计程序。C、利用 MATLAB 编程实现:三名商人各带一个随从乘船渡河,一只小船只能容纳二
2、人,由他们自己划行,随从们密约,在河的任一岸,一旦随从的人数比商人多,就杀人越货,但是如何乘船渡河的大权掌握在商人手中,商人们怎样才能安全渡河?D、结合自己的研究方向选择合适的问题,利用 MATLAB 进行实验。以上四题任选一题进行实验,并写出实验报告。选择题目: A 一、问题分析(10 分)1234567891 01 1121683179467294211如图如示,将节点编号,依次为 1.2.3.4.5.6.7.8.9.10.11,由图论知识,则可写出其带权邻接矩阵为:0 2 8 1 500 500 500 500 500 500 5002 0 6 500 1 500 500 500 500
3、 500 5008 6 0 7 500 1 500 500 500 500 5001 500 7 0 500 500 9 500 500 500 500500 1 500 500 0 3 500 2 500 500 500500 500 1 500 3 0 4 500 6 500 500500 500 500 9 500 4 0 500 500 1 500500 500 500 500 2 500 500 0 7 500 9500 500 500 500 500 6 500 7 0 1 2500 500 500 500 500 500 1 500 1 0 4500 500 500 500 50
4、0 500 500 9 2 4 0注:为避免计算时无穷大数吃掉小数,此处为令 inf=500。问题要求求出任意两点间的最短路径,Floyd 算法采用的是在两点间尝试插入顶点,比较距离长短的方法。我思考后认为,用遗传算法很难找到一个可以统一表示最短路径的函数,但是可以对每一对点分别计算,然后加入 for 循环,可将相互之间的所有情况解出。观察本题可发现,所有节点都是可双向行走,则可只计算 i 到 j 的路径与距离,然后将矩阵按主对角线翻折即可得到全部数据。二、实验原理与数学模型(20 分)实现原理为遗传算法原理:按所选择的适应度函数并通过遗传中的复制、交叉及变异对个体进行筛选,使得适应度高的个体
5、被保留下来,组成新的群体,新的群体既继承了上一代的信息,又优于上一代。这样周而复始,群体中个体适应度不断提高,直到满足一定的条件。数学模型如下:设图 由非空点集合 和边集合 组成,其中G12,.nV12,.mEe又设 的值为 12 1(,)e,P)(),iiiiiePE且 若 ( 则 为 一 个 有 向 图 ; iia, 故 可表示为一个三元组,.,mAa ,GPA则求最短路径的数学模型可以描述为: 1min*.iiiiAEst实验具体:第一:编码与初始化因采用自然编码,且产生的编码不能重复,于是我采用了 randperm 函数产生不重复的随机自然数。因解题方法是使用的是计算每一对点,则我们编
6、码时将第一个节点单独放入,合并成完整编码。因为节点有 11 个,可采用一个 1 行 11 列的矩阵储存数据,同时,由于编号为数字,可直接使用数字编码表示路径的染色体。具体如下:采用等长可变染色体的方式,例如由 2 到 9 的路径,染色体编码可能为(2,5,1,8,4,6,9,3,10,7,11) ,超过 9 之后的编码,用来进行算子的运算,不具备实际意义。第二:计算适应度,因取最短路径值,即最小值,常用方法为 C-F(x)或C/F(x)(C 为一常数) ,此处采用前一种方式。于是,可进一步计算相对适应度。第三:选择与复制采用轮盘赌算法,产生一个随机值,比较它与累计相对适应度的关系,从而选择出优
7、良个体进入下一代。第四:交叉。因编码是不重复的数字,所以采用传统的交叉方法,即上一行与下一行对位交叉,会产生无效路径,于是,采用了不同的交叉方法,具体如下:(1)在表示路径的染色体 Tx 和 Ty 中,随机选取两个基因座(不能为起点基因座)i 和 j, 即将 i 个基因座和第 j 个基因座之间的各个基因座定义为交叉域,并将交叉的内容分别记忆为 temp1 和 temp2。(2)根据交叉区域中的映射关系,在个体 Tx 中找出所有与 temp2 相同的元素,在个体 Ty 中找出所有与 temp1 相同的元素,全部置为 0。(3)将个体 Tx、Ty 进行循环左移,遇到 0 就删除,直到编码串中交叉区
8、域的左端不再有 0:然后将所有空位集中到交叉区域,而将交叉区域内原有的基因依次向后移动。因 0 元素可能较多,在程序实现时,我是将非零元素提出,后面再合成。(4)将 temp2 插入到 Tx 的交叉区域,temp1 插入到 Ty 的交叉区域。形成新的染色体 1。第五:变异染色体编码为从 1 到 11 的无重复编码,所以不能采用一般的生成一个随机数替代的办法。此处采用交换变异法。即随机产生两个数,交换两个节点的顺序。例: 则新染色体编码为:,2345,6789,01,3,28pK18三、实验过程记录(含基本步骤、程序代码及异常情况记录等) (60 分)首先,写程序,修复 Bug。然后,调试种群数
9、量,遗传代数,交叉概率,变异概率等,不断运行程序,以达到较理想的状态。有一次异常情况:算出来的最短距离均为 0,最短路径没有终点出现,经过分析发现,因为交叉处的代码较复杂,弄错了一点,导致新基因有部分为非法基因。最后采用提出非零数值组成向量,再合成新基因的方式解决。Matlab 程序代码如下:clc;clear;%初始化参数 %注:popsize=200,MaxGeneration=100,约跑 2 分钟。若不要求太精确,可减少循环次数。pointnumber=11; %节点个数Popsize=200; %种群规模,只能取偶数(因 67 行的循环)MaxGeneration=100; %最大代
10、数Pc=0.8;Pm=0.3; %交叉概率和变异概率A=0 2 8 1 50 50 50 50 50 50 502 0 6 50 1 50 50 50 50 50 508 6 0 7 50 1 50 50 50 50 501 50 7 0 50 50 9 50 50 50 5050 1 50 50 0 3 50 2 50 50 5050 50 1 50 3 0 4 50 6 50 5050 50 50 9 50 4 0 50 50 1 5050 50 50 50 2 50 50 0 7 50 950 50 50 50 50 6 50 7 0 1 250 50 50 50 50 50 1 50
11、1 0 450 50 50 50 50 50 50 9 2 4 0; %带权邻接矩阵。A(A=50)=500; %取值 50 过小而修正为 500;Bestindividual=zeros(MaxGeneration,1);outdistance=zeros(11,11);outpath=cell(11,11); %用于存放 11 个点相互之间的最短路径%* 生成初始种群 *for a=1:pointnumber %起点的编号%a=1; tempvary=1 2 3 4 5 6 7 8 9 10 11;tempvary(a)=; %暂时剔除起点tempmatrix=a*ones(Popsize
12、,1); %将起点单独放一矩阵path=zeros(Popsize,pointnumber-1); %声明矩阵大小,避免减慢速度for i=1:Popsizetemprand=randperm(pointnumber-1);path(i,:)=tempvary(temprand(1:end); %生成一系列剔除起点的随机路线endpath=tempmatrix path; %合成包括起点的完整路线row,col=size(path);for b=a:pointnumber %终点的编号%b=10;for k=1:1:MaxGenerationfor i=1:rowposition2=find(
13、path(i,:)=b); %找出终点在路线中的位置pathlong(i)=0;for j=1:position2-1pathlong(i)=pathlong(i)+A(path(i,j),path(i,j+1);endend%计算适应度Fitness=length(A)*max(max(A)-pathlong; %因要求最小值,采且常数减函数值构造适应度Fitness=Fitness./sum(Fitness);%* Step 1 : 选择最优个体 *Bestindividual(k)=min(pathlong);Orderfi,Indexfi=sort(Fitness); %按照适应度大小
14、排序Bestfi=Orderfi(Popsize); %Oderfi 中最后一个即是最大的适应度BestS=path(Indexfi(Popsize),:); %记录每一代中最优个体的路线%* Step 2 : 选择与复制操作 *temppath=path;roulette=cumsum(Fitness);for i=1:PopsizetempP=rand(1);for j=1:length(roulette)if tempPtemp %交叉条件TempE(i,n:end)=E(i+1,n:end);TempE(i+1,n:end)=E(i,n:end);end end TempE(Size,
15、:)=BestS; %最优个体保留E=TempE; %种群替换%* Step 4: 变异操作 * %pm=0.001; %pm=0.001-1:1:Size*(0.001)/Size; %自适应变异概率%pm=0.0; %没有变异pm=0.1; %较大的变异概率for i=1:1:Size for j=1:1:2*CodeL temp=rand; if pmtemp %变异条件if TempE(i,j)=0 TempE(i,j)=1; else TempE(i,j)=0; end end end end TempE(Size,:)=BestS; %保留当代最优个体E=TempE; %种群替换end %* 结果输出 * Max_Value=Bestfi BestS x1 x2 figure(1); plot(time,BestJ); xlabel(Times);ylabel(Best J); figure(2); plot(time,bfi); xlabel(times);ylabel(Best F); toc;