遗传算法解决TSP问题的matlab程序
利用遗传算法求解TSP问题

利⽤遗传算法求解TSP问题⼀、摘要TSP问题是指给定平⾯上N个点及每点的坐标,求⼀条路径,遍历所有的点并回到起点,使这条路径长度最⼩。
TSP问题是⼀个组合优化问题。
该问题可以被证明具有NPC计算复杂性。
因此,任何能使该问题的求解得以简化的⽅法,都将受到⾼度的评价和关注。
遗传算法是⼈⼯智能⽅法的⼀种,⽤于求解各种传统⽅法不⽅便求解或耗时很长的问题。
下⾯给出遗传算法求解TSP问题的步骤。
在传统遗传算法求解TSP的基础上,提出了⼀种新的编码⽅式,并且讨论了⼀种优化⽅法的可⾏性。
本次实验的程序⾸先在matlab上验证了基本的算法,然⽽由于matlab运⾏较慢,故⼜移植到C++平台上,经过测试,实验结果良好。
⼆、算法实现遗传算法的实现主要包括编码、选择、交叉、编译、将个体放⼊新种群这么⼏个步骤,经过很多代的编译求解,以逼近最优解。
下⾯讨论每⼀个步骤的实现,其中编码⽅式是我在考虑了传统编码⽅式不利于计算的缺点下,重新设计的⼀种全新的编码⽅式。
编码在传统TSP问题中,编码可以直接采⽤⼆进制编码或⾃然编码的形式,⽐如直接把城市转化成(2,5,4,1,3,6)的形式,表⽰从2到5到4到1到3到6最后回到起点。
但是在求解TSP问题时,如果直接采⽤此种编码⽅式,会导致在交叉或变异时出现冲突的情况。
如(2,5,4,1,3,6)和(3,5,6,1,2,4)交换后变成了(2,5,6,1,2,6)和(3,5,4,1,3,4),显然路径出现了冲突的现象,传统的解决⽅式是通过逐步调整的⽅法来消除冲突,但是这种⽅法增加了编码的复杂度,不利于问题的求解,根据问题的特点,提出了采⽤⼀种插⼊序号的编码⽅式。
假设6个城市(1,2,3,4,5,6)现在有编码(1,1,2,2,1,3),让第n个编码表⽰n放在第⼏个空格处。
那么⽣成路径的规则是⾸先取1放在第⼀个(1),然后取2放在第⼀个空格处(2,1),然后取3放在第⼆个空格处(2,3,1),然后取4放在第⼆个空格处(2,4,3,1)然后取5放在第⼀个空格处(5,2,4,3,1)最后取6放在第3个空格处(5,2,6,4,3,1)。
一些解决TSP问题的算法及源代码

模拟退火算法新解的产生和接受可分为如下四个步骤:
第一步是由一个产生函数从当前解产生一个位于解空间的新解;为便于后续的计算和接受,减少算法耗时,通常选择由当
前新解经过简单地变换即可产生新解的方法,如对构成新解的全部或部分元素进行置换、互换等,注意到产生新解的变换方法
决定了当前新解的邻域结构,因而对冷却进度表的选取有一定的影响。
(3)产生新解S′
(4)计算增量Δt′=C(S′)-C(S),其中C(S)为评价函数
(5)若Δt′<0则接受S′作为新的当前解,否则以概率exp(-Δt′/T)接受S′作为新的当前解.
(6)如果满足终止条件则输出当前解作为最优解,结束程序。
终止条件通常取为连续若干个新解都没有被接受时终止算法。
(7) T逐渐减少,且T->0,然后转第2步。
(wm, wm-1 ,…,w1 , wm+1 ,…,wk-1 ,wn , wn-1 ,…,wk).
上述变换方法可简单说成是“逆转中间或者逆转两端”。
也可以采用其他的变换方法,有些变换有独特的优越性,有时也将它们交替使用,得到一种更好方法。
代价函数差设将(w1, w2 ,……,wn)变换为(u1, u2 ,……,un),则代价函数差为:
第二步是计算与新解所对应的目标函数差。因为目标函数差仅由变换部分产生,所以目标函数差的计算最好按增量计算。
事实表明,对大多数应用而言,这是计算目标函数差的最快方法。
第三步是判断新解是否被接受,判断的依据是一个接受准则,最常用的接受准则是Metropo1is准则:若Δt′<0则接受S′作
为新的当前解S,否则以概率exp(-Δt′/T)接受S′作为新的当前解S。
% coordinates given by LOC, which is an M by 2 matrix and M is
TSP问题的求解

