?? sga.cpp
字號:
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
long* long2binary(long codelength,long ltochange);
int CreateChromN(long popsize, long lchrom, long* &plarray);
int ChromCross(double dPcross,long * plArray,long lPopsize, long lChrom);
int ChromMutation(double dpMutation,long* plArray,long lPopsize, long lChrom);
int RWS(long* plAdapt, long* plArray,long lPopsize, long lChrom);
//整數轉換為二進制
long* long2binary(long codelength,long ltochange)
{
long* plResult=new long[codelength];
if(plResult==NULL) return NULL;
for(int i=0;i<codelength;i++)//從低位開始
{
long aa=(long)pow(2,i);
if((ltochange&aa)==0)
plResult[codelength-1-i]=0; //但從高位開始存儲
else
plResult[codelength-1-i]=1 ;
}
return plResult;
}
//隨機產生染色體
int CreateChromN(long popsize, long lchrom, long* &plarray)
{
//隨機選擇編碼組
long *plAr= new long[popsize*lchrom];
if(plAr==NULL) return 0;
long *plSelection= new long[popsize];
if(plSelection==NULL) return 0;
long n=(long)pow(2,lchrom)-1;//可能的染色體分組
plSelection[0]=(int)(n*rand()/RAND_MAX);//取0到popsize之間的數
int i=0; //i從0開始
long tempSelection;
while(i<popsize-1)//??
{
int hh=0;
tempSelection=(long)(n*rand()/RAND_MAX);
for(int j=0;j<i+1;j++)
{
if(tempSelection==plSelection[j])
hh=hh+1;//計數,可以稍微提高效率,不比較完畢
}
if(hh==0) //沒有相同的數
{
i=i+1;
plSelection[i]=tempSelection;
}
}
//然后將數轉化為標準二進制編碼,且存儲
long* plBinary;
for(i=0;i<popsize;i++)
{
plBinary=long2binary(lchrom,plSelection[i]);
for(int j=i*lchrom;j<(i+1)*lchrom;j++)
plAr[j]=plBinary[j-i*lchrom];
}
plarray=plAr;
return 1;
//1 還是隨機選擇(固定二進制編碼,不用考慮優化編碼)*/
//2 隨機編碼?比較的工作量比較大
//return 1;
}
//operator &(long aa)
//**隨機選擇過程可以做成一個單獨的函數
//染色體進行交配
int ChromCross(double dpCross,long *plArray,long lPopsize, long lChrom)
{
//long plPop[20]={1,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,0,0,1,0};
//已知初始種群,數組大小為N=lPopsize*lChrom
//判斷數組是否含有非0,1值
for(int jj=0;jj<lPopsize*lChrom;jj++)
{
if((plArray[jj]!=1)&(plArray[jj]!=0))
return 0;
}
//交配的種群個數
long lPop2Cross=(long)lPopsize*dpCross;
//保證要交配的染色體個數為偶數
//減1比較好,如果+1,奇數個種群交配率為100%出現錯誤情況
if(lPop2Cross%2) lPop2Cross=lPop2Cross-1;
//交配位,0到lChrom之間
long lBit2Cross=(long)(lChrom-1)*rand()/RAND_MAX;
//隨機選擇其中的染色體進行交配,等概率交配,不考慮適應值
//方法是:隨機產生一數組(數的范圍在0-(lPopsize-1)之間),相鄰兩個進行交配
long* plSelection=new long[];
if(plSelection==NULL) return 0;
plSelection[0]=(long)((lPopsize-1)*rand()/RAND_MAX);//取0到(lPopsize-1)之間的數
int i=0; //i從0開始
long tempSelection;
while(i<lPop2Cross-1)//
{
int hh=0;
tempSelection=(long)((lPopsize-1)*rand()/RAND_MAX);
for(int j=0;j<i+1;j++)
{
if(tempSelection==plSelection[j])
hh=hh+1;//計數,可以稍微提高效率,不比較完畢
}
if(hh==0) //沒有相同的數
{
i=i+1;
plSelection[i]=tempSelection;
}
}
//plSelection[]存儲的是待交配的染色體的序號
//交配
for(int j=0;j<lPop2Cross;j=j+2)
{
for(long h=lBit2Cross;h<lChrom;h++)
{
long lTempBit;// 要交換的位
lTempBit=plArray[plSelection[j]*lChrom+h];
plArray[plSelection[j]*lChrom+h]=plArray[plSelection[j+1]*lChrom+h];
plArray[plSelection[j+1]*lChrom+h]=lTempBit;
}
}
/*for(j=0;j<20;j++)
{
plArray[j]=plPop[j];
}*/
return 1;
}
//染色體變異
int ChromMutation(double dpMutation,long* plArray,long lPopsize,long lChrom)
{
//判斷數組是否含有非0,1值
for(int jj=0;jj<lPopsize*lChrom;jj++)
{
if((plArray[jj]!=1)&(plArray[jj]!=0))
return 0;
}
//lPopsize:種群個數 lChrom:編碼長度
long lPoptoMutation=(long)lPopsize*dpMutation;
if(lPoptoMutation==0) return 1;
long lBittoMutation;
lBittoMutation=(long)(lChrom-1)*rand()/RAND_MAX;
long* plSelection=new long[];
plSelection[0]=(long)((lPopsize-1)*rand()/RAND_MAX);//取0到(lPopsize-1)之間的數
int i=0; //i從0開始
long tempSelection;
while(i<lPoptoMutation-1)//
{
int hh=0;
tempSelection=(long)((lPopsize-1)*rand()/RAND_MAX);
for(int j=0;j<i+1;j++)
{
if(tempSelection==plSelection[j])
hh=hh+1;//計數,可以稍微提高效率,不比較完畢
}
if(hh==0) //沒有相同的數
{
i=i+1;
plSelection[i]=tempSelection;
}
}
//plSelection[]存儲的是發生變異的染色體的索引
for(i=0;i<lPoptoMutation;i++)
{
if(plArray[plSelection[i]*lChrom+lBittoMutation]==1)
plArray[plSelection[i]*lChrom+lBittoMutation]=0;
else
plArray[plSelection[i]*lChrom+lBittoMutation]=1;
}
/* for(int j=0;j<20;j++)
{
plArray[j]=plPop[j];
}*/
return 1;
}
//輪盤賭算法
//給定N個染色體的適應值,求出染色體編碼數組
int RWS(long* plAdapt, long* plArray,long lPopsize, long lChrom)
{
//判斷數組是否含有非0,1值
for(int jj=0;jj<lPopsize*lChrom;jj++)
{
if((plArray[jj]!=1)&(plArray[jj]!=0))
return 0;
}
//存儲選擇概率
double* plP=new double[];
if(plP==NULL) return 0;
double dSum=0.0;
//求適應值的和
for(int i=0;i<lPopsize;i++)
{
dSum=dSum+plAdapt[i];
}
//求各選擇概率
for(i=0;i<lPopsize;i++)
{
plP[i]=plAdapt[i]/dSum;
}
//算法理解,分別產生隨機數,選擇染色體,包括被重復選取
//存儲被選取的染色體序號
long* plSelect=new long[lPopsize];
double dRand=0.0;
double dS=0;
int j=0;
srand((unsigned)time(NULL));
for(i=0;i<lPopsize;i++) //選取個體序列
{
dRand=static_cast<double>((rand()%100)*0.01);//精確到小數點后2位
dS=0;
for(j=0;j<lPopsize;j++) //染色體序列
{
if(dS>=dRand)
{
plSelect[i]=j;
break;
}
dS=dS+plP[j];
}
}
long* plSelectedPop=new long[lPopsize*lChrom];// 大小同于給定的初始群體
for(i=0;i<lPopsize;i++)
{
for(j=0;j<lChrom;j++)
{
plSelectedPop[i*lChrom+j]=plArray[plSelect[i]*lChrom+j];
}
}
for(j=0;j<lPopsize*lChrom;j++)
plArray[j]=plSelectedPop[j]; //需釋放
delete []plSelectedPop;
return 1;
}
void main()
{
// cout<<0.5*((int)(rand()/RAND_MAX))<<endl;
cout<<pow(2,3)<<endl;
printf("%d\n",8&1);
printf("%d\n",8&2);
printf("%d\n",8&4);
printf("%d\n",8&8);
printf("%d\n",8&16);
long* hehe=long2binary(5,8);
cout<<hehe[0]<<hehe[1]<<hehe[2]<<hehe[3]<<endl;//從高位到低位輸出
/* int hehe[4];
for(int i=0;i<4;i++)
{
if(8&&pow(2,i)==0) hehe[3-i]=0;
else hehe[4-i]=1;
}
*/
long* Result=new long[];
CreateChromN(8, 5, Result);
for(int i=0;i<20;i++)
cout<<Result[i]<<endl;
delete[] Result;
////////////////////////
long plPop[20]={1,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,0,0,1,0};
//交配算法調試
/*ChromCross(0.5,plPop,4,5);
for(i=0;i<20;i++)
cout<<(long)plPop[i]<<endl;*/
///////////////////////
//變異算法調試
//為驗證算法,pMutation取較大值,且要屏蔽交配算法,因交配算法修改了plPop
/* ChromMutation(0.25,plPop,4,5);
for(i=0;i<20;i++)
cout<<(long)plPop[i]<<endl;
*/
//輪盤賭法驗證
long lAdapt[4]={32,18,160,100};
RWS(lAdapt,plPop,4,5);
for(i=0;i<20;i++)
cout<<(long)plPop[i]<<endl;
////
srand( (unsigned)time(NULL));
double yyyy;
/* Display 10 numbers. *////隨機數產生不對
for( i = 0; i < 10;i++ )
{
yyyy=static_cast<double>((rand()%100)*0.01);
printf( "%.2f\n",yyyy);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -