TSP问题
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "math.h"
#include "time.h"
#include <unistd.h>
#include <bits/stdc++.h>
#define Citynum 100
#define Popnum 300
#define Maxbound 10000000
#define N 1000000
unsigned seed=(unsigned)time(0);
double Hash[Citynum+1];
typedef struct CityPosition
{
double x;
double y;
}CityPosition;
CityPosition CityPos[100]={
{11003.611100,42102.500000},{11108.611100,42373.888900},{11133.333300,42885.833300},
{11155.833300,42712.500000},{11183.333300,42933.333300},{11297.500000,42853.333300},
{11310.277800,42929.444400},{11416.666700,42983.333300},{11423.888900,43000.277800},
{11438.333300,42057.222200},
{11461.111100,43252.777800},{11485.555600,43187.222200},{11475.555600,43187.222200},
{11503.055600,42855.277800},{11511.388900,42106.388900},{11522.222200,42841.944400},
{11569.444400,43136.666700},{11583.333300,43150.000000},{11595.000000,43148.055600},
{11600.000000,43150.000000},
{11690.555600,42686.666700},{11715.833300,41836.111100},{11745.277800,42884.444400},
{11751.111100,42814.444400},{11770.277800,42651.944400},{11785.277800,42884.444400},
{11822.777800,42673.611100},{11846.944400,42660.555600},{11963.055600,43290.555600},
{11973.055600,43026.111100},
{12058.333300,42195.555600},{12149.444400,42477.500000},{13785.177800,42884.444400},
{12286.944400,43355.555600},{12300.000000,42433.333300},{12355.833300,43156.388900},
{12363.333300,43189.166700},{12372.777800,42711.388900},{12386.666700,43334.722200},
{12421.666700,42895.555600},
{13645.000000,42973.333300},{13149.444400,42477.500000},{13785.177800,43884.444400},
{13286.944400,43355.555600},{13300.000000,42433.333300},{13355.833300,43156.388900},
{13363.333300,43189.166700},{13372.777800,42711.388900},{13386.666700,43334.722200},
{14421.666700,42895.555600},
{14003.611100,44102.500000},{14108.611100,42373.888900},{14133.333300,44885.833300},
{14155.833300,44712.500000},{14183.333300,42933.333300},{14297.500000,44853.333300},
{14310.277800,44929.444400},{14416.666700,42983.333300},{14423.888900,45000.277800},
{14438.333300,44057.222200},
{11461.111100,45252.777800},{11485.555600,45187.222200},{11475.555600,45187.222200},
{11503.055600,45855.277800},{11511.388900,45106.388900},{11522.222200,45841.944400},
{11569.444400,45136.666700},{11583.333300,45150.000000},{11595.000000,45148.055600},
{11600.000000,45150.000000},
{11690.555600,46686.666700},{11715.833300,46836.111100},{11745.277800,46884.444400},
{11751.111100,46814.444400},{11770.277800,46651.944400},{11785.277800,46884.444400},
{11822.777800,46673.611100},{11846.944400,46660.555600},{11963.055600,46290.555600},
{11973.055600,46026.111100},
{12058.333300,47195.555600},{12149.444400,47477.500000},{13785.177800,47884.444400},
{12286.944400,47355.555600},{12300.000000,47433.333300},{12355.833300,47156.388900},
{12363.333300,47189.166700},{12372.777800,47711.388900},{12386.666700,47334.722200},
{12421.666700,47895.555600},
{13645.000000,48973.333300},{13149.444400,48477.500000},{13785.177800,48884.444400},
{13286.944400,48355.555600},{13300.000000,48433.333300},{13355.833300,48156.388900},
{13363.333300,48189.166700},{13372.777800,48711.388900},{13386.666700,48334.722200},
{14421.666700,48895.555600}
};
double CityDistance[Citynum][Citynum];
typedef struct{
int colony[Popnum][Citynum+1];
double fitness[Popnum];
double Distance[Popnum];
int BestRooting[Citynum+1];
double BestFitness;
double WorstFitness;
double SumFitness;
double priFitness;
double BestValue;
int BestNum;
}TSP,*PTSP;
void CalculatDist(){
int i,j;
double temp1,temp2;
for(i=0;i<Citynum;i++){
for(j=0;j<=Citynum;j++){
temp1=CityPos[j].x-CityPos[i].x;
temp2=CityPos[j].y-CityPos[i].y;
CityDistance[i][j]=sqrt(temp1*temp1+temp2*temp2);
}
}
}
void copy(int a[],int b[]){
int i=0;
for(i=0;i<Citynum+1;i++){
a[i]=b[i];
}
}
bool check(TSP &city,int pop,int num,int k){
int i;
for(i=0;i<=num;i++){
if(k==city.colony[pop][i])
return true;
}
return false;
}
void InitColony(TSP &city){
int i,j,r;
for(i=0;i<Popnum;i++){
city.colony[i][0]=0;
city.colony[i][Citynum]=0;
city.BestValue=Maxbound;
city.BestFitness=0;
city.WorstFitness=100;
city.SumFitness=0;
city.priFitness=0;
}
for(i=0;i<Popnum;i++){
for(j=1;j<Citynum;j++){
r=rand()%(Citynum-1)+1;
while(check(city,i,j,r))
{ r=rand()%(Citynum-1)+1;}
city.colony[i][j]=r;
}
}
}
void CalFitness(TSP &city)
{
int i,j;
int start,end;
int Best=0,Worst=0;
city.SumFitness=0;
for(i=0;i<Popnum;i++){
city.Distance[i]=0;
for(j=1;j<=Citynum;j++){
start=city.colony[i][j-1];
end=city.colony[i][j];
city.Distance[i]=city.Distance[i]+CityDistance[start][end];
}
city.fitness[i]=N/city.Distance[i];
if(city.fitness[i]>city.fitness[Best])
Best=i;
if(city.fitness[i]<city.fitness[Worst])
Worst=i;
city.SumFitness=city.SumFitness+city.fitness[i];
}
copy(city.BestRooting,city.colony[Best]);
city.BestFitness=city.fitness[Best];
city.WorstFitness=city.fitness[Worst];
city.BestValue=city.Distance[Best];
city.priFitness=city.SumFitness/Popnum;
city.BestNum=Best;
}
void Select(TSP &city)
{
int TempColony[Popnum][Citynum+1];
int i,j,t;
double s;
double GaiLv[Popnum];
double SelectP[Popnum+1];
double avg;
double sum=0;
for(i=0;i<Popnum;i++)
{sum+=city.fitness[i];}
for(i=0;i<Popnum;i++)
{GaiLv[i]=city.fitness[i]/sum;}
SelectP[0]=0;
for(i=0;i<Popnum;i++)
{SelectP[i+1]=SelectP[i]+GaiLv[i]*RAND_MAX;}
memcpy(TempColony[0],city.colony[city.BestNum],sizeof(TempColony[0]));
for(t=1;t<Popnum;t++){
double ran = rand() % RAND_MAX + 1;
s= (double) ran / 100.0;
for(i=1;i<Popnum;i++){
if(SelectP[i]>=s)
break;
}
memcpy(TempColony[t],city.colony[i-1],sizeof(TempColony[t]));
}
for(i=0;i<Popnum;i++){
memcpy(city.colony[i],TempColony[i],sizeof(TempColony[i]));
}
}
void Cross(TSP &city,double pc)
{
int i,j,t,l;
int a,b,ca,cb;
int Temp1[Citynum+1],Temp2[Citynum+1];
for(i=0;i<Popnum;i++){
double s=((double)(rand()%RAND_MAX))/RAND_MAX;
if(s<pc){
cb=rand()%Popnum;
ca=cb;
if(ca==city.BestNum||cb==city.BestNum)
continue;
l=rand()%50+1;
a=rand()%(Citynum-l)+1;
memset(Hash,0,sizeof(Hash));
Temp1[0]=Temp1[Citynum]=0;
for(j=1;j<=l;j++)
{
Temp1[j]=city.colony[cb][a+j-1];
Hash[Temp1[j]]=1;
}
for(t=1;t<Citynum;t++)
{
if(Hash[city.colony[ca][t]]==0)
{
Temp1[j++]=city.colony[ca][t];
Hash[city.colony[ca][t]]=1;
}
}
memcpy(city.colony[ca],Temp1,sizeof(Temp1));
}
}
}
double GetFittness(int a[Citynum+1])
{
int i,start,end;
double Distance=0;
for(i=0;i<Citynum;i++)
{
start=a[i]; end=a[i+1];
Distance+=CityDistance[start][end];
}
return N/Distance;
}
void Mutation(TSP &city,double pm)
{
int i,k,m;
int Temp[Citynum+1];
for(k=0;k<Popnum;k++)
{
double s=((double)(rand()%RAND_MAX))/RAND_MAX;
i=rand()%Popnum;
if(s<pm&&i!=city.BestNum)
{
int a,b,t;
a=(rand()%(Citynum-1))+1;
b=(rand()%(Citynum-1))+1;
copy(Temp,city.colony[i]);
if(a>b)
{
t=a;
a=b;
b=t;
}
for(m=a;m<(a+b)/2;m++)
{
t=Temp[m];
Temp[m]=Temp[a+b-m];
Temp[a+b-m]=t;
}
if(GetFittness(Temp)<GetFittness(city.colony[i]))
{
a=(rand()%(Citynum-1))+1;
b=(rand()%(Citynum-1))+1;
memcpy(Temp,city.colony[i],sizeof(Temp));
if(a>b)
{
t=a;
a=b;
b=t;
}
for(m=a;m<(a+b)/2;m++)
{
t=Temp[m];
Temp[m]=Temp[a+b-m];
Temp[a+b-m]=t;
}
if(GetFittness(Temp)<GetFittness(city.colony[i]))
{
a=(rand()%(Citynum-1))+1;
b=(rand()%(Citynum-1))+1;
memcpy(Temp,city.colony[i],sizeof(Temp));
if(a>b)
{
t=a;
a=b;
b=t;
}
for(m=a;m<(a+b)/2;m++)
{
t=Temp[m];
Temp[m]=Temp[a+b-m];
Temp[a+b-m]=t;
}
}
}
memcpy(city.colony[i],Temp,sizeof(Temp));
}
}
}
void OutPut(TSP &city)
{
int i,j;
printf("最佳路径为:\n");
for(i=0;i<=Citynum;i++){
if(i==Citynum)
printf("%d",city.BestRooting[i]);
else
printf("%d-->",city.BestRooting[i]);
}
printf("\n最佳路径值为:%f\n",(city.BestValue));
}
int main()
{
TSP city;
double pcross,pmutation;
double Sfitness=0;
double Pfitness;
int MaxEpoc;
int i;
srand(seed);
MaxEpoc=30000;
pcross=0.85; pmutation=0.15;
CalculatDist();
InitColony(city);
CalFitness(city);
int begintime,endtime;
double Ptime;
begintime=clock();
for(i=0;i<MaxEpoc;i++)
{
Select(city);
Cross(city,pcross);
Mutation(city,pmutation);
CalFitness(city);
Sfitness=Sfitness+city.priFitness;
}
endtime=clock();
Ptime=float(endtime-begintime)/MaxEpoc;
Pfitness=Sfitness/MaxEpoc;
printf("最大适应度:%lf\n",city.BestFitness);
printf("最小适应度:%lf\n",city.WorstFitness);
printf("平均适应度:%lf\n",Pfitness);
printf("平均时间:%lfms\n",Ptime);
OutPut(city);
return 0;
}
rosenbrock问题
#include <iostream>
#include "time.h"
#include "stdlib.h"
#include <cmath>
using namespace std;
const int M=8,T=3;
const double pc=0.6,pm=0.01;
struct population
{
int x[20];
double x1,x2;
double fit;
double sumfit;
}p[M];
void initial(population *);
void evaluefitness(population *);
void select(population *);
void crossover(population *);
void mutation(population *);
void decoding(population *);
void print(population *);
int main()
{
int gen=0;
initial(&p[0]);
cout<<"initialed!"<<endl;
print(&p[0]);
decoding(&p[0]);
cout<<"decoded!"<<endl;
print(&p[0]);
evaluefitness(&p[0]);
cout<<"evalued!"<<endl;
print(&p[0]);
while(gen<=T)
{
cout<<"gen="<<gen+1<<endl;
select(&p[0]);
decoding(&p[0]);
evaluefitness(&p[0]);
cout<<"selected!"<<endl;
print(&p[0]);
crossover(&p[0]);
decoding(&p[0]);
evaluefitness(&p[0]);
cout<<"crossovered!"<<endl;
print(&p[0]);
mutation(&p[0]);
decoding(&p[0]);
evaluefitness(&p[0]);
cout<<"mutated!"<<endl;
print(&p[0]);
gen++;
}
decoding(&p[0]);
evaluefitness(&p[0]);
cout<<"最后得出的满意解为:"<<endl;
for(int i=0;i<M;i++)
cout<<"x1:"<<p[i].x1<<" x2:"<<p[i].x2<<" 值:"<<p[i].fit<<endl;
return 0;
}
int rand01()
{
int r;
double q;
q=rand()/(RAND_MAX+0.0);
if(q<0.5)
r=0;
else
r=1;
return r;
}
void initial(population *t)
{
int j;
population *po;
srand(time(0));
for(po=t;po<t+M;po++)
for(j=0;j<40;j++)
(*po).x[j]=rand01();
}
void evaluefitness(population *t)
{
double f,x1,x2,x3,x4,temp=0.0;
population *po,*po2;
for(po=t;po<t+M;po++)
{
x1=po->x1;
x2=po->x2;
f=100.0*(x1*x1-x2*x2)*(x1*x1-x2*x2)+(1.0-x1)*(1.0-x1)
(*po).fit=f;
}
for(po=t;po<t+M;po++)
{
for(po2=t;po2<=po;po2++)
temp=temp+(*po2).fit;
(*po).sumfit=temp;
temp=0.0;
}
}
double randab(double a ,double b)
{
double c,r;
c=b-a;
r=a+c*rand()/(RAND_MAX+1.0);
return r;
}
void select(population *t)
{
int i=0;
population pt[M],*po;
double s;
srand(time(0));
while(i<M)
{
s=randab((*t).sumfit,(*(t+M-1)).sumfit);
for(po=t;po<t+M;po++)
{
if((*po).sumfit>=s)
{
pt[i]=(*po);
break;
}
else
continue;
}
i++;
}
for(i=0;i<M;i++)
for(int j=0;j<20;j++)
p[i].x[j]=pt[i].x[j];
}
void crossover(population *t)
{
population *po;
double q;
int d,e,tem[20];
srand(time(0));
for(po=t;po<t+M;po++)
{
q=rand()/(RAND_MAX+0.0);
if(q<pc)
{
for(int j=0;j<M;j++)
{
e=rand()%M;
if(t+e!=po)
break;
}
d=1+rand()%19;
for(int i=d;i<20;i++)
{
tem[i]=(*po).x[i];
(*po).x[i]=(*(t+e)).x[i];
(*(t+e)).x[i]=tem[i];
}
}
else
continue;
}
}
void mutation(population *t)
{
double q;
population *po;
srand(time(0));
for(po=t;po<t+M;po++)
{
int i=0;
while(i<20)
{
q=rand()/(RAND_MAX+0.0);
if(q<pm)
(*po).x[i]=1-(*po).x[i];
i++;
}
}
}
int dexp(int a,int n)
{
int m=1;
for(int i=0;i<n;i++)
m=m*2;
m=m*a;
return m;
}
void decoding(population *t)
{
population *po;
int temp,s1=0,s2=0,s3=0,s4=0;
double m,n,dit;
n=dexp(1,10);
dit=60/n;
for(po=t;po<t+M;po++)
{
for(int i=0;i<10;i++)
{
temp=dexp((*po).x[i],i);
s1=s1+temp;
}
m=-30.00+s1*dit;
(*po).x1=m;
s1=0;
for(int j=10;j<20;j++)
{
temp=dexp((*po).x[j],j-10);
s2=s2+temp;
}
m=-30.00+s2*dit;
(*po).x2=m;
s2=0;
}
}
void print(population *t)
{
population *po;
for(po=t;po<t+M;po++)
{
for(int j=0;j<20;j++)
{
cout<<po->x[j];
if((j+1)%5==0)
cout<<" ";
}
cout<<endl;
cout<<po->x1<<" "<<po->x2<<po->fit<<" "<<po->sumfit<<endl;
}
}