⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ant_testdlg.cpp

📁 蚁群算法的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		//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()  //寻找最优蚂蚁
{
	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,"代数");
	pDC->TextOut(LeftTop_x-30,LeftTop_y-20,"函数值");

	FILE *fp1;
	fp1=fopen("result_aver.txt","w+");
	for(i=0;i<num_iters;i++)
	{
		fprintf(fp1,"%lf\n",aver1[i]);
	}
	fclose(fp1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -