一些解決TSP問題的算法及源代碼_第1頁
一些解決TSP問題的算法及源代碼_第2頁
一些解決TSP問題的算法及源代碼_第3頁
一些解決TSP問題的算法及源代碼_第4頁
一些解決TSP問題的算法及源代碼_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、模擬退火算法模擬退火算法來源于同體退火原理,將同體加溫至充分高,再讓英徐徐冷卻, 加溫時,固體內(nèi)部粒子隨溫升變?yōu)闊o序狀,內(nèi)能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達(dá)到平衡態(tài),最后在 常溫時達(dá)到基態(tài),內(nèi)能減為最小。根據(jù)metropolis準(zhǔn)則,粒了在溫度t時趨于平衡的概率為e-ae/(kt),其中e為溫度t時的 內(nèi)能,ae為其改變量,k為boltzmann常數(shù)。用固1 本退火模擬組合優(yōu)化問題,將內(nèi)能e模擬為目標(biāo)函數(shù)值f,溫度t演化成控制參 數(shù)t,即得到解組合優(yōu)化問題的模擬退火算法:由初始解i和控制參數(shù)初值t開始,對當(dāng)前解重復(fù)''產(chǎn)生新解-計(jì)算目標(biāo)函數(shù)差一接 受或舍棄的迭代,

2、并逐步衰減t值,算法終止時的當(dāng)前解即為所得近似最優(yōu)解,這是基于蒙特卡羅迭代求解法的一種啟發(fā)式隨 機(jī)搜索過程。退火過程由冷卻進(jìn)度表(coolingschedule)控制,包括控制參數(shù)的初值t及其衰減因子公、每個t值吋的迭代 次數(shù)l和停止條件s。3.5.1模擬退火算法的模型模擬退火算法可以分解為解空間、目標(biāo)函數(shù)和初始解三部分。模擬退火的基本思想.(1) 初始化:初始溫度t(充分大),初始解狀態(tài)s(是算法迭代的起點(diǎn)),每 個t值的迭代次數(shù)l(2) 對k=l,l做第(3)至第6步:(3) 產(chǎn)生新解sz(4) 計(jì)算增量atqso-qs),其中c(s)為評價函數(shù)(5) 若mvo則接受寧作為新的當(dāng)前解,否則

3、以概率exp(m7t)接受寧作 為新的當(dāng)前解.(6) 如果滿足終止條件則輸出當(dāng)前解作為最優(yōu)解,結(jié)束程序。 終止條件通常取為連續(xù)若干個新解都沒冇被接受時終止算法。(7) t逐漸減少,口0,然后轉(zhuǎn)第2步。算法對應(yīng)動態(tài)演示圖:模擬退火算法新解的產(chǎn)生和接受可分為如下四個步驟:第一步是由一個產(chǎn)生函數(shù)從當(dāng)前解產(chǎn)生一個位于解空間的新解;為便于后續(xù) 的計(jì)算和接受,減少算法耗時,通常選擇由當(dāng)前新解經(jīng)過簡單地變換即可產(chǎn)牛新解的方法,如對構(gòu)成新解的全部或部分元 素進(jìn)行置換、互換等,注意到產(chǎn)生新解的變換方法決定了當(dāng)前新解的鄰域結(jié)構(gòu),因而對冷卻進(jìn)度表的選取有一定的影響。 第二步是計(jì)算與新解所對應(yīng)的目標(biāo)函數(shù)弟。因?yàn)槟繕?biāo)函

4、數(shù)羞僅由變換部分產(chǎn) 生,所以目標(biāo)函數(shù)差的計(jì)算最好按增量計(jì)算。事實(shí)表明,對大多數(shù)應(yīng)用而言,這是計(jì)算目標(biāo)函數(shù)茅的最快方法。第三步是判斷新解是否被接受,判斷的依據(jù)是一個接受準(zhǔn)則,最常用的接受 準(zhǔn)則是metropolis準(zhǔn)貝u:若atz<0則接受s,作為新的當(dāng)前解s,否則以概率exp(m7t)接受s,作為新的當(dāng)前解so 第四步是當(dāng)新解被確定接受時,用新解代替當(dāng)前解,這只需將當(dāng)前解中對應(yīng) 于產(chǎn)生新解時的變換部分予以實(shí)現(xiàn),同時修正目標(biāo)函數(shù)值即可。此時,當(dāng)前解實(shí)現(xiàn)了一次迭代??稍诖嘶A(chǔ)上開始下一輪 試驗(yàn)。而當(dāng)新解被判定為舍棄時,則在原當(dāng)前解的基礎(chǔ)上繼續(xù)下一輪試驗(yàn)。模擬退火算法與初始值無關(guān),算法求得的解

5、與初始解狀態(tài)s(是算法迭代的 起點(diǎn))無關(guān);模擬退火算法具有漸近收斂性,已在理論上被證明是一種以概率i收斂于全局最優(yōu)解的全局優(yōu)化算法;模擬退火 算法具有并行性。3.5.2模擬退火算法的簡單應(yīng)用作為模擬退火算法應(yīng)用,討論貨郎擔(dān)問題(travelling salesman problem, 簡記為tsp):設(shè)有n個城市,用數(shù)碼代表。城市i和城市jz間的距離為d(i, j) iz j=lz.,n. tsp問題是要找遍訪每個 域市恰好一次的一條冋路,口其路徑總氏度為最短。求解tsp的模擬退火算法模型可描述如下:解空間解空間s是遍訪每個城市恰好一次的所有回路,是1,n的 所有循環(huán)排列的集合,s中的成員記為

6、(wl,w2,.» wn),并記wn+l= wlo初始解可選為(1, ,n)口標(biāo)函數(shù) 此吋的口標(biāo)函數(shù)即為訪問所有城市的路徑總長度或稱為代價函 數(shù):我們要求此代價函數(shù)的最小值。新解的產(chǎn)生隨機(jī)產(chǎn)生1和nz間的兩相異數(shù)k和m,若kvm,則將(wlz w2 ,wk , wk+l wm wn)變?yōu)椋?wl, w2 wm z wm-1 wk+1 , wk wn)如果是k>m,則將(wl, w2 ,,wk z wk+1 wm wn)變?yōu)椋?wm, wm-1 wl z wm+l wk-1 ,wn / wn-1 z., wk).上述變換方法可簡單說成是''逆轉(zhuǎn)中間或者逆轉(zhuǎn)兩端。也

7、可以采用其他的變換方法,有些變換有獨(dú)特的優(yōu)越性,有時也將它們交替 使用,得到一種更好方法。代價函數(shù)差設(shè)將(wl, w2 z,wn)變換為(ul, u2 ,un)z則代價函 數(shù)差為:根據(jù)上述分析,可寫岀用模擬退火算法求解tsp問題的偽程序:procedure tspsa:begininit-of-t; t為初始溫度s=1,n; s為初始值terminatio n=false;while termination=falsebeginfor i=l to l dobegingeneratefsorm s); 從當(dāng)前回路s產(chǎn)生新回路s。at:=f(sz)-f(s);f(s)為路徑總長if(at<

8、0) or (exp(-at/t)>random-of-ozlj)s=sz;if the-halt-condition-is-true thenterminatio n=true;end;tjower;end;end模擬退火算法的應(yīng)用很廣泛,可以較高的效率求解最大截問題(max cut pr oblem)、01 背包問題(zero one knapsackproblem)、圖著色問題(graph colouring problem)、調(diào)度問題(scheduling problem)等等。3.5.3模擬退火算法的參數(shù)控制問題模擬退火算法的應(yīng)用很廣泛,可以求解np完全問題,但其參數(shù)難以控制,

9、 其主要問題有以下三點(diǎn):(1) 溫度t的初始值設(shè)置問題。溫度t的初始值設(shè)置是影響模擬退火算法全局搜索性能的重要因素乞一、初 始溫度高,則搜索到全局最優(yōu)解的可能性大,但因此?;ㄙM(fèi)大量的計(jì)算時間;反之,則可節(jié)約計(jì)算時間,但全局搜索性能可 能受到影響。實(shí)際應(yīng)用過程中,初始溫度一般需要依據(jù)實(shí)驗(yàn)結(jié)杲進(jìn)行若干次調(diào)整。(2) 退火速度問題。模擬退火算法的全局搜索性能也與退火速度密切相關(guān)。一般來說,同一溫度 下的''充分搜索(退火)是相當(dāng)必要的,但這需要計(jì)算時間。實(shí)際應(yīng)用中,要針對具體問題的性質(zhì)和特征設(shè)置合理的退火 平衡條件。(3) 溫度管理問題。溫度管理問題也是模擬退火算法難以處理的問題之一

10、。實(shí)際應(yīng)用屮,由于必 須考慮計(jì)算復(fù)雜度的切實(shí)可行性等問題,常采用如下所示的降溫方式:t(t+l) = kxt(t)式中k為正的略小于1.00的常數(shù),t為降溫的次數(shù)使用sa解決tsp問題的matlab程序:function out = tsp(loc)% tsp traveling salesman problem (tsp) using sa (simulated annealing).% tsp by itself will generate 20 cities within a unit cube and% then use sa to slove this problem% % tsp(

11、loc) solve the traveling salesman problem with cities*% coordinates given by loc, which is an m by 2 matrix and m is% the number of cities% for example:% loc = rand(50z 2);% tsp(loc);if nargin = 0,% the following data is from the post by jennifer myers (jmyersnwu. edu)edu)% to comp.ai.neural-nets it

12、's obtained from the figure in% hopfield & tank's 1985 paper in biological cybernetics% (vol 52, pp. 141-152)loc = 0.3663, 0.9076; 0.7459, 0.8713; 0.4521, 0.8465;0.7624, 0.7459; 0.7096,0.4224, 0.7129; 0.5908,0.5974, 0.6436; 0.3630,0.6172, 0.5495; 0.6667,0.3498, 0.4488; 0.2673,0.8218, 0.3

13、795; 0.3729,0.4158, 0.2475; 0.5990,0.5347, 0.1898; 0.3960,0.5000, 0.0396; 0.9802, end0.7228; 0.0710, 0.7426;0.6931; 0.3201, 0.6403;0.5908; 0.6700, 0.5908;0.5446; 0.1980, 0.4686;0.4274; 0.9439, 0.4208;0.2690; 0.6073, 0.2640;0.2261; 0.3927, 0.1947;0.1320; 0.6287, 0.0842;0.0182; 0.6832, 0.8515;numcity

14、= length(loc); % number of citiesdistanee = zeros(numcity); % initialize a distanee matrix% fill the distanee matrixfor i = 1:numcity,for j = 1:numcity,distance(i, j) = norm(loc(iz - locq,); distance(i, j) = norm(loc(i, - loc(j,); end end% to gen erate en ergy (objective function) from path% path =a

15、n dperm(numcity);%energy = sum(distance(path-l)*numcity + path(2:numcity) path(l); % find typical values of decount = 20;all_de = zeros(co unt, 1);for i = l:countpath = ran dperm(numcity);energy = sum(dista nce(pathl)*numcity + path(2:numcity) path(l);n ew_path = path;index = round(rand(2,l)*numcity

16、+.5);inversion_in dex = (min(in dex):max(i ndex);n ew_path(i nversio nn dex) = fliplr(path(inversio dex); all_de(i) = abs(energy sum(sum(diff(loc(new_path new_path(l),)'.a2);endde = max(all_de);de = max(all_de);temp = 10*de; % choose the temperature to be large eno ugh fpintf('initial energy

17、 = %fnn:energy);% initial plotsout = path path(l);plot(loc(out(, 1), loc(out(, 2)/r.*z 'markersize', 20);axis square; hold onh = plot(loc(out(, l)z loc(out(, 2); hold offmaxtrialn = numcity*100; % max. # of trials at a temperaturemaxacceptn = numcity*10; % max. # of acceptances at a temperat

18、urestoptolerance = 0.005; % stopping toleraneetempratio = 0.5; % temperature decrease ratio mine = inf; % initial value for min. energy maxe = -1; % initial value for max energy % major annealing loop while (maxe - mine)/maxe > stoptoleranee,mine = inf;mine = inf;maxe = 0;trialn = 0; % number of

19、trial movesacceptn = 0; % number of actual moves while trialn < maxtrialn & acceptn < maxacceptn, n ew_path = path;index = round(rand(2,l)*numcity+.5);in versi on_in dex = (min(index):max(i ndex);n ew_path(i nvesion_index)= fliplr(path(i nversi on_in dex); new_energy = sum(distance( (new_p

20、ath-l)*numcity+new_path(2:numcity) new_path(l);if rand < exp(energy - new_energy)/temp), % acceptit!energy = n ew_energy;path = n ew_path; mine = min(mine, energy); maxe = max(maxe, energy);acceptn = acceptn + 1;endtrialn = trialn + 1;endend% update plotout = path path(l);set(hz 'xdata1, loc(

21、out(, 1), vdata', loc(out(, 2);draw now;% print in formati on in comma nd windowfprintf(*temp= %fn: temp); tmp = sprintf('%d :path);fprintf('path = %sn'z tmp); fprintf('energy = %frt, energy);fprintfftmine maxe = %f %fn mine, maxe); fprintf(*acceptn trialn = %d %dnn*z acceptn, tr

22、ialn); % lower the temperature temp = temp*tempratio;end% print sequential numbers in the graphic window for i = 1:numcity,text(loc(path(i)zl)+0.01z loc(path(i),2)+0.01, int2str(i),.yontsize', 8); end乂一個和關(guān)的matlab程序fun ction x, p=zkp( w,c, m ,to,tf)m,n=size(w);l=100*n;t=to; clear m;x=zeros(l, n)

23、xmax=x;fmax=0;while t>tf for k=l:l xr=change(x) gx=g_o_l(w,x); gxr=g_o_l(w,xr); if gxr<=m fr=f_0_l(xr,c); f=f_0_l(x,c); df=fr-f;if df>0x=xr;if fr>fmax fmax=fr; xmax=xr; end else p=ra nd;if p<exp(df/t)x=xr;endendendendt=0.87*tendp=fmax;x=xmax;%下面的函數(shù)產(chǎn)生新解function d_fq=exchange_2(pi0/d) m

24、,n=size(d);clear m;u=rand; u=u*(n-2); u=roun d(u);pi_l(k)=pio(k);endendif v>(u+l)for k=l:(v-u-l)pi_l(u+k)=pio(v-k);endendif vvnfor k=(v+l):npi_l(k)=pio(k);endendd_f=0;if vvn d_f=d(pio(u-l),pio(v)+d(pio(u)zpio(v+l);for k=(u+l):nd_f=d_f+d(pio(k),pio(k-l)-d(pio(v),pio(v+l);endd_f=d_f-d(pio(u-l),pio(

25、u);for k=(u+l):nd_f=d_f-d(pio(k-l),pio(k);endelsed_f=d(pio(u-l),pio(v)+d(pio(u),pio(l)-d(pio(u-l)zpio(u)-d(pio(v),pio(l); for k=(u+l):nd_f=d_f-d(pio(k),pio(k-l);endfor k=(u+l):nd_f=d_f-d(pio(k-l)zpio(k);endendpi=pl1;遺傳算法ga遺傳算法:旅行商問題(traveling saleman problem,簡稱 tsp):已知n個城市z間的相互距離,現(xiàn)有一個推銷員必須遍訪這n個城市,并且

26、每 個城市只能訪問一次,最后又必須返回出發(fā)城市。如何安排他對這些城市的訪問 次序,可使其旅行路線的總長度最短?用圖論的術(shù)語來說,假設(shè)有一個圖g=(vze),其屮v是頂點(diǎn)集,e是邊集,設(shè)d =(dij)是曲頂點(diǎn)i和頂點(diǎn)j之間的距離所組成的距離矩陣,旅行商問題就是求出一 條通過所有頂點(diǎn)且每個頂點(diǎn)只通過一次的具有最短距離的回路。這個問題可分為對稱旅行商問題(dij=dji任意i,j=123,川)和川:對稱旅行商問 題(dij*dji任意 i,j=lz2,3, .,n)0若對于城市 v=vlzv2,v3,.zvn的一個訪問順序?yàn)?t=(tl,t2zt3/.,tiz.ztn)/k+ ti ev(i=l,

27、2,3/.zn),且記tn+l= tl,則旅行商問題的數(shù)學(xué)模型為:min l=od(t(i)zt(i+l) (i=l,.,n)旅行商問題是一個典型的組合優(yōu)化問題,并月是一個np難問題,其可能的路徑 數(shù)目與城山數(shù)目n是成指數(shù)型增長的,所以一般很難精確地求岀其最優(yōu)解,本文 采用遺傳算法求其近似解。遺傳算法:初始化過程:用vl,v2,v3z.zvn代表所選n個城市。定義整數(shù)pop-size作為染色 體的個數(shù),并且隨機(jī)產(chǎn)生pop-size個初始染色體,每個染色體為1到18的整數(shù) 組成的隨機(jī)序列。適應(yīng)度f的計(jì)算:對種群屮的每個染色體vi,計(jì)算其適應(yīng)度,f=crd(t(i),t(i+l) 評價函數(shù)eval

28、(vi):用來對種群中的每個染色體vi設(shè)定-個概率,以使該染色體 被選中的可能性與其種群中其它染色體的適丿、0性成比例,既通過輪盤賭,適應(yīng)性 強(qiáng)的染色體被選擇產(chǎn)生后臺的機(jī)會要大,設(shè)alphae(0,l),本文定義基于序的評 價函數(shù)為eval(vi)=alpha*(l-alpha).a(i-l) <> 隨機(jī)規(guī)劃與模糊規(guī)劃 選擇過程:選擇過程是以旋轉(zhuǎn)賭輪pop-size次為基礎(chǔ),每次旋轉(zhuǎn)都為新的種群 選擇一個染色體。賭輪是按每個染色體的適應(yīng)度進(jìn)行選擇染色體的。stepl、對每個染色體 vi,計(jì)算累計(jì)概率 qi, qo=o;qi=aeval(vj) j=l,.,i;i=lz.p op-s

29、ize.step2、從區(qū)間(o,pop-size)中產(chǎn)生一個隨機(jī)數(shù)r;step3、若qi-l<r<qiz則選擇第i個染色體:step4、重旨step2和step3共popsize次,這樣可以得到pop-size個復(fù)制的染 色箱。grefenstette編碼:出于常規(guī)的交叉運(yùn)算和變異運(yùn)算會使種群中產(chǎn)生一些無實(shí)際 意義的染色體,木文采用grefenstette編碼遺傳算法原理及丿應(yīng)用可以避免這 種情況的出現(xiàn)。所謂的grefenstette編碼就是用所選隊(duì)員在未選(不含淘汰)隊(duì) 員中的位置,女口:8 15 2 16 10 7 4 3 11 14 6 12 9 5 18 13 17 1對應(yīng)

30、:8 14 2 13 8632573432422 lo交叉過程:本文采用常規(guī)單點(diǎn)交叉。為確定交叉操作的父代,從到pop-size重 復(fù)以下過程:從0, 1中產(chǎn)生一個隨機(jī)數(shù)r,如果rvpc,則選擇vi作為一個父 代。將所選的父代兩兩組隊(duì),隨機(jī)產(chǎn)生一個位置進(jìn)行交叉,如:8 14 2 13 863257343242216 12 3568563185633211交叉后為:8 14 2 13 863251856332116 12 3568563734324221變異過程:木文采用均勻多點(diǎn)變異。類似交叉操作中選擇父代的過程,在rvpm 的標(biāo)準(zhǔn)下選擇多個染色體vi作為父代。對每一個選擇的父代,隨機(jī)選擇多個位

31、 置,使其在每位置按均勻變開(該變開點(diǎn)xk的取值范圍為ukmin,ukmaxz產(chǎn)牛 一個0, 1屮隨機(jī)數(shù)r,該點(diǎn)變界為x'k=ukmin4-r(ukmax-ukmin)操作。女口:8 14 2 13 86325734324221變異后:8 14 2 13 10 6322734524121反grefenstette編碼:交叉和變界都是在grefenstette編碼之后進(jìn)行的,為了循 環(huán)操作和返冋最終結(jié)果,必須逆grefenstette編碼過程,將編碼恢復(fù)到自然編碼。 循環(huán)操作:判斷是否滿足設(shè)定的帶數(shù)xzome,否,則跳入適應(yīng)度f的計(jì)算;是, 結(jié)束遺傳操作,跳出。matlab 程序:fun

32、ction bestpop,trace=ga(d,termops,numzpc,cxops,pm,alpha)%bestpop,trace=ga(d,termops, nu m,pc,cxopszpm,alpha)%d:距離矩陣%termops:種群代數(shù)%num:每代染色體的個數(shù)%pc:交叉概率%cxops:由丁木程序采用單點(diǎn)交叉,交叉點(diǎn)的設(shè)置在木程序中沒有很好的解決, 所以本文了采用定點(diǎn),即第cxops,可以隨機(jī)產(chǎn)生。%pm:變異概率%alpha:評價函數(shù) eval(vi)=alpha*(l-alpha).a(i-l).% bestpop:返冋的最優(yōu)種群%trace:iit 化軌跡%#版權(quán)所

33、有!歡迎廣大網(wǎng)友改止,改進(jìn)! #%e-mail:tobysid ney33%#%citynum=size©2);n=nargin;if n<2disp('缺少變量!')dispq/開個玩笑a_a,)endif nv2termops=500;num=50;pc=0.25;cxops=3;pm=0.30;alpha=0.10;endif n<3nu m=50;pc=0.25;cxops=3;pm=0.30;alpha=0.10;endif nv4pc=0.25;cxops=3;pm=0.30;alpha=0.10;endif n<5cxops=3;pm=

34、0.30;alpha=0.10;endif n<6pm=0.30;alpha=0.10;endif n<7alpha=0.10;endif isempty(cxops) cxops=3;endt=initializega(num,city num); for i=l:termopsl=f©t);x,y=find(l=max (i);trace(i)=-l(y(l); bestpop=t(y(l),:); t=select(t,l,alpha);g=grefenstette(t);gl=crossover(g, pc,cxops);g=mutation(gl,pm); %均

35、勻變異t=con g refen stette(g); endfunction t=initializega(num,citynum) for i=l:numt(i,:)=ra ndperrn(city num); endfor k=l:m for i=l:n-l l(k,i)=d(t(k,i),t(k,i+l); end l(k,n)=d(t(kzn),t(k,l); l(k)=-sum(l(k,:);end function t=select(t,l,alpha) m,n=size(l);tl=t;beforesort,aftersortl=sort(l,2);%fsort from i

36、to u for i=l:naftersort(i)=aftersortl(n+li); %changeendfor k=l:n;t(kz :)=tl(aftersort(k),:);ll(k)=l(aftersort(k);endtl=t;1=11;for i=l:size(aftersortz2) evalv(i)=alpha*(l-alpha).a(i-l); endm=size(t,l); q=cumsum(evalv); qmax=max(q);for k=l:mr=qmax*ra nd(l);for j=l:mif j=l&rv=q(l)elseif j=l&r&g

37、t;q0-l)&r<=q(j)t(k/:)=tia/:);endm,n=size(t);for k=l:m to=l:n;for i=l:nfor j=l:length(to) if t(k,i)=too) g(k,d=j; tog)=;breakfunction g=crossover(g,pc£xops)m,n=size(g);ran=ran d(lzm);r=cxops;x,ru=fi nd(ra nv pc);if ru>=2for k=l:2:length(ru)-lgl(ru(k)z:)=g(ru(k)zl:r)zg(ru(k+l),(r+l):n);

38、 g(ru(k+l)/:)=g(ru(k+l)/l:r)/g(ru(k)/(r+l):n); g(ru(k)/:)=gl(ru(k)z:);endend function g=mutation(gzpm) %均勻變異 m,n=size(g);d(l,m);r=rand(l,3); %dai gai jin rr=floor(n*rand(l,3)+l); x,mu=fi nd(ra nvpm);for k=l:length(mu)for i=l:length(r) umax(i)=n+l-rr(i); umin (i)=l; g(mu(k)zrr(i)=umin(i)+floor(umax(i

39、)-umin(i)*r(i); end end function t=congrefenstette(g)mzn=size(g);for k=l:mto=l:n;for i=l:nt(k,i)=to(g(kzi);to(g(k,i)=;endend乂一個matlab程序,其中交叉算法采用的是由goldberg和lingle于1985 年提出的pmx(部分匹配交叉),淘汰保護(hù)指數(shù)alpha是我自己設(shè)計(jì)的,起到了加 速優(yōu)勝劣汰的作用。%tsp問題(又名:旅行商問題,貨郎擔(dān)問題)遺傳算法通用matlab程序 %d是距離矩陣,n為種群個數(shù),建議取為城市個數(shù)的12倍,%c為停止代數(shù),遺傳到第c代時程序停

40、止,c的具體取值視問題的規(guī)模和耗費(fèi) 的吋間而定%m為適應(yīng)值歸一化淘汰加速指數(shù),最好取為1,2,33 '不宜太大%alpha為淘汰保護(hù)指數(shù),可取為01 z間任意小數(shù),取1時關(guān)閉保護(hù)功能,最好取 為 0.8-1.0%r為最短路徑,rlength為路徑長度function rzrlength=genetictsp(d,n,c,m,alpha)n,nn=size(d); farm=zeros(n,n);% 用 丁存儲種群 for i=l:n farm(i,:)=randperm(n);%隨機(jī)生成初始種群 endr=farm(l,:);%存儲最優(yōu)種群 len=zeros(n,l);%存儲路徑長度

41、 fitness=zeros(n,l);%/ 儲歸一化適應(yīng),coun ter=0;while counter<cfor i=l:n len(izl)=mylength(dzfarm(iz:);% 計(jì)算路徑長度 end maxle n=max(le n); minle n=min(le n); fitness=fit(len,mzmaxlen,minlen);% 計(jì)算歸一化適應(yīng)值 rr=fi nd(le n=minle n);r=farm(rr(l,l),:);% 更新最短路徑farm=farm;%優(yōu)勝劣汰,nn記錄了復(fù)制的個數(shù) nn=0;for i=l:nif fitness(i,l)&

42、gt;=alpha*rand nn=nn+1;farm( nn,:)=farm(i,:);end end farm=farm(l:nn,:);aa,bb=size(farm);% 交叉和變異 while aavn if nnv=2nn per=ra ndperm(2);elsenn per=ra ndperrn (nn); enda=farm(nnper(l)z:); b=farm(nnper(2),:);a,b=i ntercross(azb); farm=farm; a; b;aa,bb=size(farm); end if aa>nfarm二farm(l:n,:);%保持種群規(guī)模為

43、n endfa rm=farm;clear farm counter=co unter+1endrlength=mylength(d,r);function azb=intercross(azb)l=length(a);if l<=10%確定交叉寬度w=l;elseif (l/10)-floor(l/10)>=rand&&l>10w=ceil(l/10);w=floor(l/10);endp=unidrnd(l-w+l);%隨機(jī)選擇交叉范圍,從p到p+w for i=l:w%交叉x=find(a=b(l,p+i-l);y=find(b=a(l,p+i-l);

44、a(l,p4-i-l),b(l/p+i-l)=exchange(a(l,p+i-l),b(lzp4-i-l);a(l/x)/b(l/y)=exchange(a(l/x)/b(l/y);endfunction xy二exchange(xy)temp=x;y=temp;%計(jì)算路徑的子程序function len=mylength(dzp)n,nn=size(d);葩兇測寧martfor i=l:(n-l)len=len+d(p(l,i)zp(l,i+l);nd%計(jì)算歸一化適應(yīng)值子程序function fitness=fit(lenzmzmaxlen,minlen) fitn ess=le n;fo

45、r i=l:length(len)fitness(izl)=(l-(len(i/l)-minlen)/(maxlen-minlen+0.000001).am;-個c+的程序:c+的程序#include<iostream.h>#in clude<stdlib.h>graph()virtual bool add(int u,int vzconst t& w)=0;virtual bool delete(int u,int v)=0;virtual bool exist(int u,int v)const=o;int vertices()constreturn n;

46、int edges()constreturn e; protected:int n;int e;template<class t> class mgraph:public graph<t>public:mgraph(int vertices=10zt noedge=0); mgraph();bool add(int u,int vconst t& w);bool delete(int unt v);bool exist(int u,int v)const; void floyd(t*& dzint*& path); void pint(int v

47、ertices);private:t noedge;template<class t>mgraph<t>:mgraph(int vertices,t noedge)n=vertices;noedge=noedge;a=new t* n;for(int i=o;ivn;i+)ai=new tn;_ for(int j=0;j<n;j+)if(i!=j)aij=noedge;template<class t> mgraph<t >: mgraph()for(int i=o;i<n;i+)deleteai;deletea;template&

48、lt;class t> bool mgraph<t>:exist(int unt v)constiif(u<0| |v<0| |u>n-l| |v>n-l| |u=v| |auv=noedge)return false;return true;i!template<class t>bool mgraph<t>:add(int u,int v,const t& w)if(u<0| |v<0| |u>n-l| |v>n-l| |u=v| |auv!=noedge) cerr<<hbadin

49、put!,<<endl;return false;if(u<0| |v<0| |u>n-l| |v>n-l| |u=v| |auv=noedge) cerr<<hbadinput!,<<endl;return false;auv=noedge;pathi=new intn;for(int j=o;j<n;j+)dib=aid; if(i!=j&&aij<noedge)pathij=i; else pathiu=-l;for(int k=o;kvn;k+) for(i=0;i<n;i+)for(int

50、j=o;j<n;j+)if(dik+dkjvdij) did=dik+dkffl; pathiu=pathkj;template<class t> void mgraph<t>:print(int vertices)for(int i=o;ivvertices;i+)for(int j=o;j<vertices;j+)# include<iostream.h>main()cout<<"請輸入該圖的節(jié)點(diǎn)數(shù)vvendl; int vertices;cin> 'vertices;mgraph<float>

51、 b(vertices,noedge);cout<<"請輸入 u,v,w:"<<endl;int u,v; float w; cin>>u >>v>>w; while(w!=noedge)/u=u-l;b.add(u-l,v-l,w);b.add(v-l,u-lzw); coutvv”請輸入 uzv,w:h<<endl;cin>> u>>v>>w;b.pri nt(vertices);int* path;int*& path=path; float* d;fl

52、oat*& d=d; b.floyd(d,path);for(int i=o;ivvertices;i+) for(int j=o;j<vertices;j+) coutvvpathijvv if(j=vertices-1 )cout< < e ndl;v=new intvertices+l;cout<<"請鎰入任意一個初始h圈:h<<endl; for(int n=0;nv =vertices;n+)cin>>vn;for(i=0;i<n-l;i+)for(int j=o;j<n-l;j+)if(i+l>

53、;o&&j>i+l&&j<n-l)if(dvivuj+dvi+lvu+l<dvivi+l+dvuvu+l) int i;_ i=vd+imi+i=vm;vn=float total=0:coutvv”最小冋路:m<<endl;for(i=0;i<=vertices;i+4-)cout<<vi+l<<, |cout<<endl;for(i=0;i<vertices;i+)total+=dvivi+l;cout<<"ft® 路徑長度:” <<en

54、dl; cout<<total;ec語言程序#include<stdio.h>#in clude<stdlib.h>#incl udevmathh>#in clude<alloc.h># include<conio.h>#include<float.h> #include<time.h>#in clude<graphics.h> #include<bios.h>#defi ne maxpop 100 #defi ne maxstring 100 struct ppunsigned

55、char chrommaxstring;float x,fitness;unsigned int parentlparent2,xsite;;struct pp *oldpopz*newpop/*pl;unsigned int popsizezlchrom,gemzmaxgen,co_minjrand;unsigned int nmutatiocross,jcross,maxpp,minppmaxxy;float pcross,pmutationzsumfitness,avg,max,min,seed,maxold,oldrandmaxstri ng;unsigned char xmaxstr

56、inglmmaxstring;float *ddzff,maxdd,refpd,fm201;file *fp,*fpl;float objfunc(float);void statistics();int select();int flip(float);int crossover(); void generation(); void initialize(); void report(); float decode(); void crtinit(); void inversion(); float randoml(); void randomizel();main()unsigned int gen,kzj,tt;char fname10;float ttt;clrscr();co_min=0;if(oldpop=(struct pp *

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論