📄 ga.h
字号:
#ifndef ga_h
#define ga_h
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<fstream>
#include<iomanip>
#include "head.h"
#define VehicleLoad 8
#define speed 50
#define maxgen 500
#define probility 0.99
using namespace std;
ofstream outfile;
int ImportNum;
void CImport::Print()
{
outfile<<left<<setw(7)<<GetOrder()<<setw(7)<<GetPointx()
<<setw(7)<<GetPointy()<<setw(7)<<GetLoad()
<<setw(7)<<GetTime()<<setw(7)<<GetEarlytime()
<<setw(10)<<GetLatetime()<<endl;
}// end of CImport::print
void CVehicleExport::Print()
{//打印出货点信息
outfile<<"\n CVehicleExport"
<<"\n name pointx pointy VehicleNum"<<endl;
outfile<<left<<setw(6)<<GetName()<<setw(7)<<GetPointx()
<<setw(7)<<GetPointy()<<setw(6)<<GetVehicleNum()
<<endl;
}// end of CVehicleExport::print
CVehicleExport::operator CImport()
{CImport ip;
int x=GetPointx();
int y=GetPointy();
ip.SetPointx(x);
ip.SetPointy(y);
return ip;
}
//全局变量
struct ppp
{
int *chrom;
float pc,pm;
double sumdd;
double fitness;
};
struct best
{
int *chrom;
int gen;
double sumdd;
double fitness;
};
CVehicleExport PtrVE;
int yy,maxpp=0;;
CImport * PtrIP; //动态生成
int popsize,lchrom;
float cmutation,mmutation,Rank,VehicleRate ;
struct ppp *oldpop,*newpop,*p1;
struct best bestfit;
double sumfitness,maxfitness,avgfitness,* dd;
int gen,earlity,late;
int *Index,*ff,maxpath,maxbest=0;
bool success;
int Randm(int x)
{//随机数生成函数
return 1+rand()%x;
}
void CImport::SetTime(int x)
{
cout<<"\nImport["<<x+1<<"] Time ";
cin>>Time;
cout<<"\nImport["<<x+1<<"] Earlytime ";
cin>>Earlytime;
cout<<"\nImport["<<x+1<<"] Latetime ";
cin>>Latetime;
}// end of for SetTime
void InitializeExport()
{//初始化CVehicleExport类函数
int x,y;
cout<<"\nInput VehicleExport pointx pointy\n";
cin>>x>>y;
CVehicleExport VE('A',x,y);
PtrVE=VE;
}// end of InitializeExport
void InitializeCImport()
{//初始化CImport类函数
cout<<"\nInput Import Number"<<endl;
cin>>ImportNum;
CImport * PIP=new CImport[ImportNum];
PtrIP=PIP;
double z;int x,y;
for (int i=0; i<ImportNum; i++)
{
cout<<"\nImport ["<<i+1<<"] pointx pointy ";
cin>>x>>y;
cout<<"\nImport ["<<i+1<<"] Load ";
cin>>z;
CImport vex(x,y,i+1,z);
PIP[i]=vex;
PIP[i].SetTime(i);
}// end of for
}// end of InitializeImport
double computedd(CImport IP,CImport VE)
{//计算两点间距
int i1=IP.GetPointx();
int j1=IP.GetPointy();
int i2=VE.GetPointx();
int j2=VE.GetPointy();
int x=abs(i1-i2);
int y=abs(j1-j2);
double z=pow(x,2)+pow(y,2);
return sqrt(z);
}// end of computedd
void InitializeIE()
{
InitializeExport();
InitializeCImport();
double x;
x=0.0;
for (int j=0;j<ImportNum;j++)
{
double z=PtrIP[j].GetLoad();
x+=z; //收货点需求的运载量和
}// end of for j
cout<<"\n Enter the goods Load rate(0.8~1)"<<endl;
cin>>VehicleRate;
while ((VehicleRate<0.8)||(VehicleRate>1))
{
cout<<"\n Enter the goods Load rate(0.8~1)"<<endl;
cin>>VehicleRate;
}
int m=int(x/(VehicleRate*VehicleLoad))+1;
PtrVE.SetVehicleNum(m);
PtrVE.Print();
outfile<<"\n CImport"
<<"\n Order pointx pointy Load loadtime earlytime latetime"<<endl;
for (int i=0;i<ImportNum;i++)
PtrIP[i].Print();
}// end of InitializeIE
void InitializeData()
{
cout<<"\n Enter population size(140~240)"<<endl;
cin>>popsize;
cout<<"\n Enter the probility for cmutation (0.6~ 0.9)"<<endl;
cin>>cmutation;
while ((cmutation<0.0)||(VehicleRate>1))
{
cout<<"\n Enter the probility for cmutation (0.6~ 0.9)"<<endl;
cin>>cmutation;
}
cout<<"\n Enter the probility for mmutation (0.05~ 0.1)"<<endl;
cin>>mmutation;
while ((mmutation<0.0)||(mmutation>1))
{
cout<<"\n Enter the probility for mmutation (0.05~ 0.1)"<<endl;
cin>>mmutation;
}
cout<<"\n Enter the parameter for rank pick probility when select (0.2~ 0.5)"<<endl;
cin>>Rank;
while ((Rank<0.0)||(Rank>1))
{
cout<<"\n Enter the parameter for rank pick probility when select (0.2~ 0.5)"<<endl;
cin>>Rank;
}
earlity=3;
late=6;
}// end of InitializeData
void InitializeMemory()
{//种群分配内存
oldpop=new struct ppp[popsize];
if (oldpop==0)
{
cout<<"Memory allocation for oldpop fail"<<endl;
exit(0);
}// end of oldpop
newpop=new struct ppp[popsize];
if (newpop==0)
{
cout<<"Memory allocation for newpop fail"<<endl;
exit(0);
}// end of newpop
p1=new struct ppp[popsize];
if (p1==0)
{
cout<<"Memory allocation for p1 fail"<<endl;
exit(0);
}// end of p1
}// end of InitializeMemory
void InitializeDataMemory()
{//染色体分配内存
lchrom=ImportNum+yy+1;
for (int i=0;i<popsize;i++)
{
oldpop[i].chrom=new int[lchrom];
if (oldpop[i].chrom==0)
{
cout<<"Memory allocation for oldpop.chrom fail"<<endl;
exit(0);
}
newpop[i].chrom=new int[lchrom];
if (newpop[i].chrom==0)
{
cout<<"Memory allocation for newpop.chrom fail"<<endl;
exit(0);
}
p1[i].chrom=new int[lchrom];
if (p1[i].chrom==0)
{
cout<<"Memory allocation for p1.chrom fail"<<endl;
exit(0);
}
}// end of for i
bestfit.chrom=new int[lchrom];
if (bestfit.chrom==0)
{
cout<<"Memory allocation for bestfit.chrom fail"<<endl;
exit(0);
}
}// end of InitializeDataMemory
void InitializeCoordinate()
{//初始化收货点间距离数组
int ll=pow(ImportNum+1,2); int y;
dd=new double[ll];
for (int i=0;i<ll;i++)
dd[i]=0.0; maxpath=0;
for ( i=0;i<ImportNum;i++)
{
for (int j=i+1;j<ImportNum;j++)
{y=(i+1)*(ImportNum+1)+j+1;
int z=(j+1)*(ImportNum+1)+i+1;
dd[z]=dd[y]=computedd(PtrIP[i],PtrIP[j]);
if (dd[y]>maxpath)
maxpath=dd[y];
}// end of for j
}// end of for i
for ( i=0;i<ImportNum;i++)
{
y=i+1;
int z=(i+1)*(ImportNum+1);
dd[z]=dd[y]=computedd(PtrIP[i],PtrVE);
if (dd[y]>maxpath)
maxpath=dd[y];
}// end of for i
for (i=0;i<ll;i++)
{
int z=i/(ImportNum+1);
int m=i % (ImportNum+1);
outfile<<"\n"
<<"path["<<z<<" "<<m<<"] "<<left<<setw(6)<<dd[i];
if (m+1==ImportNum+1)
outfile<<"\n";
}
}// end of InitializeCoordinate
void InitData()
{//初始化染色体
int* p5=new int[lchrom];
int z=(int)(ImportNum/2);
for (int i=0;i<ImportNum+1;i++)
p5[i]=i;
srand(time(0));
for ( i=0;i<yy-1;i++) //插入车辆标记
{
int m=ImportNum+i-1;
int r=Randm(m);
while (r==1) r=Randm(m);
while ((p5[r-1]==0)||(p5[r+1]==0)||(p5[r]==0))
r=Randm(m);
for (int k=ImportNum+i+1;k>r;k--) p5[k]=p5[k-1];
p5[r]=0;
}// end of for
p5[ImportNum+yy]=0; //p5[lchrom-1]=0
int j=0;
for (int k=0;k<lchrom;k++)
oldpop[j].chrom[k]=p5[k];
for (j=1;j<popsize;j++) //模拟随机产生染色体过程
{
int j2=Randm(lchrom-2); //1~lchrom-2之间的随机数
for ( k=0;k<j2+z;k++) //z?=为什么是15
{
int j3=Randm(lchrom-2);
int j4=Randm(lchrom-2);
while (j3==j4) j4=Randm(lchrom-2);
if (j3>j4)
{
int q=j4;
j4=j3;
j3=q;
}
if ((p5[j3-1]!=p5[j4])&&(p5[j3+1]!=p5[j4])&&(p5[j3]!=p5[j4-1])&&(p5[j3]!=p5[j4+1])||(abs(j3-j4)==1)&&(p5[j3]!=p5[j4+1])&&(p5[j4]!=p5[j3-1]))
{
int j1=p5[j3];
p5[j3]=p5[j4];
p5[j4]=j1;
}// end of for if
}// end of for k
for (int k=0;k<lchrom;k++)
oldpop[j].chrom[k]=p5[k];
}// end of for j
delete[] p5;
p5=0;
}// end of for InitData
void ComputeFitness(struct ppp * pop)
{//计算染色体的适应度
int *p5=new int[lchrom]; double max=0.0;
double fff=maxpath*pow(ImportNum,2);
double sumdd; double T=0.0;
for (int i=0;i<popsize;i++)
{
sumdd=0.0;
for (int k=0;k<lchrom;k++)
p5[k]=pop[i].chrom[k];
/* p5[0]=0;p5[1]=8;p5[2]=5;p5[3]=7;
p5[4]=0;p5[5]=6;p5[6]=4;p5[7]=0;
p5[8]=3;p5[9]=1;p5[10]=2;p5[11]=0;*/
for ( k=0;k<lchrom-1;k++)
{//计算路径
int site=p5[k]*(ImportNum+1)+p5[k+1];
sumdd+=dd[site];
if (p5[k+1]!=0)
{//时间惩罚计算
double TT=double(dd[site])/double(speed)+T; //人员休息时间算在装车时间time中
int x=p5[k+1]-1; //TT实际到达时间
double time1=PtrIP[x].GetEarlytime(); //T累计时间
double time=PtrIP[x].GetTime();
double time2=PtrIP[x].GetLatetime();
if (TT<time1)
{//提前到达 车等待
sumdd+=(time1-TT)*5*earlity;
T=time1+time;
}// end of TT<time1
else if (TT>time2)
{//晚到 客等
sumdd+=(TT-time2)*5*late;
T=TT+time;
}// end of TT>time2
else
{//要求时间内到达
T=TT+time;
}//end of else
}//end of if
else
{//空车费用
T=0;
sumdd+=500;
}
}// end of for k
double subgood=0;
for ( k=1;k<lchrom;k++)
{//超载惩罚计算
if (p5[k]!=0)
{
int j=p5[k]-1;
subgood+=PtrIP[j].GetLoad();
}
else
{
if ((subgood!=0)&&(subgood>VehicleLoad))
sumdd+=(subgood-VehicleLoad)*20*ImportNum*5;
subgood=0.0;
}
}// end of for k
if (max<sumdd)
max=sumdd;
// outfile<<"sumdd="<<sumdd;
pop[i].sumdd=sumdd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -