?? mainfrm.cpp
字號(hào):
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "AntColony.h"
#include "SetParDialog.h"
#include "MainFrm.h"
/////////********////////////////////
#include "stdafx.h"
#include "operation.h"
#include "ANT.h"
#include "MAP.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
/////////********////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////////////////////////////////////////////
///////////////////@@@@@@@@@數(shù)據(jù)采集程序段////////////////////////////////
struct DATA{
unsigned int path[AntNumber][StepLimit];
double Value[AntNumber];
} data[500];
/////////////////////////////////////////////////////////////////////////////
double BestValue=1000,Q=1000;//Q是信息素總量
int GenerLimit=50; //蟻群繁殖代數(shù)極限
unsigned int StartPoint=340,TarGetG=1300;
//unsigned int StartPoint=41,TarGetG=1558;
unsigned int BestTrail[StepLimit];//,BestAntGern=0;
MAP map;//生成并初始化地圖對(duì)象和蟻群對(duì)象
ANT ant[AntNumber],ant2[AntNumber2];
SetParDialog SetPD;
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
void MapIn(void)
{ FILE *fp1;
int i,j;
fp1=fopen("map.dat", "r");
for(i=0;i<mapH;i++)
for(j=0;j<mapV;j++)
fscanf(fp1,"%5d",&map.point[i][j].PointType);
fclose(fp1) ;
map.point[0][0].PointType=1;//第一點(diǎn)一定要為不可通過的點(diǎn)
}
void PathOut(void)
{ FILE *fp2;
int i,j;
fp2=fopen("path.dat", "w");
for(i=0;i<AntNumber;i++)
{for(j=0;j<StepLimit;j++)
{
fprintf(fp2, "%5d",ant[i].path[j]);
fprintf(fp2, " ");
}
fprintf(fp2,"\n");
}
fclose(fp2) ;
}
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_COMMAND(ID_SETPAR, OnSetpar)
ON_COMMAND(ID_STARTSIMU, OnStartsimu)
ON_COMMAND(ID_SHOWSHANGE, OnShowshange)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
CMainFrame::~CMainFrame()
{
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnSetpar()
{
// TODO: Add your command handler code here
static int flag=0;
if(!flag)
{
SetPD.m_gener=500;
SetPD.m_beta=2.3;
SetPD.m_alpha=2.2;
}
flag++;
SetPD.DoModal();
}
void CMainFrame::OnStartsimu() //開始仿真
{
int i,j,step;
int BestAntNum;
int mm,nn;
double BetValue;
// MessageBox("start sim");
GenerLimit=SetPD.m_gener;
map.Target=TarGetG;/////////////******************??????????////////////
for(j=0;j<AntNumber;j++)//對(duì)螞蟻和地圖初始化其變量 Target
{
ant[j].Target=TarGetG;////////////******************??????????////////////
ant2[j].Target=StartPoint;////////////******************??????????////////////
}
MapIn();
for(i=0;i<GenerLimit;i++)
{
for(j=0;j<AntNumber;j++)//生成新一代螞蟻 對(duì)螞蟻進(jìn)行初始化
{
ant[j].init();
ant[j].beta=SetPD.m_beta; //引力系數(shù)加強(qiáng)為1.0
ant[j].alpha=SetPD.m_alpha; //XXX
ant2[j].init();
ant2[j].beta=SetPD.m_beta; //引力系數(shù)加強(qiáng)為1.0
ant2[j].alpha=SetPD.m_alpha; //XXX
}
for(j=0;j<AntNumber;j++)//init every ant
{
ant[j].path[0]=StartPoint; //init ant j with start point
ant2[j].path[0]=TarGetG; //init ant j with start point
}
for(step=1;step<StepLimit;step++)
{
srand( (unsigned)time( NULL )*(step+1)*rand());
for(j=0;j<AntNumber;j++)
{
if(ant[j].WorkDone==1||ant[j].PathValue==-1)
// continue; //如果某螞蟻已經(jīng)達(dá)到目標(biāo)點(diǎn) 或者作廢了 則轉(zhuǎn)為處理下一只
goto pp;
CreatArea9(ant[j].path[step-1],j,step);
//生成鄰域 9點(diǎn) 放到鄰域數(shù)組里 以坐標(biāo)點(diǎn)的形式存儲(chǔ)
ant[j].CalculateDr();
//計(jì)算每個(gè)點(diǎn)的引力概率 放到鄰域數(shù)組
ant[j].CalculatePr();
//計(jì)算每個(gè)點(diǎn)的轉(zhuǎn)移概率 放到鄰域數(shù)組
///////////////////////////////////////////////
BetValue=rand()/(double)RAND_MAX;
//printf("BetValue= %f\n",BetValue);
///////////////////////////////////////////////
if(ant[j].PathValue!=-1)
ant[j].bet(j,step,BetValue);
//根據(jù)賭盤算法選取轉(zhuǎn)移點(diǎn) 放到path[step]中
pp: if(ant2[j].WorkDone==1||ant2[j].PathValue==-1)
continue; //如果某螞蟻已經(jīng)達(dá)到目標(biāo)點(diǎn) 或者作廢了 則轉(zhuǎn)為處理下一只
CreatArea9_ant2(ant2[j].path[step-1],j,step);
//生成鄰域 9點(diǎn) 放到鄰域數(shù)組里 以坐標(biāo)點(diǎn)的形式存儲(chǔ)
ant2[j].CalculateDr();
//計(jì)算每個(gè)點(diǎn)的引力概率 放到鄰域數(shù)組
ant2[j].CalculatePr();
//計(jì)算每個(gè)點(diǎn)的轉(zhuǎn)移概率 放到鄰域數(shù)組
///////////////////////////////////////////////
BetValue=rand()/(double)RAND_MAX;
//printf("BetValue= %f\n",BetValue);
///////////////////////////////////////////////
if(ant2[j].PathValue!=-1)
ant2[j].bet(j,step,BetValue);
//根據(jù)賭盤算法選取轉(zhuǎn)移點(diǎn) 放到path[step]中
}
}
map.UpdateMap(); // 消散信息素;
for(j=0;j<AntNumber;j++)
{
ant2[j].TurnPath();
}
///**********************************************************///
//在此對(duì)所得兩個(gè)種群的螞蟻進(jìn)行全面相交,把優(yōu)化的結(jié)果寫到第一種群中
// Cross();
for(nn=0;nn<AntNumber;nn++)
for(mm=0;mm<StepLimit;mm++)
data[i].path[nn][mm]=ant[nn].path[mm];//把數(shù)據(jù)寫入data中
///**********************************************************///
for(j=0;j<AntNumber;j++)
{
ant[j].AnalyzePath();//對(duì)路徑進(jìn)行處理
}
BestAntNum=GetBestAnt();//得到各代中具有最優(yōu)值的螞蟻號(hào)碼
// PathOut();
if(BestValue>ant[BestAntNum].PathValue&&ant[BestAntNum].PathValue>1)
{
for(j=0;j<StepLimit;j++)
BestTrail[j]=ant[BestAntNum].path[j];
BestValue=ant[BestAntNum].PathValue;
}
for(j=0;j<AntNumber;j++)
{
if(ant[j].PathValue>0) //只更新可行解
map.UpdateInfo(Q/ant[j].PathValue, ant[j].path);
}//加入新一代的信息素
}
////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
DrawPath(BestTrail);
// MessageBox("end sim");
// for(i=0;i<20;i++)
// {
// DrawPath(ant[i].path);
// MessageBox("i");
// }
for(mm=0;mm<GenerLimit;mm++)
for(nn=0;nn<AntNumber;nn++)
AnalyzePathG(mm,nn);
//////////處理以后需要輸出//////////
DataOut();
}
int CMainFrame::GetBestAnt()//返回具有最佳路徑的螞蟻編號(hào)
{
int i,BestAnt=0;
double TValue[AntNumber];
for(i=0;i<AntNumber;i++)
if(ant[i].PathValue>1)
{
TValue[i]=100000/ant[i].PathValue;
}
else
TValue[i]=0;
for(i=0;i<AntNumber;i++)
if(TValue[i]>TValue[BestAnt])//
BestAnt=i;
return BestAnt;
}
void CMainFrame::CreatArea9(unsigned int core, unsigned int AntNum, int step2)
{
unsigned int i,j,point;
ant[AntNum].area9[1][1].x=core%mapH;
ant[AntNum].area9[1][1].y=core/mapH;//設(shè)置中心點(diǎn)-核-現(xiàn)在時(shí)刻所在點(diǎn)
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
ant[AntNum].area9[i][j].x=ant[AntNum].area9[1][1].x-1+j;
ant[AntNum].area9[i][j].y=ant[AntNum].area9[1][1].y-1+i;
//填充其他八點(diǎn) 用坐標(biāo)點(diǎn)的方式
if(ant[AntNum].area9[i][j].x>=mapH||ant[AntNum].area9[i][j].y>=mapV
||ant[AntNum].area9[i][j].x<0||ant[AntNum].area9[i][j].y<0)
{ ant[AntNum].area9[i][j].state=1;
ant[AntNum].area9[i][j].pr=0;
continue; }
//查看各點(diǎn)是否超過地圖范圍
if(map.point[ant[AntNum].area9[i][j].y][ant[AntNum].area9[i][j].x].PointType)
{ ant[AntNum].area9[i][j].state=1;
ant[AntNum].area9[i][j].pr=0;
continue;
}
//查看各點(diǎn)的狀態(tài)
point=ant[AntNum].area9[i][j].y*mapH+ant[AntNum].area9[i][j].x;// 對(duì)點(diǎn)編碼
if(ant[AntNum].FindInPath(point,step2)) //
{ant[AntNum].area9[i][j].state=2;
ant[AntNum].area9[i][j].pr=0;
continue;}
//還要查詢禁忌表 把已經(jīng)走過的點(diǎn)標(biāo)記為不可通過 ×××
ant[AntNum].area9[i][j].state=0;
ant[AntNum].area9[i][j].pr=map.point[ant[AntNum].area9[i][j].y][ant[AntNum].area9[i][j].x].tau;
//初始信息素 pr 單元
}
if(ant[AntNum].area9[0][1].state==1)
{
ant[AntNum].area9[0][0].state=1;
ant[AntNum].area9[0][0].pr=0;
ant[AntNum].area9[0][2].state=1;
ant[AntNum].area9[0][2].pr=0;
}
if(ant[AntNum].area9[1][0].state==1)
{
ant[AntNum].area9[0][0].state=1;
ant[AntNum].area9[0][0].pr=0;
ant[AntNum].area9[2][0].state=1;
ant[AntNum].area9[2][0].pr=0;
}
if(ant[AntNum].area9[2][1].state==1)
{
ant[AntNum].area9[2][2].state=1;
ant[AntNum].area9[2][2].pr=0;
ant[AntNum].area9[2][0].state=1;
ant[AntNum].area9[2][0].pr=0;
}
if(ant[AntNum].area9[1][2].state==1)
{
ant[AntNum].area9[2][2].state=1;
ant[AntNum].area9[2][2].pr=0;
ant[AntNum].area9[0][2].state=1;
ant[AntNum].area9[0][2].pr=0;
}
}
void CMainFrame::DrawPath(unsigned int *p)
{
int i;
unsigned int x,y,gys,gys2;
gys=400/mapH;
gys2=200/mapH;
CClientDC dc(this);
CPen newpen;
CPen *oldpen;
newpen.CreatePen(PS_SOLID,3,RGB(0,0,0));
oldpen=dc.SelectObject(&newpen);
for(i=0;i<StepLimit;i++)
{
if(*p==ant[0].Target)
break;
x=(*p%mapH)*gys+gys2;
y=(*p/mapV)*gys+gys2;
dc.MoveTo(x,y);
if(*(p+1)==0)
if(*(p+2)==0||i==StepLimit-1)
break;
p++;
x=(*p%mapH)*gys+gys2;
y=(*p/mapV)*gys+gys2;
dc.LineTo(x,y);
}
dc.SelectObject(oldpen);
newpen.DeleteObject();
}
void CMainFrame::OnShowshange()
{
// TODO: Add your command handler code here
int x,y,i;
// StartPoint=41,TarGetG=1598;
///////////////////////////////////////////////////////////////
int x0,y0,x1,y1,a,b,gys;
CClientDC dc(this);
CBrush newbrush;
CBrush *oldbrush;
a=StartPoint%mapH;
b=StartPoint/mapH;
newbrush.CreateSolidBrush(RGB(0,0,255));
gys=400/mapH;
x0=gys*a;
y0=gys*b;
x1=gys*a+gys;
y1=gys*b+gys;
oldbrush=dc.SelectObject(&newbrush);
dc.Rectangle(x0,y0,x1,y1);
dc.SelectObject(oldbrush);
newbrush.DeleteObject();
a=TarGetG%mapH;
b=TarGetG/mapH;
newbrush.CreateSolidBrush(RGB(0,255,0));
x0=gys*a;
y0=gys*b;
x1=gys*a+gys;
y1=gys*b+gys;
oldbrush=dc.SelectObject(&newbrush);
dc.Rectangle(x0,y0,x1,y1);
dc.SelectObject(oldbrush);
newbrush.DeleteObject();
/////////////////////////////////////////////////////////////////
// CClientDC dc(this);
CPen newpen;
CPen *oldpen;
newpen.CreatePen(PS_DOT,1,RGB(0,0,0));
oldpen=dc.SelectObject(&newpen);
x=400/mapH;
y=400/mapH;
for(i=0;i<mapH;i++)
{
dc.MoveTo(x*i,0);
dc.LineTo(x*i,400);
}
for(i=0;i<mapH;i++)
{
dc.MoveTo(0,i*y);
dc.LineTo(400,i*y);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -