遺傳算法-01背包

遺傳算法

算法思想
遺傳算法(Genetic Algorithm, GA)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。
其主要特點是直接對結構對象進行操作,不存在求導和函數連續性的限定;具有內在的隱并行性和更好的全局尋優能力;采用概率化的尋優方法,不需要確定的規則就能自動獲取和指導優化的搜索空間,自適應地調整搜索方向。
遺傳算法以一種群體中的所有個體為對象,并利用隨機化技術指導對一個被編碼的參數空間進行高效搜索。其中,選擇、交叉和變異構成了遺傳算法的遺傳操作;參數編碼、初始群體的設定、適應度函數的設計、遺傳操作設計、控制參數設定五個要素組成了遺傳算法的核心內容。

設計思路

遺傳算法是從代表問題可能潛在的解集的一個種群開始的,一個種群由基因編碼的一定數量的個體組成。每個個體實際上是染色體帶有特征的實體。
初代種群產生之后,按照適者生存和優勝劣汰的原理,逐代(generation)演化產生出越來越好的近似解,在每一代,根據問題域中個體的適應度(fitness)大小選擇(selection)個體,并借助于自然遺傳學的遺傳算子(genetic operators)進行組合交叉(crossover)和變異(mutation),產生出代表新的解集的種群。

這個過程將導致種群像自然進化一樣的后生代種群比前代更加適應于環境,末代種群中的最優個體經過解碼(decoding),可以作為問題近似最優解。

遺傳算法應用步驟:
????1)確定決策變量及各種約束條件,即個體的表現型X和問題的解空間;
????2)建立優化模型 (目標函數最大OR 最小) 數學描述形式 量化方法;
????3)染色體編碼方法;
????4)解碼方法;
????5)個體適應度的量化評價方法 F(x)
????6)設計遺傳算子;
????7)確定有關運行參數。

程序代碼(使用遺傳算法解決01背包問題)

#include <windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>#define  S				5			//種群的規模
#define  Pc				0.8			//交叉概率
#define  Pm				0.05			//突變概率
#define  KW             1000			//背包最大載重1000
#define  N              50			//物體總數
#define	 T				800			//最大換代數
#define	 ALIKE	        0.05			//判定相似度
int		 stop=0;						//初始化函數中初始化為所有價值之和
int		 t=0;						//目前的代數
int value[]={
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,8,5,3,1};
int weight[]={
80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,25,30,45,30,60,50,20,65,20,25,30,10,20,25,15,10,10,10,4,4,2,1};struct individual				//個體結構體
{bool chromsome[N];		//染色體編碼double fitness;				//適應度//即本問題中的個體所得價值double weight;			//總重量
};
int best=0;
int same=0;
individual X[S],Y[S],bestindividual;/************************************************************************/
int  comp(individual bestindividual,individual temp);	//比較函數
void checkalike(void);							//檢查相似度函數
void GenerateInitialPopulation(void); 				//初始種群
void CalculateFitnessValue(void);					//適應度
void SelectionOperator(void);						//選擇
void CrossoverOperator(void);					//交叉
void MutationOperator(void);					//變異
void FindBestandWorstIndividual(void);				//尋找最優解
void srand(unsigned int seed);					//隨機生成
/************************************************************************/int comp(individual bestindividual,individual temp)//比較函數
{int fit=0,w=0;//第一種不變:操作后不滿足重量函數,第二種:操作后適應度小于操作前for(int i=0;i<N;i++){fit+=temp.chromsome[i]*value[i];w+=temp.chromsome[i]*weight[i];}if(w>KW)return -1;return (bestindividual.fitness>fit?-1:1);//如果小于原來值或者不滿足重量函數,則返回-1
}/************************************************************************/
void Checkalike(void)
{int i=0,j=0;for( i=0;i<S;i++)//相似度校驗{for(j=0;j<N;j++){bool temp=X[i].chromsome[j];for(int k=1;k<S;k++){if(temp!=X[k].chromsome[j])break;}}if(j==N)same++;}if(same>N*ALIKE)//大于ALIKE作為判定為早熟{int minindex=0;for(int n=0;n<S;n++)if(X[n].fitness<X[minindex].fitness)minindex=n;//確定最小for (j=0; j<N;j++)//重新生成{bool m=(rand()%10<5)?0:1;X[minindex].chromsome[j]=m;X[minindex].weight+=m*weight[j];//個體的總重量X[minindex].fitness+=m*value[j]; //個體的總價值}}
}/************************************************************************/
void GenerateInitialPopulation(void)//初始種群,保證每個值都在符合條件的解
{int i=0,j=0; bool k;for(i=0;i<N;i++)stop+=value[i];//設置理論最優值for (i=0; i<S; i++){int w=0,v=0;for (j=0; j<N;j++){k=(rand()%10<5)?0:1;X[i].chromsome[j]=k;w+=k*weight[j];//個體的總重量v+=k*value[j]; //個體的總價值}if(w>KW) i--;	   //如果不是解,重新生成else{X[i].fitness=v;X[i].weight=w;if(v==stop){bestindividual=X[i];return;}//這種情況一般不會發生}}
}
/************************************************************************/void CalculateFitnessValue()
{int i=0,j=0;for (i=0; i<S; i++){int w=0,v=0;for (j=0; j<N;j++){w+=X[i].chromsome[j]*weight[j];//個體的總重量v+=X[i].chromsome[j]*value[j]; //個體的總價值}X[i].fitness=v;X[i].weight=w;if(v==stop){bestindividual=X[i];return;}//符合條件情況下最優解這種情況一般不會發生if(w>KW) X[i]=bestindividual;//如果不是解,找最好的一個解代之}
}
/************************************************************************/void SelectionOperator(void)
{int i, index;double p, sum=0.0;double cfitness[S];//選擇、累積概率individual newX[S];for (i=0;i<S;i++)sum+=X[i].fitness;//適應度求和for (i=0;i<S; i++)cfitness[i]=X[i].fitness/sum; //選擇概率for (i=1;i<S; i++)cfitness[i]=cfitness[i-1]+cfitness[i];//累積概率for (i=0;i<S;i++){p=(rand()%1001)/1000.0;//產生一個[0,1]之間的隨機數index=0;while(p>cfitness[index])//輪盤賭進行選擇{index++;}newX[i]=X[index];}for (i=0; i<S; i++)X[i]=newX[i];//新的種群
}/************************************************************************/
void CrossoverOperator(void)//交叉操作
{int i=0, j=0,k=0;individual temp;for(i=0; i<S; i++){int p=0,q=0;do{p=rand()%S;//產生兩個[0,S]的隨機數q=rand()%S;}while(p==q);int w=1+rand()%N;//[1,N]表示交換的位數double r=(rand()%1001)/1000.0;//[0,1]if(r<=Pc){for(j=0;j<w;j++){temp.chromsome[j]=X[p].chromsome[j];//將要交換的位先放入臨時空間X[p].chromsome[j]=X[q].chromsome[j];X[q].chromsome[j]=temp.chromsome[j];}}if(p==best)if(-1==comp(bestindividual,X[p]))//如果變異后適應度變小X[p]=bestindividual;if(q==best)if(-1==comp(bestindividual,X[q]))//如果變異后適應度變小X[q]=bestindividual;}
}
/************************************************************************/void MutationOperator(void)
{int i=0, j=0,k=0,q=0;double p=0;for (i=0; i<S; i++){for (j=0; j<N; j++){p=(rand()%1001)/1000.0;if (p<Pm)//對每一位都要考慮{if(X[i].chromsome[j]==1)X[i].chromsome[j]=0;else	X[i].chromsome[j]=1;}}if(i==best)if(-1==comp(bestindividual,X[i]))//如果變異后適應度變小X[i]=bestindividual;}
}
/************************************************************************/void FindBestandWorstIndividual(void)
{int i;bestindividual=X[0];for (i=1;i<S; i++){if (X[i].fitness>bestindividual.fitness){bestindividual=X[i];best=i;}}
}/*主函數*****************************************************************/
int main()
{t=0;GenerateInitialPopulation(); //初始群體包括產生個體和計算個體的初始值while (t<=T){FindBestandWorstIndividual();	//保存當前最優解SelectionOperator();			//選擇CrossoverOperator();			//交叉MutationOperator();			   //變異Checkalike();				  //檢查相似度CalculateFitnessValue();	 //計算新種群適應度t++;}FindBestandWorstIndividual();			//找到最優解printf(" 物品價值:");for(int k=0;k<N;k++){printf(" %d ",value[k]);}printf("\n");printf(" 物品重量:");for(int k=0;k<N;k++){printf(" %d  ",weight[k]);}printf("\n");printf("背包容量 %d\n",1000);   	//輸出最優值printf("-----------------------------\n");printf("最優值 %f\n",bestindividual.fitness);   	//輸出最優值printf("對應重量 %f\n",bestindividual.weight);       //對應重量printf("線性解:");for(int k=0;k<N;k++){if(bestindividual.chromsome[k]==1){  //輸出最優解printf(" %d ",1);}else{printf(" %d ",0);}}printf("\n");printf("\n");return 0;
}
/*結束***********************************************************************/

測試例

物品價值:

 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  8  5  3  1

物品重量:

 80   82   85   70   72   70   66   50   55   25   50   55   40   48   50   32   22   60   30   32   40   38   35   32   25   28   30   22   25   30   45   30   60   50   20   65   20   25   30   10   20   25   15   10   10   10   4   4   2   1

運行結果

最優值 3078.000000
對應重量 1000.000000
線性解: 1  0  0  1  1  0  1  1  1  1  1  0  1  1  1  1  1  0  1  1  0  0  0  1  1  1  1  1  1  1  0  0  0  0  1  0  1  1  0  1  0  0  0  0  0  0  1  1  1  1

分析
試驗中用到的物品的重量和價值分別存儲于以下兩個數組之中。

int value[]={
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,8,5,3,1};
int weight[]={
80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,25,30,45,30,60,50,20,65,20,25,30,10,20,25,15,10,10,10,4,4,2,1};

遺傳算法有許多不足,算法對新空間的探索能力是有限的,也容易收斂到局部最優解。涉及到大量個體的計算,當問題復雜時,計算時間很長。
但是他也有很多優點:

  1. 與問題領域無關切快速隨機的搜索能力。
  2. 搜索從群體出發,具有潛在的并行性,可以進行多個個體的同時比較,robust.
  3. 搜索使用評價函數啟發,過程簡單
  4. 使用概率機制進行迭代,具有隨機性。
  5. 具有可擴展性,容易與其他算法結合。

參考:
短短的路走走停停被搶注啦
鶴鶴有明
wangqiuyun

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536106.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Angular Web App部署Linux Nginx Https

Angular Web App部署Linux Nginx Https 提示:這篇文章是基于內網的 互聯網就開始將 WEB 服務從 HTTP 遷移到 HTTPS,而現在為了更快的推進 HTTPS 的普及,Chrome 將從 2018 年 7 月起標記所有的 HTTP 網站為不安全鏈接。 HTTPS 會逐漸成為 WEB 服務的標配,最最重要的是,它能…

SOLO算法簡讀

論文鏈接&#xff1a;https://arxiv.org/abs/1912.04488 代碼鏈接&#xff1a;https://github.com/WXinlong/SOLO 摘要 提出一種新的實例分割方法。與語義分割等其他密集預測任務相比&#xff0c;實例分割的難度要大得多。為了預測每個實例的掩碼&#xff0c;主流方法要么遵…

Rxjs的flatMap使用

Rxjs的flatMap使用 flatMap是Rxjs比較繞的一個概念&#xff0c;這里我們只是講解如何使用。在Rxjs 4.0版本時叫flatMap,在Rxjs 5.0時被更名為margeMap,現在flatMap作為margeMap的別名使用&#xff0c;這是考慮向下兼容。 官方flatMap的定義&#xff1a; Projects each sourc…

關于Loss的簡單總結

Dice Loss 參考&#xff1a;https://blog.csdn.net/l7H9JA4/article/details/108162188 Dice系數&#xff1a; 是一種集合相似度度量函數&#xff0c;通常用于計算兩個樣本的相似度&#xff0c;取值范圍為[0,1]。 s2∣X∩Y∣∣X∣∣Y∣s \frac{2|X ∩ Y|}{|X||Y|} s∣X∣∣Y…

Angular_PWA使用+Demo

Angular_PWA使用+Demo 什么是PWA PWA(Progressive Web App)利用TLS,webapp manifests和service workers使應用程序能夠安裝并離線使用。 換句話說,PWA就像手機上的原生應用程序,但它是使用諸如HTML5,JavaScript和CSS3之類的網絡技術構建的。 如果構建正確,PWA與原生應…

SOLOv2論文簡讀

論文&#xff1a;SOLOv2: Dynamic, Faster and Stronger 代碼&#xff1a;https://github.com/WXinlong/SOLO 摘要 主要提出了作者在SOLOv2中實現的優秀的實例分割方法&#xff0c;旨在創建一個簡單、直接、快速的實例分割框架&#xff1a; 通過提出動態學習對象分割器的mas…

Angular6_PWA

Angular6_PWA Angular正式發布了V6.0,我們已經可以利用對應的@angular/cli V6.0來直接開發PWA應用了。 第一步:安裝@angular/cli V6.0 如果你機器上有老版本,請先卸載。 打開你的終端,執行: npm install -g @angular/cli 或 cnpm install -g @angular/cli 安裝成功…

Ubuntu18.04 關于使用vnc的踩坑

由于種種原因&#xff0c;手上多了一臺可使用的桌面版Ubuntu&#xff0c;正好用來測試代碼&#xff0c;方便調試。因為只能遠程&#xff0c;所以需要配置遠程連接。因此就打算使用vnc進行遠程連接&#xff0c;誰料一路坎坷&#xff0c;特此記錄。 安裝 設置桌面共享 需要注意…

App_Shell模型

App_Shell模型 App Shell 架構是構建 Progressive Web App 的一種方式,這種應用能可靠且即時地加載到您的用戶屏幕上,與本機應用相似。 App shell是支持用戶界面所需的最小的 HTML、CSS 和 JavaScript,如果離線緩存,可確保在用戶重復訪問時提供即時、可靠的良好性能。這意…

Angular6_服務端渲染SSR

Angular6_服務端渲染 在使用服務端渲染之前,需要安裝最新版本的Angular。 npm install -g @angular/cli 或 cnpm install -g @angular/cli github項目 創建項目 ng new PWCat --routing 為項目添加universalng g universal --client-project=PWCat 或

Jenkins自定義主題教程

Jenkins自定義主題 由于Jenkins自帶的樣式比較丑陋&#xff0c;所以有很多第三方的樣式庫&#xff0c;這里針對jenkins-material-theme樣式庫做一個安裝教程。 下載樣式庫 下載連接 Select your color 選擇一個你喜歡的主題顏色。Choose your company logo 上傳你自定義的…

IndexedDB_Web 離線數據庫

IndexedDB_Web 離線數據庫 本文會從頭剖析一下 IndexedDB 在前端里面的應用的發展。 indexedDB 目前在前端慢慢得到普及和應用。它正朝著前端離線數據庫技術的步伐前進。以前一開始是 manifest、localStorage、cookie 再到 webSQL&#xff0c;現在 indexedDB 逐漸被各大瀏覽器認…

Angular 單元測試講解

Angular_單元測試 測試分類 按開發階段劃分按是否運行劃分按是否查看源代碼劃分其他ATDD,TDD,BDD,DDD ATDDTDDBDDDDDAngular單元測試 Karma的介紹jasmine介紹單元測試的好處使用jasmine和karma創建一個Angular項目Karma配置Test.ts文件測試體驗測試Form測試服務service常用斷言…

基于 Docker 的微服務架構

基于 Docker 的微服務架構-分布式企業級實踐前言Microservice 和 Docker服務發現模式客戶端發現模式Netflix-Eureka 服務端發現模式ConsulEtcdZookeeper 服務注冊自注冊模式 Self-registration pattern第三方注冊模式 Third party registration pattern小結一 服務間的 IPC 機制…

funcode游戲實訓,java及C/C++,網上整理

軟件&#xff0c;常見錯誤都有。 所有資源可到公眾號獲取(源碼也是)&#xff0c;不再直接分享

Docker 容器部署 Consul 集群

Docker 容器部署 Consul 集群 Consul 介紹 Consul 提供了分布式系統的服務發現和配置的解決方案。基于go語言實現。并且在git上開放了源碼consul-git。consul還包括了分布式一致協議的實現&#xff0c;健康檢查和管理UI。Consul和zk相比較起來&#xff0c;更加輕量級&#xf…

swing皮膚包 substance

分享一下swing皮膚包substance 資源可到公眾號獲取

基于Android的聊天軟件,Socket即時通信,實現用戶在線聊天

基于Android的聊天軟件&#xff0c;Socket即時通信&#xff0c;單聊&#xff0c;聊天室&#xff0c;可自行擴展功能&#xff0c;完善細節。 【實例功能】 1.運行程序&#xff0c;登錄界面, 注冊賬號功能 2.進入主界面&#xff0c;有通訊錄, 個人信息。 3.點擊好友會話框&#…

用Docker搭建Elasticsearch集群

用Docker搭建Elasticsearch集群 對于用Docker搭建分布式Elasticsearhc集群的一個介紹&#xff0c;以及一些實施中遇到問題的總結 搜索服務簡述 結合業務的場景&#xff0c;在目前的商品體系需要構建搜索服務&#xff0c;主要是為了提供用戶更豐富的檢索場景以及高速&#xf…

Go實現簡單的RESTful_API

Go實現簡單的RESTful_API 何為RESTful API A RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. A RESTful API – also referred to as a RESTful web service – is based on representational state t…