【正文】
=cindex(i)。 end end end % 變異 M=rand(N,L)=pm。 updatec=v(indb1,:)。)。disp(sprintf(39。amp。close all。 %v為50*50隨機(jī)產(chǎn)生的矩陣 值為0或1%貪婪算法修復(fù)解%v=greedy(v,c,g,m1)。disp(sprintf(39。,pm))。m1)0).*(v*c39。 end for i=1:N p=rand(1)。 cindex(i)=cindex(i+point1)。%產(chǎn)生(N,L)維的01矩陣,為1的位置進(jìn)行變異 v=v2.*(v.*M)+M。 [sol1,indb1] = max(fit)。cf*v*value39。v*value39。T = etime(clock,t0)。disp(sprintf(39。六.matlab實(shí)驗(yàn)結(jié)果 、遺傳算法結(jié)合解決背包問(wèn)題:為了更好地說(shuō)明算法的運(yùn)行效果,本論文在matlab上編寫(xiě)了算法程序程序,其運(yùn)行結(jié)果如下:代數(shù): 500種群大小: 50交叉概率: 變異概率: 程序運(yùn)行時(shí)間 最優(yōu)解: []:運(yùn)行結(jié)果如下:代數(shù): 1000種群大小: 50交叉概率: 變異概率: 程序運(yùn)行時(shí)間 最優(yōu)解: []3. 通過(guò)對(duì)比可以發(fā)現(xiàn)將貪婪算法加入遺傳算法之后能更好的得到需要的結(jié)果。fx = sol3。)。 it = it + 1。 %indb2為適應(yīng)度最小的染色體 v(indb2,:) = v(indb1,:)。m1)0).*(v*c39。 %cindex中相鄰的兩個(gè)為兩個(gè)父代的序號(hào) v(cindex(i+1),j)=ch。 end for i=1:N %產(chǎn)生要配對(duì)的父代的序號(hào);經(jīng)過(guò)N次順序調(diào)換,將原有順序打亂,使相鄰兩個(gè)個(gè)體作為交叉的父代 point=unidrnd(Ni+1)。 end for i=1:N sp(i)=fi(i)/sum(fi)。./(v*c39。disp(sprintf(39。代數(shù): %d39。 %懲罰系數(shù)v = 2*rand(50,50)1。:源代碼:%遺傳算法解決背包問(wèn)題 clc。 if sum(v(i,:).*c)m1 %修復(fù) while sum(v(i,:).*c)m1 min=10000。程序運(yùn)行時(shí)間 %39。 plot(it,sol1,39。 v(indb1,:)=updatec。 v(cindex(i),j)=v(cindex(i+1),j)。%用選擇出的個(gè)體構(gòu)成的種群替代舊的種群 end % 交叉 for i=1:N cindex(i)=i。while it = ger % 選擇(輪盤(pán)賭方法) for i=1:N fi(i)=fit(i)min(fit)+1。,pm))。disp(sprintf(39。 %v為50*50隨機(jī)產(chǎn)生的矩陣 值為0或1%貪婪算法修復(fù)解%v=greedy(v,c,g,m1)。clear。fit =v*value39。(3)適應(yīng)度函數(shù) 由于對(duì)每個(gè)個(gè)體使用貪婪算法修正已保證了不會(huì)產(chǎn)生無(wú)效染色體,所以在進(jìn)行個(gè)體適應(yīng)度評(píng)價(jià)時(shí)無(wú)須引入罰函數(shù)項(xiàng),而是直接用目標(biāo)函數(shù)值作為適應(yīng)度函數(shù)值,即: (4)選擇: 采用輪盤(pán)賭的方式進(jìn)行選擇。2. 基于貪婪算法的混合遺傳算法求解背包問(wèn)題將貪婪算法與遺傳算法相結(jié)合構(gòu)成的混合遺傳算法,通過(guò)遺傳算法的擇優(yōu),不斷重復(fù)執(zhí)行選擇、雜交和變異以及貪婪算法的修正這樣一個(gè)過(guò)程,所求解將不斷進(jìn)化越來(lái)越接近最優(yōu)解。由于仿照基因編碼的工作很復(fù)雜,我們往往進(jìn)行簡(jiǎn)化,如二進(jìn)制編碼,初代種群產(chǎn)生之后,按照適者生存和優(yōu)勝劣汰的原理,逐代演化產(chǎn)生出越來(lái)越好的近似解,在每一代,根據(jù)問(wèn)題域中個(gè)體的適應(yīng)度大小選擇個(gè)體,并借助于自然遺傳學(xué)的遺傳算子進(jìn)行組合交叉和變異,產(chǎn)生出代表新的解集的種群。 {定義第一個(gè)物品重的整數(shù)倍的重量a值為1,作為初值} for i:=2 to v do begin read(now)。 for j:=0 to n do if a[j]0 then for k:=1 to n div now do if j+now*k=n then inc(c[j+now*k],a[j])。 end。 try(dep+1)。 var i,j:integer。 For i:=1 To M Do For j:=1 To N Do If iproblem[j].time=0 Then Begin t:=problem[j].point+f[iprob