?? ant_testdlg.cpp
字號:
{
//select a path with maximum pheromone
next_pos=0;
for (i=1; i<10; i++)
if (tau[layer][last_pos][i]>tau[layer][last_pos][next_pos])
next_pos=i;
ant[ant_no][layer]=next_pos;
}
else
{
//select a path randomly according to pseudo-random-proportional rule
next_pos=0;
t=(float)rand()/RAND_MAX*tau[layer][last_pos][10];
for (i=0; i<10 -1; i++) //the for statement just need to run till i==8, as i==9 is the last choise
if(tau[layer][last_pos][i]>t)
break;
else
t-=tau[layer][last_pos][i];
ant[ant_no][layer]=i;
}
}
void CAnt_testDlg::local_update(int ant_no, int layer) //局部更新
{
float t, tt;
int last_pos, cur_pos;
//last_pos stands for the node number of the ant chooses in the last move
//and it will be 0 for the first move of each dimension of variable
//if(layer==0)
if(layer%8==0)
last_pos=0;
else
last_pos = ant[ant_no][layer-1];
cur_pos = ant[ant_no][layer];
t = tau[layer][last_pos][cur_pos];
//tt = rho * t;
tt=(1-rho)*t + rho*tau0;
//if(tt>tau_max)
// tt=tau_max;
//else if(tt<tau_min)
// tt=tau_min;
tau[layer][last_pos][cur_pos]=tt;
tau[layer][last_pos][10] += (tt-t);
}
void CAnt_testDlg::get_best_ant() //尋找最優(yōu)螞蟻
{
int i;
ibfit=fit[0];
ibant_no=0;
for (i=1; i<num_ants; i++)
{
if (fit[i]<ibfit)
{
ibant_no=i;
ibfit=fit[i];
}
}
if(ibfit<gbfit)
{
for (i=0; i<num_layers; i++)
gbant[i]=ant[ibant_no][i];
gbfit=ibfit;
curbest[cur_iter]=gbfit;
}
else
{
curbest[cur_iter]=gbfit;
}
}
void CAnt_testDlg::global_update() //全局更新
{
float t, tt;
int i;
int last_pos, cur_pos;
for (i=0; i<num_layers; i++)
{
//last_pos stands for the node number of the ant chooses in the last move
//and it will be 0 for the first move of each dimension of variable
if(i%8==0)
//if(i==0)
last_pos=0;
cur_pos=gbant[i];
t = tau[i][last_pos][cur_pos];
//tt = alpha * t + 1.0/gbfit;
tt=(1-alpha)*t + alpha/gbfit;
tau[i][last_pos][cur_pos]=tt;
//if(tt>tau_max)
// tt=tau_max;
//else if(tt<tau_min)
// tt=tau_min;
tau[i][last_pos][10] += (tt-t);
last_pos=cur_pos;
}
}
void CAnt_testDlg::decode()//解碼
{
int i, j, k;
for (i=0; i<num_ants; i++)
{
fit[i]=0;
for (j=0; j<dimension; j++)
{
x[i][j]=0;
for (k=0; k<layers_per_dimension; k++)
{
//x[i][j]+=ant[i][j*8+k]*pow(10,-k-1);
x[i][j]+=ant[i][j*layers_per_dimension+k]*pow(10,-k-1);
}
//x[i][j]=x[i][j]*4.096-2.048;
}
}
}
void CAnt_testDlg::evaluate()//評估
{
int i, j;
for (i=0; i<num_ants; i++)
{
for(j=0;j<dimension;j++)
fit[i]+=100*x[i][j]*x[i][j];
//for(j=0;j<dimension-1;j++)
//fit[i]+=100*(x[i][j]*x[i][j]-x[i][j+1])*(x[i][j]*x[i][j]-x[i][j+1])+(1-x[i][j])*(1-x[i][j]);
}
}
void CAnt_testDlg::OnCancelMode()
{
CDialog::OnCancelMode();
// TODO: Add your message handler code here
}
void CAnt_testDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent==1)
{
int cur_layer, cur_ant;
cur_iter++;
for (cur_layer=0; cur_layer<num_layers; cur_layer++)
{
for (cur_ant=0; cur_ant<num_ants; cur_ant++)
{
ant_move ( cur_ant, cur_layer );
local_update ( cur_ant, cur_layer );
}
}
decode();
evaluate();
get_best_ant();
global_update();
double sum=0;
for (int i=0; i<num_ants; i++)
{
sum+=fit[i];
}
aver1[cur_iter]=sum/ double (num_ants);
m_edit12=cur_iter;
m_edit10=curbest[cur_iter];
UpdateData(false);
while(cur_iter>=num_iters)
{
cur_iter=0;
KillTimer(1);
}
}
// TODO: Add your message handler code here and/or call default
CDialog::OnTimer(nIDEvent);
}
void CAnt_testDlg::OnShow()
{
// TODO: Add your control notification handler code here
m_edit13=curbest[cur_iter];
UpdateData(false);
int i;
int lMaxCount = 0;
CPaintDC dc(this);
CWnd* pWnd = GetDlgItem(IDC_EDIT1);
CDC* pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
int LeftTop_x=70;
int LeftTop_y=30;
int RightButtom_x=510;
int RightButtom_y=530;
int SegCount=10;
int DataLength=m_edit3;
double lMaxCount1=aver1[1];
double lMaxCount2=curbest[1];
double lMinCount1=aver1[1];
double lMinCount2=curbest[1];
for ( i=1; i<=DataLength; i++)
{
if (aver1[i] > lMaxCount1)
{
lMaxCount1 = aver1[i];
}
}
for (i=1; i<=DataLength; i++)
{
if (aver1[i] < lMinCount1)
{
lMinCount1 = aver1[i];
}
}
for (i=0; i<DataLength; i++)
{
if (curbest[i] > lMaxCount2)
{
lMaxCount2 = curbest[i];
}
}
for (i=0; i<DataLength; i++)
{
if (curbest[i] < lMinCount2)
{
lMinCount2 = curbest[i];
}
}
lMaxCount2=lMaxCount2+0.5;
pDC->MoveTo(LeftTop_x,LeftTop_y);
pDC->LineTo(LeftTop_x,RightButtom_y);
pDC->LineTo(RightButtom_x,RightButtom_y);
pDC->LineTo(RightButtom_x,LeftTop_y);
pDC->LineTo(LeftTop_x,LeftTop_y);
double jiangeX=(double((RightButtom_x-LeftTop_x))/m_edit3);
for(int j=1;j<=m_edit3;j++)
{
if(m_edit3<500)
{
if(j%20==0)
{
pDC->MoveTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y);
pDC->LineTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y+6);
CString str5;
str5.Format("%d",j);
pDC->TextOut(LeftTop_x-4+jiangeX/2+j*jiangeX, RightButtom_y+3,str5);
CPen pen1(PS_DASH,0.5,RGB(0,0,0));
CPen *pOldPen=pDC->SelectObject(&pen1);
if(j<m_edit2)
{
pDC->MoveTo(j*jiangeX+LeftTop_x,LeftTop_y);
pDC->LineTo(j*jiangeX+LeftTop_x,RightButtom_y);
}
pDC->SelectObject(pOldPen);
pen1.DeleteObject();
}
}
else
{
if(j%40==0)
{
pDC->MoveTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y);
pDC->LineTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y+6);
CString str5;
str5.Format("%d",j);
pDC->TextOut(LeftTop_x-4+jiangeX/2+j*jiangeX, RightButtom_y+3,str5);
CPen pen1(PS_DASH,0.5,RGB(0,0,0));
CPen *pOldPen=pDC->SelectObject(&pen1);
if(j<m_edit3)
{
pDC->MoveTo(j*jiangeX+LeftTop_x,LeftTop_y);
pDC->LineTo(j*jiangeX+LeftTop_x,RightButtom_y);
}
pDC->SelectObject(pOldPen);
pen1.DeleteObject();
}
}
}
double jiangeY=(double((RightButtom_y-LeftTop_y))/SegCount);
for (i=0;i<(SegCount+1);i+=1)
{
pDC->MoveTo(LeftTop_x, RightButtom_y-i*jiangeY);
pDC->LineTo(LeftTop_x-4, RightButtom_y-i*jiangeY);
CString str6;
str6.Format("%f",(double)lMaxCount2/SegCount*i);
pDC->TextOut(2, RightButtom_y-5-i*jiangeY,str6);
CPen pen2(PS_DASH,0.5,RGB(0,0,0));
CPen *pOldPen1=pDC->SelectObject(&pen2);
if(i<SegCount && i>=1)
{
pDC->MoveTo(LeftTop_x,RightButtom_y-i*jiangeY);
pDC->LineTo(RightButtom_x,RightButtom_y-i*jiangeY);
}
pDC->SelectObject(pOldPen1);
pen2.DeleteObject();
}
CPen pen3(PS_SOLID,2,RGB(255,0,0));
CPen *pOldPen2=pDC->SelectObject(&pen3);
for (i=1;i<DataLength;i++)
{
pDC->MoveTo(LeftTop_x+jiangeX*(i-1),RightButtom_y-(RightButtom_y-LeftTop_y)*(aver1[i]-lMinCount1)/(lMaxCount1-lMinCount1));
pDC->LineTo(LeftTop_x+jiangeX*i,RightButtom_y-(RightButtom_y-LeftTop_y)*(aver1[i+1]-lMinCount1)/(lMaxCount1-lMinCount1));
}
pDC->SelectObject(pOldPen2);
pen3.DeleteObject();
CPen pen4(PS_SOLID,2,RGB(0,0,255));
CPen *pOldPen3=pDC->SelectObject(&pen4);
for (i=1;i<DataLength;i++)
{
pDC->MoveTo(LeftTop_x+jiangeX*(i-1),RightButtom_y-(RightButtom_y-LeftTop_y)*(curbest[i]-lMinCount2)/(lMaxCount2-lMinCount2));
pDC->LineTo(LeftTop_x+jiangeX*i,RightButtom_y-(RightButtom_y-LeftTop_y)*(curbest[i+1]-lMinCount2)/(lMaxCount2-lMinCount2));
}
pDC->SelectObject(pOldPen3);
pen4.DeleteObject();
pDC->TextOut(RightButtom_x+3,RightButtom_y+5,"代數(shù)");
pDC->TextOut(LeftTop_x-30,LeftTop_y-20,"函數(shù)值");
FILE *fp1;
fp1=fopen("result_aver.txt","w+");
for(i=0;i<num_iters;i++)
{
fprintf(fp1,"%lf\n",aver1[i]);
}
fclose(fp1);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -