資源簡介
基于蟻群算法的機器人路徑規劃C語言代碼
代碼片段和文件信息
#include?“StdAfx.h“
#include?“.\ant.h“
CAnt::CAnt(void)
{
m_pMapAry=Create2DArray(N_MAX_MAP_WIDTHN_MAX_MAP_HEIGHT);
}
CAnt::~CAnt(void)
{
Free2DArray(m_pMapAryN_MAX_MAP_WIDTH);
}
void?CAnt::Init()
{
//清空螞蟻走的路徑
m_tabuAry.RemoveAll();?
//設置螞蟻走過的地方為地圖初始狀態
for?(int?i=0;i {
for?(int?j=0;j {
m_pMapAry[i][j]=g_pMapAry[i][j];
}
}
//加入起始點,并設置起始點為去過了
m_ptCurrent=g_ptStart;
m_tabuAry.Add(m_ptCurrent);?
m_pMapAry[m_ptCurrent.x][m_ptCurrent.y]=1;?
//設置完成搜索標志為false
m_blComplete=false;
?//螞蟻走過的路徑長度設置為0
m_dbPathLength=0.0;
}
//檢查從(x0y0)到(xy)是否允許
bool?CAnt::CheckXY(int?x0int?y0int?xint?y)
{
//越界
if?((x<0)?||?(x>=N_MAP_WIDTH))
{
return?false;
}
//越界
if?((y<0)?||?(y>=N_MAP_HEIGHT))
{
return?false;
}
//該位置是障礙或者去過了
if?((m_pMapAry[x][y]?==?BARRIER)?||?(m_pMapAry[x][y]?==?MOVED))
{
return?false;
}
//如果沒有越界且位置為空,要檢查如果是斜穿,斜穿點的兩邊是否有障礙
if?((x-x0?==?-1)?&&?(y-y0?==-1))?//新位置在左上角
{
if?((m_pMapAry[x+1][y]?==?BARRIER)?&&?(m_pMapAry[x][y+1]?==?BARRIER))
{
return?false;
}
}
if?((x-x0?==?1)?&&?(y-y0?==-1))?//新位置在右上角
{
if?((m_pMapAry[x-1][y]?==?BARRIER)?&&?(m_pMapAry[x][y+1]?==?BARRIER))
{
return?false;
}
}
if?((x-x0?==?-1)?&&?(y-y0?==1))?//新位置在左下角
{
if?((m_pMapAry[x][y-1]?==?BARRIER)?&&?(m_pMapAry[x+1][y]?==?BARRIER))
{
return?false;
}
}
if?((x-x0?==?1)?&&?(y-y0?==1))?//新位置在右下角
{
if?((m_pMapAry[x-1][y]?==?BARRIER)?&&?(m_pMapAry[x][y-1]?==?BARRIER))
{
return?false;
}
}
//上面都不返回,則可以到達
return?true;
}
//選擇下一個點
//返回值?為點的坐標位置
CPoint?CAnt::ChooseNextCity()
{
CPoint?pt(-1-1);??//返回結果,先暫時把其設置為-1-1
//==============================================================================
//計算當前點和周圍8個點的信息素總和
//為了用循環進行處理,編碼方便,當前所在點也計算一下
double?dbTotal=0.0;
double?prob[9]={-1-1-1-1-1-1-1-1-1};?//?保存城市被選中的概率
int?nIndex=-1;
int?nCount=0;?//周圍有幾個點可以去
for?(int?x=m_ptCurrent.x-1;x<=m_ptCurrent.x+1;x++)
{
for?(int?y=m_ptCurrent.y-1;y<=m_ptCurrent.y+1;y++)
{
nIndex++;
if?(CheckXY(m_ptCurrent.xm_ptCurrent.yxy)?==?true)
{
prob[nIndex]=g_pMapTrail[x][y]/(g_pMapLen[x][y]*g_pMapLen[x][y]);
dbTotal=dbTotal+prob[nIndex];
nCount++;
}
}
}
//周圍沒有點可以去,則直接返回
if?(nCount?==0)
{
return?pt;
}
////==============================================================================
//對周圍點進行輪盤選擇
nIndex=-1;?//記錄周圍那個點被選擇
int?nIndexFirst=-1;?//記錄第一個可以去的點
double?dbTemp=rnd(0.0dbTotal);?//取一個隨機數
for?(int?i=0;i<9;i++)
{
if?(prob[i]>=0)?//點可以去
{
dbTemp=dbTemp-prob[i];?//這個操作相當于轉動輪盤
if?(dbTemp?<=?0.0)?//輪盤停止轉動,記下點位置,直接跳出循環
{
nIndex=i;
break;
}
//保存第一個可以去的點
//如果沒有點選中就用這個點作為結果返回
if?(nIndexFirst?==?-1)?
{
nIndexFirst=i;
}
}
}
//如果經過上面操作沒有點被選中
//就把第一個可去的點作為結果返回
if?(nIndex?==?-1)
{
nInd
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????880??2011-06-16?21:05??Robot.sln
????..A..H.?????70144??2011-06-23?18:47??Robot.suo
?????文件??????11127??2011-06-23?14:47??Robot\Ant.cpp
?????文件????????949??2011-06-20?15:29??Robot\Ant.h
?????文件???????1516??2011-06-23?14:30??Robot\Common.cpp
?????文件???????2441??2011-06-23?14:36??Robot\Common.h
?????文件???????1426??2011-06-21?19:44??Robot\DlgNewMap.cpp
?????文件????????615??2011-06-21?19:30??Robot\DlgNewMap.h
?????文件??????13416??2011-06-23?18:45??Robot\MapView.cpp
?????文件???????1136??2011-06-23?18:39??Robot\MapView.h
?????文件???????7955??2011-01-19?20:07??Robot\MyButton.cpp
?????文件???????1250??2011-01-12?13:30??Robot\MyButton.h
?????文件???????2855??2011-06-16?21:05??Robot\ReadMe.txt
?????文件???????7734??2011-06-21?19:33??Robot\res\btnbmp.bmp
?????文件???????3126??2011-06-21?13:12??Robot\res\rbt.bmp
?????文件???????5430??2011-06-21?18:24??Robot\res\robot.ico
?????文件????????361??2011-06-16?21:05??Robot\res\Robot.rc2
?????文件???????1592??2011-06-23?16:26??Robot\resource.h
?????文件???????1636??2011-06-16?21:05??Robot\Robot.cpp
?????文件????????435??2011-06-16?21:05??Robot\Robot.h
?????文件???????6561??2011-06-23?16:28??Robot\Robot.rc
?????文件???????6628??2011-06-21?19:03??Robot\Robot.vcproj
?????文件??????13427??2011-06-23?16:28??Robot\RobotDlg.cpp
?????文件???????1623??2011-06-23?16:26??Robot\RobotDlg.h
?????文件????????136??2011-06-16?21:05??Robot\stdafx.cpp
?????文件???????2508??2011-06-16?21:13??Robot\stdafx.h
?????文件???????4597??2011-06-23?14:48??Robot\Tsp.cpp
?????文件????????364??2011-06-23?13:41??Robot\Tsp.h
?????目錄??????????0??2011-06-21?19:03??Robot\res
?????目錄??????????0??2011-06-23?18:47??Robot
............此處省略3個文件信息
- 上一篇:VC++深入詳解 pdf
- 下一篇:擴展卡爾曼濾波代碼和數據
評論
共有 條評論