(1)优点:算法稳定,易得标准值 (2)缺点:针对 TSP 问题,需要先计算出第 i 个城市到其余城市的距离, 当城市数目较多时计算复杂。
关键词:TSP 问题 模拟退火算法 线性规划 遗传算法
一、问题重述
1.1 引言 TSP 是典型的组合优化问题, 并且是一个 NP-hard 问题,TSP 简单描述为:
一名商人欲到 n 个不同的城市去推销商品, 每 2 个城市 i 和 j 之间的距离为 d ij , 如何选择一条路径使得商人每个城市走一遍后回到起点, 所走的路径最短。用数 学符号表示为:设 n 维向量 s =(c1 , c2 , …, cn )表示一条路经, 目标函数为:min
小可以不断变化。在该题中,取温度的衰减系数α=0.9,其中固定温度下最大迭 代次数为:100 次,固定温度下目标函数值允许的最大连续未改进次数为 5 次, 即当算法搜索到的最优值连续若干步保持不变时停止迭代。
④最短路径的确定
借助 Matlab 通过模拟退火算法得出最短路径为:27—26—25—24—15— 14—8—7—11—10—21—20—19—18—9—3—2—1—6—5—4—13—12—30—23 —22—17—16—29—28—27,最短路径图如下图 1
图1 最短距离为:423.7406
(2)法二:遗传算法 优化过程如下图 2 所示:
图2 初始种群中的一个随机值(初始路径):
22—6—3—16—11—30—7—28—17—14—8—5—29—21—25—27—26—19 —15—1—23—2—4—18—24—13—9—20—10—12—22
基于Matlab的遗传算法解决TSP问题的报告

报告题目:基于Matlab的遗传算法解决TSP问题说明:该文包括了基于Matlab的遗传算法解决TSP问题的基本说明,并在文后附录了实现该算法的所有源代码。
此代码经过本人的运行,没有发现错误,结果比较接近理论最优值,虽然最优路径图有点交叉。
因为本人才疏学浅,本报告及源代码的编译耗费了本人较多的时间与精力,特收取下载积分,还请见谅。
若有什么问题,可以私信,我们共同探讨这一问题。
希望能对需要这方面的知识的人有所帮助!1.问题介绍旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题。
它可以描述为:一个商品推销员要去若干个城市推销商品,从一个城市出发,需要经过所有城市后,回到出发地,应如何选择行进路线,以使总行程最短。
从图论的角度看,该问题实质是在一个带权完全无向图中。
找一个权值最小的Hemilton回路。
其数学描述为:设有一个城市集合其中每对城市之间的距离(),i j d c c R +∈,求一对经过C中每个城市一次的路线()12,,n c c c ΠΠΠ⋯使()()()1111min ,,n i n i i d c c d c c −ΠΠΠΠ+=+∑其中()12,,12n n ΠΠΠ⋯⋯是,的一个置换。
2.遗传算法2.1遗传算法基本原理遗传算法是由美国J.Holland 教授于1975年在他的专著《自然界和人工系统的适应性》中首先提出的,它是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。
遗传算法模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止。
遗传算法,在本质上是一种不依赖具体问题的直接搜索方法,是一种求解问题的高效并行全局搜索方法。
遗传算法在模式识别、神经网络、图像处理、机器学习、工业优化控制、自适应控制、负载平衡、电磁系统设计、生物科学、社会科学等方面都得到了应用。
TSP问题的遗传算法求解

