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