




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、遺傳算法解背包問題1、程序開發(fā)環(huán)境 開發(fā)環(huán)境:Visual C+6.0 (把Fortran程序改為VC) 操作系統(tǒng):Windows 2003 Professional 2、程序性能對比 運(yùn)行時間與加速比(如表1所示) 進(jìn)程數(shù)p(個) 1 2 4 運(yùn)行時間t(秒) 129s 78s 38s 加速比s 1.65 3.38 表1、運(yùn)行時間與加速比 3、程序運(yùn)行結(jié)果: 實(shí)例數(shù)據(jù): 假設(shè)物體的重量Weight、物體的收益Profit和背包的容量Contain 分別為: Weight= 80,82,85,70,72, 70,66,50,55,25 , 50,55,40,48,50, 32,22,60,30
2、,32 , 40,38,35,32,25, 28,30,22,50,30 , 45,30,60,50,20 , 65,20,25,30,10 , 20,25,15,10,10 , 10,4, 4, 2, 1 Profit= 220,208,198,192,180, 180,165,162,160,158, 155,130,125,122,120 , 118,115,110,105,101, 100,100,98, 96, 95, 90, 88, 82, 80, 77 , 75, 73, 72, 70, 69, 66, 65, 63, 60, 58, 56, 50, 30, 20, 15, 10
3、, 8, 5, 3, 1 Contain=1000, 如何選擇哪些物品裝入該背包可使得在背包的容量約束限制之內(nèi)所裝物品的總價(jià)值最大? 傳統(tǒng)的算法(動態(tài)規(guī)劃、遞歸回溯法和貪心算法所得結(jié)果: 總價(jià)值為3077 , 總重量為999。 2001年張鈴,張鈸教授在計(jì)算機(jī)學(xué)報(bào)上發(fā)表的佳點(diǎn)集遺傳算法所得結(jié)果 總價(jià)值為3103, 總重量為1000。 我們算法所得結(jié)果: 總價(jià)值為3103, 總重量為1000。 我們所求得最優(yōu)解的個體分配情況為: 11010 10111 10110 11011 01111 11101 00001 01001 10000 01000 算法 最大迭代次數(shù) 總價(jià)值為 總重量為 傳統(tǒng)的算
4、法 400 3077 999 佳點(diǎn)集算法 70 3103 1000 遺傳算法 75 3103 1000 / knapsack.cpp : Defines the entry point for the console application. / #include "stdafx.h" #include <AfxWin.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <conio.h> #include <stdio.h&
5、gt; / 重要常量參數(shù) #define popsize 200 /種群的規(guī)模 #define pc 0.618 /雜交概率 #define pm 0.03 /變異概率 #define lchrom 50 /染色體長度 #define maxgen 1000 /最大進(jìn)化代數(shù) struct population unsigned int chromlchrom; /染色體 double weight; /背包重量 double fitness; /適應(yīng)度 unsigned int parent1,parent2,cross; /雙親、交叉點(diǎn) ; /新生代種群、父代種群 struct popula
6、tion oldpoppopsize,newpoppopsize; /背包問題中物體重量、收益、背包容量 int weightlchrom,profitlchrom,contain; /種群的總適應(yīng)度、最小、最大、平均適應(yīng)度 double sumfitness,minfitness,maxfitness,avgfitness; /計(jì)算適應(yīng)度時使用的 懲罰函數(shù)系數(shù) double alpha; /一個種群中最大和最小適應(yīng)度的個體 int minpop,maxpop; /* 讀入背包信息,并且計(jì)算懲罰函數(shù)系數(shù) */ void read_infor() FILE *fp; int j; /獲取背包問題
7、信息文件 if (fp=fopen("knapsack.txt","r")=NULL) /讀取文件失敗 AfxMessageBox("The file is not found",MB_OK,NULL); return; /讀入物體收益信息 for (j=0;j<lchrom;j+) fscanf(fp,"%d",&profitj); /讀入物體重量信息 for (j=0;j<lchrom;j+) fscanf(fp,"%d",&weightj); /讀入背包容量 f
8、scanf(fp,"%d",&contain); fclose(fp); /根據(jù)計(jì)算的個體重量,判斷此個體是否該留在群體中 double cal_weight(unsigned int *chr) int j; double pop_weight;/背包重量 pop_weight=0; for (j=0;j<lchrom;j+) pop_weight=pop_weight+(*chr)*weightj; chr+; return pop_weight; /* 種群中個體適應(yīng)度計(jì)算*/ double cal_fit(unsigned int *chr) int
9、j; double pop_profit;/適應(yīng)度 pop_profit=0; / pop_weight=0; for (j=0;j<lchrom;j+) pop_profit=pop_profit+(*chr)*profitj; / pop_weight=pop_weight+(*chr)*weightj; chr+; return pop_profit; /* 群體適應(yīng)度的最大最小值以及其他信息 */ void statistics(struct population *pop) int i; double tmp_fit; sumfitness=pop0.fitness; minf
10、itness=pop0.fitness; minpop=0; maxfitness=pop0.fitness; maxpop=0; for (i=1;i<popsize;i+) /計(jì)算種群的總適應(yīng)度 sumfitness=sumfitness+popi.fitness; tmp_fit=popi.fitness; /選擇種群中最大適應(yīng)度的個體 if (tmp_fit>maxfitness)&&(int)(tmp_fit*10)%10=0) maxfitness=popi.fitness; maxpop=i; /選擇種群中最小適應(yīng)度的個體 if (tmp_fit<
11、;minfitness) minfitness=popi.fitness; minpop=i; /計(jì)算平均適應(yīng)度 avgfitness=sumfitness/(float)popsize; / printf("nthe max pop = %d;",maxpop); / printf("nthe min pop = %d;",minpop); / printf("nthe sumfitness = %fn",sumfitness); /報(bào)告種群信息 void report(struct population *pop,int gen)
12、 int j; int pop_weight=0; printf("the generation is %d.n",gen); /輸出種群的代數(shù) /輸出種群中最大適應(yīng)度個體的染色體信息 printf("The population's chrom is: n"); for (j=0;j<lchrom;j+) if (j%5=0) printf(" "); printf("%1d",popmaxpop.chromj); /輸出群體中最大適應(yīng)度 printf("nThe population
13、39;s max fitness is %d.",(int)popmaxpop.fitness); printf("nThe knapsack weight is %d.nn",(int)popmaxpop.weight); /* 生成初始種群 */ void initpop() int i,j,ispop; double tmpWeight; /變量用于判斷是否為滿足條件的個體 ispop=false; /生成popsize個種群個體 for(i=0;i<popsize;i+) while (!ispop) for(j=0;j<lchrom;j+)
14、oldpopi.chromj=rand()%2; /隨機(jī)生成個體的染色體 oldpopi.parent1=0; /雙親 oldpopi.parent2=0; oldpopi.cross=0; /交叉點(diǎn) /選擇重量小于背包容量的個體,即滿足條件 tmpWeight=cal_weight(oldpopi.chrom); if (tmpWeight<=contain) oldpopi.fitness=cal_fit(oldpopi.chrom); oldpopi.weight=tmpWeight; oldpopi.parent1=0; oldpopi.parent2=0; oldpopi.cr
15、oss=0; ispop=true; /此個體可以加入到種群中 ispop=false; /* 遺傳操作 */ /概率選擇試驗(yàn) int execise(double probability) double pp; /如果生成隨機(jī)數(shù)大于相應(yīng)的概率則返回真,否則試驗(yàn)不成功 pp=(double)(rand()%20001/20000.0); if (pp<=probability) return 1; return 0; / 選擇進(jìn)行交叉操作的個體 int selection(int pop) double wheel_pos,rand_Number,partsum; int parent;
16、 /賭輪法選擇 rand_Number=(rand()%2001)/2000.0; wheel_pos=rand_Number*sumfitness; /賭輪大小 partsum=0; parent=0; do partsum=partsum+oldpopparent.fitness; parent=parent+1; while (partsum<wheel_pos && parent<popsize); return parent-1; /* 交叉操作 */ int crossover(unsigned int *parent1,unsigned int *pa
17、rent2,int i) int j,cross_pos; if (execise(pc) /生成交叉位置0,1,.(lchrom-2) cross_pos=rand()%(lchrom-1); else cross_pos=lchrom-1; for (j=0;j<=cross_pos;j+) /保留復(fù)制; /包括在概率選擇不成功時,父體完全保留 newpopi.chromj=parent1j; for(j=cross_pos+1;j<=(lchrom-1);j+) /從交叉點(diǎn)開始交叉 newpopi.chromj=parent2j; /記錄交叉位置 newpopi.cross=
18、cross_pos; return 1; /* 變異操作 */ int mutation(unsigned int alleles) if (execise(pm) if (alleles) alleles=0; else alleles=1; /返回變異值,或者返回原值 return alleles; /* 群體更新 */ void generation() unsigned int i,j,mate1,mate2; double tmpWeight; int ispop;/記錄是否是符合條件的個體 i=0; while (i<popsize) ispop=false; while (
19、!ispop) /選擇 mate1=selection(i); mate2=selection(i+1); /交叉 crossover(oldpopmate1.chrom,oldpopmate2.chrom,i); /變異 for (j=0;j<lchrom;j+) newpopi.chromj=mutation(newpopi.chromj); /選擇重量小于背包容量的個體,即滿足條件 tmpWeight=cal_weight(newpopi.chrom); if (tmpWeight<=contain) newpopi.fitness=cal_fit(newpopi.chrom
20、); newpopi.weight=tmpWeight; newpopi.parent1=mate1; newpopi.parent2=mate2; ispop=true; /此個體可以加入到種群中 i=i+1; void main(int argc, char* argv) int gen,oldmaxpop,k; double oldmax; read_infor();/讀入背包信息 gen=0; srand( (unsigned)time( NULL ) );/置隨機(jī)種子 initpop(); memcpy(&newpop,&oldpop,popsize*sizeof(struct population); statistics(newpop);/統(tǒng)計(jì)新生種群的信息 report(newpop,gen); while(gen<maxgen) gen=gen+1; i
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年江蘇省揚(yáng)州市中考語文試卷及答案
- 2025年仿制藥一致性評價(jià)對藥品生產(chǎn)設(shè)備更新的推動報(bào)告
- 元宇宙社交平臺虛擬社交互動體驗(yàn)優(yōu)化與用戶粘性提升策略
- 國際教育咨詢服務(wù)在中國的發(fā)展現(xiàn)狀與競爭格局研究報(bào)告2025版
- 財(cái)富管理行業(yè)數(shù)字化轉(zhuǎn)型:金融科技如何優(yōu)化客戶服務(wù)體驗(yàn)報(bào)告
- 科技與互聯(lián)網(wǎng)融合下的互聯(lián)網(wǎng)金融服務(wù)風(fēng)險(xiǎn)控制技術(shù)體系構(gòu)建報(bào)告
- 深度解讀2025年制造業(yè)數(shù)字化轉(zhuǎn)型數(shù)據(jù)治理戰(zhàn)略與實(shí)施
- 護(hù)理禮儀與人際溝通教學(xué)課件第九章護(hù)理工作中的人際溝通
- 核酸耗材運(yùn)送管理制度
- 擔(dān)保公司抵押物管理制度
- 2025 年中職高考對口升學(xué)(幼兒教育學(xué))真題試卷附參考答案
- 2025承諾合同(個人承諾)
- 2025-2030中國智能視頻行業(yè)調(diào)研分析及發(fā)展趨勢預(yù)測研究報(bào)告
- 安徽省2024-2025學(xué)年八年級信息技術(shù)水平會考操作題
- 墓地征用協(xié)議書范本
- 2025年農(nóng)藝工(高級)職業(yè)技能鑒定參考試題庫(含答案)
- 期末證據(jù)法學(xué)試題及答案
- 臨床氣管插管拔管后吞咽障礙評估與干預(yù)實(shí)踐應(yīng)用
- 電氣實(shí)驗(yàn)室工作人員崗位職責(zé)
- 海南海虹化纖工業(yè)有限公司地塊第二階段土壤污染狀況調(diào)查報(bào)告
- 2025年-甘肅建筑安全員-C證考試(專職安全員)題庫及答案
評論
0/150
提交評論