資源簡介
ACO實現(xiàn)0-1背包問題,算法簡單易懂且有實驗報告。

代碼片段和文件信息
#include?“iostream“
#include?
#include?
#include?
using?namespace?std;
#define?M?8//螞蟻數(shù)
#define?P?0.2//信息素揮發(fā)率
#define?MAX?70
int?BRoute[MAX];//最優(yōu)解
int?BValue=0;//最優(yōu)解的總價值
int?BWeight;//最優(yōu)解的總重量
int?max_circle=500;//外循環(huán)最大次數(shù)
int?antRoute[9][MAX];
int?antValue[9];
void?main(){
int?n;//物品個數(shù)
int?w_limit;//背包重量限制
int?value[MAX];//各物品價值
int?weight[MAX];//各物品重量
????float?inf[MAX][MAX];//信息素矩陣
int?ij;
//?**************?讀數(shù)據?*************************//
string?filestring;
cout<<“請輸入測試文件名:?“;
cin>>filestring;
ifstream?inFile(filestring.c_str());
//報告錯誤
if(!inFile)
{
cerr<<“不能打開測試文件:“< exit(-1);
}
????
inFile>>n;
inFile>>w_limit;
value[0]=0;
????weight[0]=0;
for?(i=1;?i<=n;?i++)
{
inFile?>>?weight[i];??
}
for?(i=1;?i<=n;?i++)
{
inFile?>>?value[i];?
}
//*************************?信息素矩陣初始化?********************//
for(i=0;i<=n;i++)
inf[i][0]=0;
for(i=0;i<=n;i++){
for(j=1;j<=n;j++){
inf[i][j]=1;
}
}
//************************?數(shù)據輸出?****************************//
cout<<“物品總數(shù)為:“< cout<<“背包重量限制為:“<
cout<<“各物品重量分別為:“< ??? for(i=0;i<=n;i++)
cout< cout<
cout<<“各物品價值分別為:“< ????for(i=0;i<=n;i++)
cout< cout< /*
cout<<“信息素矩陣初始化為:“< ????for(i=0;i<=n;i++){
for(j=0;j<=n;j++){
cout< }
cout< }
*/
srand((int)time(0));?//初始化隨機種子
bool?mark[MAX];
int?no_modify=0;
for(int?k=1;k<=max_circle?&&?no_modify<100?;k++){//外循環(huán)
// for(int?k=1;k<=max_circle??;k++){//外循環(huán)
for(i=1;i<=M;i++){
antRoute[i][0]=0;
int?Cur_n=0;?//已選取物品個數(shù)
int?Cur_w=0;?//已選取物品總重量
int?Cur_v=0;?//已選取物品總價值
int?Cur_ps=0;?//記錄當前選取物品的標號
????for(j=1;j<=n;j++)
mark[j]=false;?//作為物品是否選取的標志
bool?finish=false;?
??? int?ok[MAX];?
while(finish==false){
if(Cur_n==n){
antRoute[i][++Cur_n]=0;
antValue[i]=Cur_v;
finish=true;
}
else{
int?ok_n=0;
for(j=1;j<=n;j++){
if(mark[j]==false?&&(Cur_w+weight[j])<=w_limit){
ok[ok_n++]=j;?//該數(shù)組用于存儲滿足條件的物品的標號
}
}
if(ok_n==0){?//無滿足條件的物品
antRoute[i][++Cur_n]=0;
antValue[i]=Cur_v;
finish=true;
}
else{
//有滿足條件的物品:按信息素來進行隨機選取
float?total=0;
float?rate[MAX];
for(j=0;j float?total=total+inf[Cur_ps][ok[j]];
}
for(j=0;j rate[j]=(inf[Cur_ps][ok[j]]/total);
bool?choose=false;
while(choose==false){
double?r=(double)(rand()?%?1001)?*?0.001f;
int?u=(int)(rand()%ok_n);
if(rate[u]>r){
antRoute[i][++Cur_n]=ok[u];
Cur_ps=ok[u];
Cur_w+=weight[ok[u]];
Cur_v+=value[ok[u]];
mark[ok[u]]=true;
choose=true;
break;
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4381??2008-07-10?16:12??ACO解01背包問題\ACO解01背包問題.dsp
?????文件????????555??2008-07-10?15:32??ACO解01背包問題\ACO解01背包問題.dsw
?????文件??????50176??2008-07-11?18:59??ACO解01背包問題\ACO解01背包問題.ncb
?????文件??????48640??2008-07-11?18:59??ACO解01背包問題\ACO解01背包問題.opt
?????文件????????923??2008-07-11?18:43??ACO解01背包問題\ACO解01背包問題.plg
?????文件?????553044??2008-07-11?18:43??ACO解01背包問題\Debug\ACO解01背包問題.exe
?????文件?????817036??2008-07-11?18:43??ACO解01背包問題\Debug\ACO解01背包問題.ilk
?????文件????1147904??2008-07-11?18:43??ACO解01背包問題\Debug\ACO解01背包問題.pdb
?????文件?????352329??2008-07-11?18:43??ACO解01背包問題\Debug\main.obj
?????文件?????123904??2008-07-11?18:47??ACO解01背包問題\Debug\vc60.idb
?????文件?????110592??2008-07-11?18:43??ACO解01背包問題\Debug\vc60.pdb
?????文件???????4612??2008-07-11?18:43??ACO解01背包問題\main.cpp
?????文件????????122??2008-07-11?14:35??ACO解01背包問題\readme.txt
?????文件?????????65??2008-07-09?21:10??ACO解01背包問題\test1.txt
?????文件????????126??2008-07-09?21:10??ACO解01背包問題\test2.txt
?????文件?????????18??2008-07-11?14:29??ACO解01背包問題\test3.txt
?????文件?????????27??2008-07-11?14:30??ACO解01背包問題\test4.txt
?????文件?????????27??2008-07-11?14:34??ACO解01背包問題\test5.txt
?????文件?????157696??2011-01-19?20:29??ACO解01背包問題\蟻群算法實現(xiàn)0.doc
?????目錄??????????0??2011-01-19?20:27??ACO解01背包問題\Debug
?????目錄??????????0??2011-01-19?20:29??ACO解01背包問題
-----------?---------??----------?-----??----
??????????????3372177????????????????????21
評論
共有 條評論