1ãç¨åºå¼åç¯å¢
å¼åç¯å¢ï¼Visual C++6.0 (æFortranç¨åºæ¹ä¸ºVC)
æä½ç³»ç»ï¼Windows 2003 Professional
2ãç¨åºæ§è½å¯¹æ¯
è¿è¡æ¶é´ä¸å éæ¯ï¼å¦è¡¨1æ示ï¼
è¿ç¨æ°pï¼ä¸ªï¼ 1 2 4
è¿è¡æ¶é´tï¼ç§ï¼ 129s 78s 38s
å éæ¯s 1.65 3.38
表1ãè¿è¡æ¶é´ä¸å éæ¯
3ãç¨åºè¿è¡ç»æï¼
å®ä¾æ°æ®ï¼
å设ç©ä½çééWeightãç©ä½çæ¶çProfitåèå
ç容éContain åå«ä¸ºï¼
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ï¼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ï¼ 8ï¼ 5ï¼ 3ï¼ 1}
Contain=1000ï¼
å¦ä½éæ©åªäºç©åè£
å
¥è¯¥èå
å¯ä½¿å¾å¨èå
ç容é约æéå¶ä¹å
æè£
ç©åçæ»ä»·å¼æ大?
ä¼ ç»çç®æ³ï¼å¨æè§åãéå½å溯æ³åè´ªå¿ç®æ³æå¾ç»æï¼
æ»ä»·å¼ä¸º3077 , æ»éé为999ã
2001å¹´å¼ éï¼å¼ é¹ææå¨è®¡ç®æºå¦æ¥ä¸å表çãä½³ç¹ééä¼ ç®æ³ãæå¾ç»æ
æ»ä»·å¼ä¸º3103, æ»éé为1000ã
æ们ç®æ³æå¾ç»æï¼ æ»ä»·å¼ä¸º3103, æ»éé为1000ã
æ们ææ±å¾æä¼è§£ç个ä½åé
æ
åµä¸ºï¼
11010 10111 10110 11011 01111 11101 00001 01001 10000
01000
ç®æ³ æ大è¿ä»£æ¬¡æ° æ»ä»·å¼ä¸º æ»éé为
ä¼ ç»çç®æ³ 400 3077 999
ä½³ç¹éç®æ³ 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>
// éè¦å¸¸éåæ°
#define popsize 200 //ç§ç¾¤çè§æ¨¡
#define pc 0.618 //æ交æ¦ç
#define pm 0.03 //åå¼æ¦ç
#define lchrom 50 //æè²ä½é¿åº¦
#define maxgen 1000 //æ大è¿å代æ°
struct population
{
unsigned int chrom[lchrom]; //æè²ä½
double weight; //èå
éé
double fitness; //éåºåº¦
unsigned int parent1,parent2,cross; //å亲ã交åç¹
};
//æ°ç代ç§ç¾¤ãç¶ä»£ç§ç¾¤
struct population oldpop[popsize],newpop[popsize];
//èå
é®é¢ä¸ç©ä½ééãæ¶çãèå
容é
int weight[lchrom],profit[lchrom],contain;
//ç§ç¾¤çæ»éåºåº¦ãæå°ãæ大ãå¹³åéåºåº¦
double sumfitness,minfitness,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;j<lchrom;j++)
{
fscanf(fp,"%d",&profit[j]);
}
//读å
¥ç©ä½ééä¿¡æ¯
for (j=0;j<lchrom;j++)
{
fscanf(fp,"%d",&weight[j]);
}
//读å
¥èå
容é
fscanf(fp,"%d",&contain);
fclose(fp);
}
//æ ¹æ®è®¡ç®ç个ä½éé,å¤ææ¤ä¸ªä½æ¯å¦è¯¥çå¨ç¾¤ä½ä¸
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)*weight[j];
chr++;
}
return pop_weight;
}
/* ç§ç¾¤ä¸ä¸ªä½éåºåº¦è®¡ç®*/
double cal_fit(unsigned int *chr)
{
int j;
double pop_profit;//éåºåº¦
pop_profit=0;
// pop_weight=0;
for (j=0;j<lchrom;j++)
{
pop_profit=pop_profit+(*chr)*profit[j];
// pop_weight=pop_weight+(*chr)*weight[j];
chr++;
}
return pop_profit;
}
/* 群ä½éåºåº¦çæ大æå°å¼ä»¥åå
¶ä»ä¿¡æ¯ */
void statistics(struct population *pop)
{
int i;
double tmp_fit;
sumfitness=pop[0].fitness;
minfitness=pop[0].fitness;
minpop=0;
maxfitness=pop[0].fitness;
maxpop=0;
for (i=1;i<popsize;i++)
{
//计ç®ç§ç¾¤çæ»éåºåº¦
sumfitness=sumfitness+pop[i].fitness;
tmp_fit=pop[i].fitness;
//éæ©ç§ç¾¤ä¸æ大éåºåº¦ç个ä½
if ((tmp_fit>maxfitness)&&((int)(tmp_fit*10)%10==0))
{
maxfitness=pop[i].fitness;
maxpop=i;
}
//éæ©ç§ç¾¤ä¸æå°éåºåº¦ç个ä½
if (tmp_fit<minfitness)
{
minfitness=pop[i].fitness;
minpop=i;
}
//计ç®å¹³åéåºåº¦
avgfitness=sumfitness/(float)popsize;
}
// printf("\nthe max pop = %d;",maxpop);
// printf("\nthe min pop = %d;",minpop);
// printf("\nthe sumfitness = %f\n",sumfitness);
}
//æ¥åç§ç¾¤ä¿¡æ¯
void report(struct population *pop,int gen)
{
int j;
int pop_weight=0;
printf("the generation is %d.\n",gen); //è¾åºç§ç¾¤ç代æ°
//è¾åºç§ç¾¤ä¸æ大éåºåº¦ä¸ªä½çæè²ä½ä¿¡æ¯
printf("The population's chrom is: \n");
for (j=0;j<lchrom;j++)
{
if (j%5==0)
{ printf(" ");}
printf("%1d",pop[maxpop].chrom[j]);
}
//è¾åºç¾¤ä½ä¸æ大éåºåº¦
printf("\nThe population's max fitness is %d.",(int)pop[maxpop].fitness);
printf("\nThe knapsack weight is %d.\n\n",(int)pop[maxpop].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++)
{
oldpop[i].chrom[j]=rand()%2; //éæºçæ个ä½çæè²ä½
oldpop[i].parent1=0; //å亲
oldpop[i].parent2=0;
oldpop[i].cross=0; //交åç¹
}
//éæ©ééå°äºèå
容éç个ä½,å³æ»¡è¶³æ¡ä»¶
tmpWeight=cal_weight(oldpop[i].chrom);
if (tmpWeight<=contain)
{
oldpop[i].fitness=cal_fit(oldpop[i].chrom);
oldpop[i].weight=tmpWeight;
oldpop[i].parent1=0;
oldpop[i].parent2=0;
oldpop[i].cross=0;
ispop=true;
}
}
//æ¤ä¸ªä½å¯ä»¥å å
¥å°ç§ç¾¤ä¸
ispop=false;
}
}
/* éä¼ æä½ */
//æ¦çéæ©è¯éª
int execise(double probability)
{
double pp;
//å¦æçæéæºæ°å¤§äºç¸åºçæ¦çåè¿åçï¼å¦åè¯éªä¸æå
pp=(double)(rand()%20001/20000.0);
if (pp<=probability) return 1;
return 0;
}
// éæ©è¿è¡äº¤åæä½ç个ä½
int selection(int pop)
{
double wheel_pos,rand_Number,partsum;
int parent;
//èµè½®æ³éæ©
rand_Number=(rand()%2001)/2000.0;
wheel_pos=rand_Number*sumfitness; //èµè½®å¤§å°
partsum=0;
parent=0;
do{
partsum=partsum+oldpop[parent].fitness;
parent=parent+1;
} while (partsum<wheel_pos && parent<popsize);
return parent-1;
}
/* 交åæä½ */
int crossover(unsigned int *parent1,unsigned int *parent2,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++)
{ //ä¿çå¤å¶ï¼
//å
æ¬å¨æ¦çéæ©ä¸æåæ¶ï¼ç¶ä½å®å
¨ä¿ç
newpop[i].chrom[j]=parent1[j];
}
for(j=cross_pos+1;j<=(lchrom-1);j++)
{
//ä»äº¤åç¹å¼å§äº¤å
newpop[i].chrom[j]=parent2[j];
}
//è®°å½äº¤åä½ç½®
newpop[i].cross=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 (!ispop)
{
//éæ©
mate1=selection(i);
mate2=selection(i+1);
//交å
crossover(oldpop[mate1].chrom,oldpop[mate2].chrom,i);
//åå¼
for (j=0;j<lchrom;j++)
{
newpop[i].chrom[j]=mutation(newpop[i].chrom[j]);
}
//éæ©ééå°äºèå
容éç个ä½,å³æ»¡è¶³æ¡ä»¶
tmpWeight=cal_weight(newpop[i].chrom);
if (tmpWeight<=contain)
{
newpop[i].fitness=cal_fit(newpop[i].chrom);
newpop[i].weight=tmpWeight;
newpop[i].parent1=mate1;
newpop[i].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 ) );//ç½®éæºç§å
initpop();
memcpy(&newpop,&oldpop,popsize*sizeof(struct population));
statistics(newpop);//ç»è®¡æ°çç§ç¾¤çä¿¡æ¯
report(newpop,gen);
while(gen<maxgen)
{
gen=gen+1;
if (gen%100==0)
{
srand( (unsigned)time( NULL ) );//ç½®éæºç§å
}
oldmax=maxfitness;
oldmaxpop=maxpop;
generation();
statistics(newpop); //ç»è®¡æ°ç代ç§ç¾¤ä¿¡æ¯
//å¦ææ°ç代ç§ç¾¤ä¸ä¸ªä½çæ大éåºåº¦å°äºèä¸ä»£ç§ç¾¤
//个ä½çæ大éåºåº¦ï¼åä¿åèä¸ä»£ç§ç¾¤ä¸ªä½çæ大éåºåº¦
//å¦åæ¥åæ°ç代çæ大éåºåº¦
if (maxfitness<oldmax)
{
for(k=0;k<lchrom;k++)
newpop[minpop].chrom[k]=oldpop[oldmaxpop].chrom[k];
newpop[minpop].fitness=oldpop[oldmaxpop].fitness;
newpop[minpop].parent1=oldpop[oldmaxpop].parent1;
newpop[minpop].parent2=oldpop[oldmaxpop].parent2;
newpop[minpop].cross=oldpop[oldmaxpop].cross;
statistics(newpop);
}
else if (maxfitness>oldmax)
{
report(newpop,gen);
}
//ä¿åæ°ç代ç§ç¾¤çä¿¡æ¯å°èä¸ä»£ç§ç¾¤ä¿¡æ¯ç©ºé´
memcpy(&oldpop,&newpop,popsize*sizeof(struct population));
}
printf("It is over.");
getch();
}
追é®è¿ä¸ªæ²¡æè´ªå¿ç®æ³çï¼è½ä¸è½æ±ä¸ä¸ªä¸¤ä¸ªç¸ç»åçåï¼ï¼ï¼
追çèå
è¿è½ç¨è´ªå¿è§£åï¼
é¤äºè¿ä¸ªæåªç¥éæç´¢åå¨æè§å