TSP问题的遗传算法求解一、问题描述假设有一个旅行商人要拜访N个城市,要求他从一个城市出发,每个城市最多拜访一次,最后要回到出发的城市,保证所选择的路径长度最短。
二、算法描述(一)算法简介遗传算法(GeneticAlgorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,通过模拟自然进化过程搜索最优解。
遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择个体,并借助于自然遗传学的遗传算子(geneticoperators)进行组合交叉(crossover)和变异(mutation),产生出代表新的解集的种群。
这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解。
(摘自百度百科)。
(二)遗传算子遗传算法中有选择算子、交叉算子和变异算子。
选择算子用于在父代种群中选择进入下一代的个体。
交叉算子用于对种群中的个体两两进行交叉,有Partial-MappedCrossover、OrderCrossover、Position-basedCrossover等交叉算子。
变异算子用于对种群中的个体进行突变。
(三)算法步骤描述遗传算法的基本运算过程如下:1.初始化:设置进化代数计数器t=0、设置最大进化代数T、交叉概率、变异概率、随机生成M个个体作为初始种群P2.个体评价:计算种群P中各个个体的适应度3.选择运算:将选择算子作用于群体。
以个体适应度为基础,选择最优个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代4.交叉运算:在交叉概率的控制下,对群体中的个体两两进行交叉5.变异运算:在变异概率的控制下,对群体中的个体两两进行变异,即对某一个体的基因进行随机调整6.经过选择、交叉、变异运算之后得到下一代群体P1。
遗传算法的Matlab实现讲解

x [0,10]
Matlab编程实现GA
pop=initpop(popsize,chromlength); %随机产生初始群体
主程序
%遗传算法主程序 function My_GA
for i=1:Gene %20为迭代次数 [objvalue]=calobjvalue(pop,chromlength,Xmax,Xmin); %计算目标函数 fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度 [newpop]=selection(pop,fitvalue); %复制 [newpop]=crossover(newpop,pc); %交叉 [newpop]=mutation(newpop,pm); %变异
Matlab编程实现GA
计算目标函数值
计算目标函数值 % calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示 例仿真,可根据不同优化问题予以修改。 %遗传算法子程序
%Name: calobjvalue.m
%实现目标函数的计算 function [objvalue]=calobjvalue(pop,chromlength,Xmax,Xmin)
Matlab编程实现GA
计算个体的适应值
function fitvalue=calfitvalue(objvalue) global Cmin; fitvalue=objvalue-Cmin;
改进遗传算法求解TSP问题的Matlab程序设计

2 1 年 6月 01
湖 南 工 程 学 院 学 报
Vo . 1 No 2 12 _ .
J n 0 1 u e2 1
J u n l fHu a n tt t fEn ie r g o r a n n I si eo g n e i o u n
改 进 遗 传 算 法 求 解 TS 问 题 的 M a lb 程 序 设 计 P ta
f n t n p p— TS nt l e( OP I E, u ci o o Piii i P az SZ NCI —
TI ) ES
直接 将它们 复 制 到下 一 代 群 体 中. 文 中用 a表 示 本
最优 个体 保存 的 比例 .
f n t n p p — s lc ( e g h, OP I E, i u ci o o ee t L n t P SZ ft — n s , o D , C TI e s p p, N I ES, ) a t - o n ( OP I E *a -  ̄ ru d P SZ );
关键 词 :改进遗 传算 法 ; P问题 ; t b程序 TS Mal a 中 图分类号 :TP 9 31 文献标 识码 :A 文章 编号 :1 7 一 l9 2 1 ) 2 O 2 4 6 1 1X( O 1 0 一O 4 —0
0 引 言
旅 行 商 问 题 ( a eig ae n P o lm, Trv l S lma rbe n TS ) 又 叫货 郎担 问题 , P , 是最基 本 的路 线 问题 , 问 该
e nd
p etj : = p p M () : ; b s(, ) o ( j , )
e nd
3 2 适 应 度评 估 .
遗传算法matlab代码

function youhuafunD=code;N=50; % Tunablemaxgen=50; % Tunablecrossrate=0.5; %Tunablemuterate=0.08; %Tunablegeneration=1;num = length(D);fatherrand=randint(num,N,3);score = zeros(maxgen,N);while generation<=maxgenind=randperm(N-2)+2; % 随机配对交叉A=fatherrand(:,ind(1:(N-2)/2));B=fatherrand(:,ind((N-2)/2+1:end));% 多点交叉rnd=rand(num,(N-2)/2);ind=rnd tmp=A(ind);A(ind)=B(ind);B(ind)=tmp;% % 两点交叉% for kk=1:(N-2)/2% rndtmp=randint(1,1,num)+1;% tmp=A(1:rndtmp,kk);% A(1:rndtmp,kk)=B(1:rndtmp,kk);% B(1:rndtmp,kk)=tmp;% endfatherrand=[fatherrand(:,1:2),A,B];% 变异rnd=rand(num,N);ind=rnd [m,n]=size(ind);tmp=randint(m,n,2)+1;tmp(:,1:2)=0;fatherrand=tmp+fatherrand;fatherrand=mod(fatherrand,3);% fatherrand(ind)=tmp;%评价、选择scoreN=scorefun(fatherrand,D);% 求得N个个体的评价函数score(generation,:)=scoreN;[scoreSort,scoreind]=sort(scoreN);sumscore=cumsum(scoreSort);sumscore=sumscore./sumscore(end);childind(1:2)=scoreind(end-1:end);for k=3:Ntmprnd=rand;tmpind=tmprnd difind=[0,diff(t mpind)];if ~any(difind)difind(1)=1;endchildind(k)=scoreind(logical(difind));endfatherrand=fatherrand(:,childind);generation=generation+1;end% scoremaxV=max(score,[],2);minV=11*300-maxV;plot(minV,'*');title('各代的目标函数值');F4=D(:,4);FF4=F4-fatherrand(:,1);FF4=max(FF4,1);D(:,5)=FF4;save DData Dfunction D=codeload youhua.mat% properties F2 and F3F1=A(:,1);F2=A(:,2);F3=A(:,3);if (max(F2)>1450)||(min(F2)<=900)error('DATA property F2 exceed it''s range(900,1450]')end% get group property F1 of data, according to F2 value F4=zeros(size(F1));for ite=11:-1:1index=find(F2<=900+ite*50);F4(index)=ite;endD=[F1,F2,F3,F4];function ScoreN=scorefun(fatherrand,D)F3=D(:,3);F4=D(:,4);N=size(fatherrand,2);FF4=F4*ones(1,N);FF4rnd=FF4-fatherrand;FF4rnd=max(FF4rnd,1);ScoreN=ones(1,N)*300*11;% 这里有待优化for k=1:NFF4k=FF4rnd(:,k);for ite=1:11F0index=find(FF4k==ite);if ~isempty(F0index)tmpMat=F3(F0index);tmpSco=sum(tmpMat);ScoreBin(ite)=mod(tmpSco,300);endendScorek(k)=sum(ScoreBin);endScoreN=ScoreN-Scorek;遗传算法实例:% 下面举例说明遗传算法 %% 求下列函数的最大值 %% f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] %% 将 x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为 (10-0)/(2^10-1)≈0.01 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.遗传算法解决TSP 问题(附matlab源程序)2.知n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市3.只能访问一次,最后又必须返回出发城市。
如何安排他对这些城市的访问次序,可使其4.旅行路线的总长度最短?5.用图论的术语来说,假设有一个图g=(v,e),其中v是顶点集,e是边集,设d=(dij)6.是由顶点i和顶点j之间的距离所组成的距离矩阵,旅行商问题就是求出一条通过所有顶7.点且每个顶点只通过一次的具有最短距离的回路。
8.这个问题可分为对称旅行商问题(dij=dji,,任意i,j=1,2,3,…,n)和非对称旅行商9.问题(dij≠dji,,任意i,j=1,2,3,…,n)。
10.若对于城市v={v1,v2,v3,…,vn}的一个访问顺序为t=(t1,t2,t3,…,ti,…,tn),其中11.ti∈v(i=1,2,3,…,n),且记tn+1= t1,则旅行商问题的数学模型为:12.min l=σd(t(i),t(i+1)) (i=1,…,n)13.旅行商问题是一个典型的组合优化问题,并且是一个np难问题,其可能的路径数目14.与城市数目n是成指数型增长的,所以一般很难精确地求出其最优解,本文采用遗传算法15.求其近似解。
16.遗传算法:17.初始化过程:用v1,v2,v3,…,vn代表所选n个城市。
定义整数pop-size作为染色体的个数18.,并且随机产生pop-size个初始染色体,每个染色体为1到18的整数组成的随机序列。
19.适应度f的计算:对种群中的每个染色体vi,计算其适应度,f=σd(t(i),t(i+1)).20.评价函数eval(vi):用来对种群中的每个染色体vi设定一个概率,以使该染色体被选中21.的可能性与其种群中其它染色体的适应性成比例,既通过轮盘赌,适应性强的染色体被22.选择产生后台的机会要大,设alpha∈(0,1),本文定义基于序的评价函数为eval(vi)=al23.pha*(1-alpha).^(i-1) 。
[随机规划与模糊规划]24.选择过程:选择过程是以旋转赌轮pop-size次为基础,每次旋转都为新的种群选择一个25.染色体。
赌轮是按每个染色体的适应度进行选择染色体的。
26.step1 、对每个染色体vi,计算累计概率qi,q0=0;qi=σeval(vj) j=1,…,i;i=1,27.…pop-size.28.step2、从区间(0,pop-size)中产生一个随机数r;29.step3、若qi-1 step4、重复step2和step3共pop-size次,这样可以得到pop-size个复制的染色体。
30.grefenstette编码:由于常规的交叉运算和变异运算会使种群中产生一些无实际意义的31.染色体,本文采用grefenstette编码《遗传算法原理及应用》可以避免这种情况的出现32.。
所谓的grefenstette编码就是用所选队员在未选(不含淘汰)队员中的位置,如:33.8 15 2 16 10 7 4 3 11 14 6 12 9 5 18 13 17 134.对应:35.8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 1。
36.交叉过程:本文采用常规单点交叉。
为确定交叉操作的父代,从到pop-size重复以下过37.程:从[0,1]中产生一个随机数r,如果r 将所选的父代两两组队,随机产生一个位置进行交叉,如:38.8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 139. 6 12 3 5 6 8 5 6 3 1 8 5 6 3 3 2 1 140.交叉后为:41.8 14 2 13 8 6 3 2 5 1 8 5 6 3 3 2 1 142. 6 12 3 5 6 8 5 6 3 7 3 4 3 2 4 2 2 143.变异过程:本文采用均匀多点变异。
类似交叉操作中选择父代的过程,在r 选择多个染色体vi作为父代。
对每一个选择的父代,随机选择多个位置,使其在每位置44.按均匀变异(该变异点xk的取值范围为[ukmin,ukmax],产生一个[0,1]中随机数r,该点45.变异为x'k=ukmin+r(ukmax-ukmin))操作。
如:46.8 14 2 13 8 6 3 2 5 7 3 4 3 2 4 2 2 147.变异后:48.8 14 2 13 10 6 3 2 2 7 3 4 5 2 4 1 2 149.反grefenstette编码:交叉和变异都是在grefenstette编码之后进行的,为了循环操作50.和返回最终结果,必须逆grefenstette编码过程,将编码恢复到自然编码。
51.循环操作:判断是否满足设定的带数xzome,否,则跳入适应度f的计算;是,结束遗传52.操作,跳出。
53.54.55.56.matlab 代码57.58.59.60.distTSP.txt61.0 6 18 4 862.7 0 17 3 763. 4 4 0 4 564.20 19 24 0 2265.8 8 16 6 066.%GATSP.m67.function gatsp1()68.clear;69.load distTSP.txt;70.distance=distTSP;71.N=5;72.ngen=100;73.ngpool=10;74.%ngen=input('# of generations to evolve = ');75.%ngpool=input('# of chromosoms in the gene pool = '); % size of genepool76.gpool=zeros(ngpool,N+1); % gene pool77.for i=1:ngpool, % intialize gene pool78.gpool(i,:)=[1 randomize([2:N]')' 1];79.for j=1:i-180.while gpool(i,:)==gpool(j,:)81.gpool(i,:)=[1 randomize([2:N]')' 1];82.end83.end84.end85.86.costmin=100000;87.tourmin=zeros(1,N);88.cost=zeros(1,ngpool);89.increase=1;resultincrease=1;90.for i=1:ngpool,91.cost(i)=sum(diag(distance(gpool(i,:)',rshift(gpool(i,:))')));92.end93.% record current best solution94.[costmin,idx]=min(cost);95.tourmin=gpool(idx,:);96.disp([num2str(increase) 'minmum trip length = ' num2str(costmin)])97.98.costminold2=200000;costminold1=150000;resultcost=100000;99.tourminold2=zeros(1,N);100.tourminold1=zeros(1,N);101.resulttour=zeros(1,N);102.while (abs(costminold2-costminold1) ;100)&(abs(costminold1-costmin) ;100)&(increase ;500) 103.104.costminold2=costminold1; tourminold2=tourminold1;105.costminold1=costmin;tourminold1=tourmin;106.increase=increase+1;107.if resultcost>costmin108.resultcost=costmin;109.resulttour=tourmin;110.resultincrease=increase-1;111.end112.for i=1:ngpool,113.cost(i)=sum(diag(distance(gpool(i,:)',rshift(gpool(i,:))')));114.end115.% record current best solution116.[costmin,idx]=min(cost);117.tourmin=gpool(idx,:);118.%==============119.% copy gens in th gpool according to the probility ratio120.% >1.1 copy twice121.% >=0.9 copy once122.% ;0.9 remove123.[csort,ridx]=sort(cost);124.% sort from small to big.125.csum=sum(csort);126.caverage=csum/ngpool;127.cprobilities=caverage./csort;128.copynumbers=0;removenumbers=0;129.for i=1:ngpool,130.if cprobilities(i) >1.1131.copynumbers=copynumbers+1;132.end133.if cprobilities(i) <0.9134.removenumbers=removenumbers+1;135.end136.end137.copygpool=min(copynumbers,removenumbers);138.for i=1:copygpool139.for j=ngpool:-1:2*i+2 gpool(j,:)=gpool(j-1,:);140.end141.gpool(2*i+1,:)=gpool(i,:);142.end143.if copygpool==0144.gpool(ngpool,:)=gpool(1,:);145.end146.%=========147.%when genaration is more than 50,or the patterns in a couple are too close,do mutation 148.for i=1:ngpool/2149.%150.sameidx=[gpool(2*i-1,:)==gpool(2*i,:)];151.diffidx=find(sameidx==0);152.if length(diffidx)<=2153.gpool(2*i,:)=[1 randomize([2:12]')' 1];154.end155.end156.%===========157.%cross gens in couples158.for i=1:ngpool/2159.[gpool(2*i-1,:),gpool(2*i,:)]=crossgens(gpool(2*i-1,:),gpool(2*i,:));160.end161.162.for i=1:ngpool,163.cost(i)=sum(diag(distance(gpool(i,:)',rshift(gpool(i,:))')));164.end165.% record current best solution166.[costmin,idx]=min(cost);167.tourmin=gpool(idx,:);168.disp([num2str(increase) 'minmum trip length = ' num2str(costmin)])169.end170.171.disp(['cost function evaluation: ' int2str(increase) ' times!'])172.disp(['n:' int2str(resultincrease)])173.disp(['minmum trip length = ' num2str(resultcost)])174.disp('optimum tour = ')175.disp(num2str(resulttour))176.%====================================================177.function B=randomize(A,rowcol)178.% Usage: B=randomize(A,rowcol)179.% randomize row orders or column orders of A matrix180.% rowcol: if =0 or omitted, row order (default)181.% if = 1, column order182.183.rand('state',sum(100*clock))184.if nargin == 1,185.rowcol=0;186.end187.if rowcol==0,188.[m,n]=size(A);189.p=rand(m,1);190.[p1,I]=sort(p);191.B=A(I,:);192.elseif rowcol==1,193.Ap=A';194.[m,n]=size(Ap);195.p=rand(m,1);196.[p1,I]=sort(p);197.B=Ap(I,:)';198.end199.%===================================================== 200.function y=rshift(x,dir)201.% Usage: y=rshift(x,dir)202.% rotate x vector to right (down) by 1 if dir = 0 (default) 203.% or rotate x to left (up) by 1 if dir = 1204.if nargin ;2, dir=0; end205.[m,n]=size(x);206.if m>1,207.if n == 1,208.col=1;209.elseif n>1,210.error('x must be a vector! break');211.end % x is a column vectorelseif m == 1,212.if n == 1, y=x;213.return214.elseif n>1,215.col=0; % x is a row vector endend216.if dir==1, % rotate left or up217.if col==0, % row vector, rotate left218.y = [x(2:n) x(1)];219.elseif col==1,。