?? ant.cpp
字號:
// ANT.cpp: implementation of the ANT class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ANT.h"
#include "operation.h"
#include "math.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ANT::ANT()
{
}
ANT::~ANT()
{
}
void ANT::init() //對螞蟻進(jìn)行初始化
{
unsigned int i,j;
PathValue=0; //PathValue 非負(fù)值的時候為表示這個路徑是可行解
WorkDone=-1; //表示任務(wù)沒有完成 即還沒有到達(dá)目標(biāo)點
for(i=0;i<StepLimit;i++)
{ path[i]=0;
TPath[i]=0;
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
area9[i][j].dr=0;
area9[i][j].pr=0;
area9[i][j].state=0;
}
// printf(" one ant init ok!~\n");
}
void ANT::CalculateDr() //計算引力概率
{
unsigned int i,j,x,y;//x ,y 為目標(biāo)解碼后的坐標(biāo) sum+=area9[i][j].dr;
double sum=0,sum2=0,temp=0;
x=Target%mapH;
y=Target/mapH;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
area9[i][j].dr=0; //清空dr
for(i=0;i<3;i++)
for(j=0;j<3;j++) //寫入對應(yīng)位置與目標(biāo)點距離的平方
{
area9[i][j].dr=(x-area9[i][j].x)*(x-area9[i][j].x)
+(y-area9[i][j].y)*(y-area9[i][j].y);
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(area9[i][j].state==1||area9[i][j].state==2) //如果此點不通 則繼續(xù)下一點
continue;
area9[i][j].dr-=area9[1][1].dr;
// area9[1][1].dr 此時放置的為當(dāng)前點和目標(biāo)點之間的距離平方
if(area9[i][j].dr<0)
sum+=(-area9[i][j].dr);
else
sum+=(area9[i][j].dr); //求出改變距離參考點
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)//求出各個點和距離參考點的距離改變量
{
if(area9[i][j].state==1||area9[i][j].state==2) //如果此點不通 則繼續(xù)下一點
continue;
temp=sum-area9[i][j].dr;
if(temp>0.001)
area9[i][j].dr=temp;
sum2+=area9[i][j].dr; //總的 距離改變量
}
if(sum2<0.000001)
PathValue=-1; //沒有可以繼續(xù)選擇的點 使此路徑作廢
}
void ANT::CalculatePr() //計算轉(zhuǎn)移概率
{
unsigned int i,j;
double sum=0,temp[3][3];
if(PathValue>=0) //這只螞蟻沒有被宣判死亡
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
temp[i][j]=pow(area9[i][j].pr,alpha)*pow(area9[i][j].dr,beta);
sum=sum+temp[i][j];
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
area9[i][j].pr=temp[i][j]/sum;
}
//8各鄰域單元處理完畢 可以用賭盤來進(jìn)行路徑選擇
}
void ANT::bet(unsigned int AntNum,unsigned int step, double BetValue )
{
int i,j,num,flag=1;
double sum;
sum=0;
num=0;
// srand( (unsigned)time( NULL ) );//temp,
// printf( " %d\n",time( NULL ) );//
// srand( (unsigned)time( NULL )*step*rand());//加上這句話效果最好 達(dá)到盡可能的隨機(jī)
// temp=rand()/(double)RAND_MAX;
for( i=0;i<3;i++ )
if(flag)
for(j=0;j<3;j++)
{
num++;
sum+=area9[i][j].pr;
if(sum>=BetValue)
{flag=0;break;}
}
num--;
path[step]=area9[num/3][num%3].y*mapH+area9[num/3][num%3].x;//把賭盤得到的點寫入路徑
if(path[step]==Target) //選到目標(biāo)點 標(biāo)記WorkDone
WorkDone=1;
}
unsigned int ANT::AnalyzePath() //計算路徑長度, 計算結(jié)果放到 PathValue 中
{
int i,flag=0;
if(WorkDone==-1)
return 0; //如果為不可行解, 則不對路徑進(jìn)行處理
for(i=0;i<StepLimit;i++)
{
if (Target==path[i])
{
flag=1;
break;
}
else if(1==abs(path[i+1]-path[i])||
mapH==abs(path[i+1]-path[i])||mapV==abs(path[i+1]-path[i]))
PathValue=PathValue+1.0;
else
PathValue=PathValue+1.414;
}
if(!flag)
PathValue=0;
return 1;
}
double ANT::GetPathValue()
{
return PathValue;
}
unsigned int ANT::FindInPath(unsigned int point, int step) //查詢禁忌表
{
int i;
for(i=(step-1);i>=0;i--)
if(point==path[i])
{
return 1;
break;
}
return 0;
}
void ANT::TurnPath()//把路徑顛倒后放置在 TPath中
{
int i,flag;
for(i=0;i<StepLimit;i++)
{
if(path[i]==0)
break;
}
flag=i-1;
for(i=0;flag>=0;i++)
{
TPath[i]=path[flag];
flag--;
}
}
double ANT::DealPath(unsigned int *p1, unsigned int *p2)//p1是起點小 p2是終點大
{
int i;
double Value=0;
for(i=0;p1!=p2;i++)
{
if(*p2==0) break;
if(1==abs(*p1-*(p1+1))||mapH==abs(*p1-*(p1+1))||mapV==abs(*p1-*(p1+1)))
Value+=1.0;
else
Value+=1.414;
p1++;
}
return Value;
}
//DEL void ANT::AREA9::MovePath()
//DEL {
//DEL int i;
//DEL for(i=0;i<StepLimit;i++)
//DEL {
//DEL TPath[i]=path[i];
//DEL path[i]=0;
//DEL }
//DEL }
void ANT::MovePath()
{
int i;
for(i=0;i<StepLimit;i++)
{
TPath[i]=path[i];
path[i]=0;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -