问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

基于遗传算法路径优化C++编程

发布网友 发布时间:2022-05-23 22:57

我来回答

1个回答

热心网友 时间:2024-03-09 21:15

[cpp]
bool CAStar::Search(int X, int Y, std::list<POINT> &lResult, double dbGapBreak)
{
if(X < 0 || Y < 0
|| X > m_dwMapWidth || Y > m_dwMapWidth ||
m_dwDestinationX < 0 || m_dwDestinationX < 0 ||
m_dwDestinationX > m_dwMapWidth || m_dwDestinationY > m_dwMapHeight)
{
//_outf("坐标或地图参数错误!");
return false;
}

LPAPOINT p = new APOINT;
p->x = X;
p->y = Y;
p->parent = NULL;
p->dbGap = _p2g(X, Y, m_dwDestinationX, m_dwDestinationY);
m_lOpen.push_front(p);//起始节点加入到开启列表
m_lSafe.push_back(p);//加入到公共容器,任何新分配的节点,都要加入到这里,便于算法执行完后清理

std::list<LPAPOINT>::iterator it;
DWORD dwTime = clock();
while(!m_lOpen.empty())
{
//这里就是反复遍历开启列表选择距离最小的节点
it = GetMingapNode();
if((*it)->dbGap <= dbGapBreak)
break;
p = *it;
GenerateSuccessors(it);
}

if(!m_lOpen.empty())
{
//如果列表不为空,从最后一个节点开始拷贝路径到返回值中
//_outf("最终寻路到:%X, %X", p->x, p->y);
POINT point;
while(p)
{
point.x = p->x;
point.y = p->y;
lResult.push_front(point);
p = p->parent;
}
}

for(it = m_lSafe.begin(); it != m_lSafe.end(); ++it)
{
//清理内存
if(*it != NULL)
{
m_pMap[(*it)->y][(*it)->x] = 1;//会被添加到m_lSafe的节点,一定是最初为1的节点,所以可以在这里恢复地图数据
delete (*it);
*it = NULL;
}
}

m_lSafe.clear();//清空容器

//_outf("耗时:%d 毫秒", clock() - dwTime);

if(m_lOpen.empty())
{
//_outf("寻路失败");
return false;
}

m_lOpen.clear();//清空开启列表
//_outf("寻路成功,节点数:%d", lResult.size());
return true;
}
bool CAStar::Search(int X, int Y, std::list<POINT> &lResult, double dbGapBreak)
{
if(X < 0 || Y < 0
|| X > m_dwMapWidth || Y > m_dwMapWidth ||
m_dwDestinationX < 0 || m_dwDestinationX < 0 ||
m_dwDestinationX > m_dwMapWidth || m_dwDestinationY > m_dwMapHeight)
{
//_outf("坐标或地图参数错误!");
return false;
}

LPAPOINT p = new APOINT;
p->x = X;
p->y = Y;
p->parent = NULL;
p->dbGap = _p2g(X, Y, m_dwDestinationX, m_dwDestinationY);
m_lOpen.push_front(p);//起始节点加入到开启列表
m_lSafe.push_back(p);//加入到公共容器,任何新分配的节点,都要加入到这里,便于算法执行完后清理

std::list<LPAPOINT>::iterator it;
DWORD dwTime = clock();
while(!m_lOpen.empty())
{
//这里就是反复遍历开启列表选择距离最小的节点
it = GetMingapNode();
if((*it)->dbGap <= dbGapBreak)
break;
p = *it;
GenerateSuccessors(it);
}

if(!m_lOpen.empty())
{
//如果列表不为空,从最后一个节点开始拷贝路径到返回值中
//_outf("最终寻路到:%X, %X", p->x, p->y);
POINT point;
while(p)
{
point.x = p->x;
point.y = p->y;
lResult.push_front(point);
p = p->parent;
}
}

for(it = m_lSafe.begin(); it != m_lSafe.end(); ++it)
{
//清理内存
if(*it != NULL)
{
m_pMap[(*it)->y][(*it)->x] = 1;//会被添加到m_lSafe的节点,一定是最初为1的节点,所以可以在这里恢复地图数据
delete (*it);
*it = NULL;
}
}

m_lSafe.clear();//清空容器

//_outf("耗时:%d 毫秒", clock() - dwTime);

if(m_lOpen.empty())
{
//_outf("寻路失败");
return false;
}

m_lOpen.clear();//清空开启列表
//_outf("寻路成功,节点数:%d", lResult.size());
return true;
}

新增的SearchEx源代码如下:
nBeginSift 参数为循环初始值,nEndSift为循环结束值,其实就是一个for循环的起始值与结束值。
这个循环的引用计数,最终会被 乘于 10 来作为距离分段选择路径进行路线优化
nBeginSift 与 nEndSift的间距越大,并不表示最终路径就越好,最终优化出来的路径,还是会和地形有关。
其实最好路径优化算法是按照角度的变化来选择路径优化,但是预计开销会比较大,有了这个优化方式作为基础,你可以自己去写根据角度变化来优化的算法。

[cpp]
bool CAStar::SearchEx(int X, int Y, std::list<POINT> &lResult, double dbGapBreak, int nBeginSift, int nEndSift)
{
DWORD dwTime = clock();
if(!Search(X, Y, lResult, dbGapBreak))
return false;
std::list<POINT>::iterator it = lResult.begin();
std::list<POINT>::iterator it2 = it;

std::list<POINT> l2;
for(int i = nBeginSift; i < nEndSift; i++)
{
it = lResult.begin();
it2 = it;
for(;it != lResult.end(); ++it)
{
if(_p2g(it2->x, it2->y, it->x, it->y) > (double)(i * 10))
{
SetDestinationPos(it->x, it->y);
l2.clear();
if(Search(it2->x, it2->y, l2, 0.0))
{
it = lResult.erase(it2, it);
lResult.insert(it, (l2.begin()), (l2.end()));
}
it2 = it;
}
}
}

_outf("耗时:%d 毫秒", clock() - dwTime);
return true;
}
bool CAStar::SearchEx(int X, int Y, std::list<POINT> &lResult, double dbGapBreak, int nBeginSift, int nEndSift)
{
DWORD dwTime = clock();
if(!Search(X, Y, lResult, dbGapBreak))
return false;
std::list<POINT>::iterator it = lResult.begin();
std::list<POINT>::iterator it2 = it;

std::list<POINT> l2;
for(int i = nBeginSift; i < nEndSift; i++)
{
it = lResult.begin();
it2 = it;
for(;it != lResult.end(); ++it)
{
if(_p2g(it2->x, it2->y, it->x, it->y) > (double)(i * 10))
{
SetDestinationPos(it->x, it->y);
l2.clear();
if(Search(it2->x, it2->y, l2, 0.0))
{
it = lResult.erase(it2, it);
lResult.insert(it, (l2.begin()), (l2.end()));
}
it2 = it;
}
}
}

_outf("耗时:%d 毫秒", clock() - dwTime);
return true;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
imba里能抽到什么好装备 DOTA IMBA神器抽奖抽到几率和大野爆的几率。还有小鸡无限眼的BUG能不能... 《魔兽世界》怀旧服玩具获取方法 求最好的手机杀毒软件 手机杀毒软件哪个好用 2023年最旺女孩名字有草有水296个 我的世界红石电梯怎么制作 怎么用微信申请微信号? 有些网页不能复制,可我想要复制下来,该怎么弄啊? 电脑网址怎么保存电脑怎么收藏网址 怎么办,还是最想去土耳其? 金斯波格KG和KS的区别 金斯波格钢琴怎么样呢? github上有没有lpa算法 在一个游戏里一开始你是个奴隶,主人让你们攻打对方。不过被抓了。第一章还是第二章章节名好像叫瘟疫 字写的如何?很差? 它打出来的字体的心就是一颗心 就是那种画出来的心一样 那是什么字体 求帮忙制作小说封面,要萌系的,关键是字体要好看 字体字体有木有! 有知道图片里的是什么字体吗?求解 谢谢 安卓那种字体软件好?顺便推荐几种字体,萌系和行云流水潇洒的!求 求教这个是什么字体?急,谢谢!!! 求萌系字体~ 求萌字体,只要是萌字体就行~~用来学习写萌字体的 飞机飞过的地方留下一条长长的白烟像云一样,为什么要留下白烟有什么用? 物理问题 请问飞机拉烟为什么与液化有关,即图中最后一题 为什么说明末清初的李贽的思想在一定程度上反映了资本主义萌芽的要求? 李贽简介 李贽的思想主张有哪些 离经叛道的思想家李贽,没被扼杀是有哪些隐情呢? 关于明代思想家李贽 李贽的思想是怎样的? 请写一算法,从顺序表中删除具有最小值的元素并由函数返回被删元素的值。 金斯波格钢琴到底是德国的技术吗?质量到底怎么样? 数据结构与算法分析 C++ 金斯波格KS122怎么样? 国产的金斯波格怎么样?和卡哇伊谁的性价比高? 加那利群岛机场三字代码,加那利群岛有哪些主要国际 金斯波格钢琴怎么样? VB算法:从字母数字组成的字符串中找出所有大写字母,并逆序输出。 越简单越好。 金斯波格钢琴KF126怎么样? 已知一个半径a、电导率σ的圆柱形导体上的电流是I,单位长度的电阻是R,用坡印亭能流定理计算单位长度的损 金斯波格和雅马哈选哪个性价比高 GraphX和Graphscope哪个算法更厉害? 金斯波格钢琴和凯撒堡哪个好? windows SDK API 你们有谁会用代码做菜单快捷键吗?不要(&T)这种的。 要这种的Ctrl+T 金斯波格钢琴的KS122、KU122和哈曼尼的H120J哪个好些? 金斯波格钢琴KH125到底怎么样?价格一般多少 金斯波格KG125和博斯纳 GP126BB哪个更好? 易语言程序淡入淡出 金斯波格钢琴好吗?去琴行看了音色还蛮不错的 珠江和金斯波格哪个好