01背包问题c语言,遗传算法的0-1背包问题(c语言)
《遺傳算法的0-1背包問題(c語言)》由會員分享,可在線閱讀,更多相關(guān)《遺傳算法的0-1背包問題(c語言)(26頁珍藏版)》請?jiān)谌巳宋膸炀W(wǎng)上搜索。
1、基于遺傳算法的0-1背包問題的求解摘要:一、前言組合優(yōu)化問題的求解方法研究已經(jīng)成為了當(dāng)前眾多科學(xué)關(guān)注的焦點(diǎn),這不僅在于其內(nèi)在的復(fù)雜性有著重要的理論價值,同時也在于它們能在現(xiàn)實(shí)生活中廣泛的應(yīng)用。比如資源分配、投資決策、裝載設(shè)計、公交車調(diào)度等一系列的問題都可以歸結(jié)到組合優(yōu)化問題中來。但是,往往由于問題的計算量遠(yuǎn)遠(yuǎn)超出了計算機(jī)在有效時間內(nèi)的計算能力,使問題的求解變?yōu)楫惓5睦щy。尤其對于NP完全問題,如何求解其最優(yōu)解或是近似最優(yōu)解便成為科學(xué)的焦點(diǎn)之一。遺傳算法已經(jīng)成為組合優(yōu)化問題的近似最優(yōu)解的一把鑰匙。它是一種模擬生物進(jìn)化過程的計算模型,作為一種新的全局優(yōu)化搜索算法,它以其簡單、魯棒性強(qiáng)、適應(yīng)并行處理。
2、以及應(yīng)用范圍廣等特點(diǎn),奠定了作為21世紀(jì)關(guān)鍵智能計算的地位。背包問題是一個典型的組合優(yōu)化問題,在計算理論中屬于NP-完全問題, 其計算復(fù)雜度為,傳統(tǒng)上采用動態(tài)規(guī)劃來求解。設(shè)wi是經(jīng)營活動 i 所需要的資源消耗,M是所能提供的資源總量,pi是人們經(jīng)營活動i得到的利潤或收益,則背包問題就是在資源有限的條件下, 追求總的最大收益的資源有效分配問題。二、問題描述背包問題( Knapsack Problem)的一般提法是:已知n個物品的重量(weight)及其價值(或收益profit)分別為和,背包的容量(contain)假設(shè)設(shè)為,如何選擇哪些物品裝入背包可以使得在背包的容量約束限制之內(nèi)所裝物品的價值最。
3、大?該問題的模型可以表示為下述0/1整數(shù)規(guī)劃模型:目標(biāo)函數(shù):(*)式中為0-1決策變量,時表示將物品裝入背包中,時則表示不將其裝入背包中。三、求解背包問題的一般方法解決背包問題一般是采取動態(tài)規(guī)劃、遞歸回溯法和貪心方法。動態(tài)規(guī)劃可以把困難得多階段決策變換為一系列相互聯(lián)系比較容易的單階段問題。對于背包問題可以對子過程用枚舉法求解,而且約束條件越多,決策的搜索范圍越小,求解也越容易。它的主要缺點(diǎn)是用數(shù)值方法求解時會隨著狀態(tài)變量的個數(shù)呈指數(shù)級的增長,往往對于求解背包問題的實(shí)際問題是不現(xiàn)實(shí)的。使用遞歸回溯法解決背包問題的優(yōu)點(diǎn)在于它算法思想簡單, 而且它能完全遍歷搜索空間,肯定能找到問題的最優(yōu)解;但是由于。
4、此問題解的總組合數(shù)有個,因此,隨著物件數(shù) n 的增大,其解的空間將以級增長,當(dāng) n 大到一定程度上,用此算法解決背包問題將是不現(xiàn)實(shí)的。使用貪心方法求解時計算的復(fù)雜度降低了很多,但是往往難以得到最優(yōu)解,有時所得解與最優(yōu)解相差甚遠(yuǎn)。因此, 我們可以探索使用遺傳算法解決物件數(shù)較大的背包問題。四、遺傳算法簡介遺傳算法( Genetic Algorithms,GA) 是在1975 年首次由美國密西根大學(xué)的D。J。Holland 教授和他的同事們借鑒生物界達(dá)爾文的自然選擇法則和孟德爾的遺傳進(jìn)化機(jī)制基礎(chǔ)之上提出的。經(jīng)過近30年的研究、應(yīng)用,遺傳算法已被廣泛地應(yīng)用于函數(shù)優(yōu)化、機(jī)器人系統(tǒng)、神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)過程、模式。
5、識別、圖象處理、工業(yè)優(yōu)化控制等領(lǐng)域。遺傳算法是將問題的每一個可能性解看作是群體中的一個個體(染色體),并將每一個染色體編碼成串的形式,再根據(jù)預(yù)定的目標(biāo)函數(shù)對每個個體進(jìn)行評價,給出一個適應(yīng)值。算法將根據(jù)適應(yīng)度值進(jìn)行它的尋優(yōu)過程,遺傳算法的尋優(yōu)過程是通過選擇、雜交和變異三個遺傳算子來具體實(shí)現(xiàn)的。它的搜索能力由選擇算子和雜交算子決定,變異算子則保證了算法能夠搜索到問題空間的盡可能多的點(diǎn),從而使其具有搜索全局最優(yōu)的能力。遺傳算法的高效性和強(qiáng)壯性可由Holland提出的模式定理( Schema Therem) 和隱式并行性得以解釋。在遺傳算法中,定義長度較短、低階且適應(yīng)值超過平均適應(yīng)值的模式在群體中數(shù)目。
6、的期望值按指數(shù)遞增,這個結(jié)論稱為遺傳算法的基本定理。遺傳算法是通過定義長度短、確定位數(shù)少、適應(yīng)度值高的模式的反復(fù)抽樣、組合來尋找最佳點(diǎn),稱這些使遺傳算法有效工作的模式為積木塊,是遺傳算法構(gòu)造答案的基本材料。但歸根到底,要使遺傳算法有效工作必須按照遺傳算法的模式定理(或積木塊假設(shè)) 根據(jù)具體問題設(shè)計合理的編碼方案。在運(yùn)行遺傳算法程序時,需要對一些參數(shù)作事先選擇,它們包括種群的大小、染色體長、交叉率、變異率、最大進(jìn)化代數(shù)等,這些參數(shù)對GA 的性能都有很重要的影響。在試驗(yàn)中參數(shù)一般選取如下:種群大小N= 20100 ,交叉概率 = 0.4 0.9 ,變異概率 = 0.0010.1 ,最大進(jìn)化代數(shù)ma。
7、xgen = 100500。遺傳算法是具有“生成+檢測”的迭代過程的搜索算法。它的基本處理流程如圖1所示。初始化種群評估種群中個體適應(yīng)度選 擇編 碼交 叉變 異演 化圖1、遺傳算法的基本流程遺傳算法的基本流程描述如下:(1)編碼:將解空間的解數(shù)據(jù)進(jìn)行二進(jìn)制編碼,表達(dá)為遺傳空間的基因型串(即染色體)結(jié)構(gòu)數(shù)據(jù),如將數(shù)據(jù)9編碼為“1001”;(2)初始化種群:定義整數(shù)pop_size作為染色體的個數(shù),并且隨機(jī)產(chǎn)生pop_size個染色體作為初始種群;(3)評估種群中個體適應(yīng)度:評價函數(shù)對種群中的每個染色體(chromosome)求得其個體適應(yīng)度;(4)選擇:選擇把當(dāng)前群體中適應(yīng)度較高的個體按某種規(guī)則。
8、或者模型遺傳到下一代種群中,這里所用的規(guī)則是:染色體在種群中被選擇的可能性與其個體的適應(yīng)度的大小成正比;(5)交叉:定義參數(shù)作為交叉操作的概率,由(4)選擇得到的兩個個體以概率交換各自的部分染色體,得到新的兩個個體;(6)變異:定義參數(shù)作為變異操作的概率,由(5)得到每個個體中的每個基因值都以概率進(jìn)行變異;(7)演化:經(jīng)過選擇、交叉和變異操作,得到一個新的種群,對上述步驟經(jīng)過給定的循環(huán)次數(shù)(maxgen)的種群演化,遺傳算法終止。五、背包問題的遺傳算法求解描述基于背包問題的模型(*),我們設(shè)計了針對于背包問題的染色體編碼方法:將待求解的各量表示成長為的二進(jìn)制字符串,j=1,2, ,n。表示物體。
9、j不放入背包內(nèi),表示物體j放入背包內(nèi)。例如:111001100000111代表一個解,它表示將第1、2、3、6、7n-2,n-1,n號物體放入背包中,其它的物體則不放入。根據(jù)遺傳算法的基本流程,我們確定了求解背包問題的遺傳算法:步驟1、初始化過程1.1 確定種群規(guī)模popsize、雜交概率、變異概率 、染色體長度lchrom 及最大進(jìn)化代數(shù)maxgen;1.2 讀入背包問題的相關(guān)信息,如每個物體的重量weightj、每個物體的收益profitj和背包的容量contain,其中;1.3 取,其中表示0-1整數(shù)的均勻分布函數(shù),即隨機(jī)地生成數(shù)0或1,生成的串即可看為一個染色體個體。若不滿足模型(*)。
10、的約束條件,則拒絕接受,由1.2重新生成一個新的染色體個體chrom;如果產(chǎn)生的染色體可行,則接受它作為種群的一名成員,經(jīng)過有限次的1.2抽樣后,得到popsize個可行的染色體chrom,形成新的種群。1.4 置種群的代數(shù)gen=0;步驟2、計算種群中個體適應(yīng)度以及統(tǒng)計種群適應(yīng)度情況2.1 按照下列公式計算種群中個體適應(yīng)度:;公式(2)的下半部分即為適應(yīng)度的懲罰函數(shù),其中參數(shù)。2.2 按公式(3)計算種群的總體適應(yīng)度, 并且按照排序的方法統(tǒng)計出種群中的最大、最小適應(yīng)度的染色體個體,分別標(biāo)記為maxpop、minpop;步驟3、選擇操作3.1 生成一個隨機(jī)數(shù)rand_Number,要求;3.2。
11、 按照賭輪法選擇個體,賭輪法的算法描述如下:int selection( )i=0; /個體的編號sum=0; /部分個體適應(yīng)度的累加和/根據(jù)隨機(jī)數(shù)和群體的總適應(yīng)度確定賭輪的位置wheel-pos=rand_Number*sufitness; while sum#include #include #include #include #include / 重要常量參數(shù)#define popsize 200 /種群的規(guī)模#define pc 0.618 /雜交概率#define pm 0.03 /變異概率#define lchrom 50 /染色體長度#define maxgen 1000 /最大。
12、進(jìn)化代數(shù)struct populationunsigned int chromlchrom; /染色體double weight; /背包重量double fitness; /適應(yīng)度unsigned int parent1,parent2,cross; /雙親、交叉點(diǎn);/新生代種群、父代種群struct population oldpoppopsize,newpoppopsize; /背包問題中物體重量、收益、背包容量int weightlchrom,profitlchrom,contain; /種群的總適應(yīng)度、最小、最大、平均適應(yīng)度 double sumfitness,minfitness,。
13、maxfitness,avgfitness;/計算適應(yīng)度時使用的 懲罰函數(shù)系數(shù)double alpha;/一個種群中最大和最小適應(yīng)度的個體int minpop,maxpop; /* 讀入背包信息,并且計算懲罰函數(shù)系數(shù) */void read_infor()FILE *fp;int j;/獲取背包問題信息文件if (fp=fopen(knapsack.txt,r)=NULL) /讀取文件失敗AfxMessageBox(The file is not found,MB_OK,NULL);return;/讀入物體收益信息for (j=0;jmaxfitness)&(int)(tmp_fit*10)%10=0)maxfitness=popi.fitness;maxpop=i;/選擇種群中最小適應(yīng)度的個體if (tmp_fitoldmax)report(newpop,gen);/保存新生代種群的信息到老一代種群信息空間memcpy(&oldpop,&newpop,popsize*sizeof(struct population);printf(It is over.);getch(。
總結(jié)
以上是生活随笔為你收集整理的01背包问题c语言,遗传算法的0-1背包问题(c语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一百三十三期:MySQL锁会不会,你就
- 下一篇: mybatis学习(26):插入功能(插