Ⅰ 要寫論文了!有沒有不要編程的演算法!就純粹是函數的。 就是揀貨路徑優化涉及到得演算法!例如蟻群演算法啊
法國人特特熱熱熱飯熱熱
Ⅱ 基於遺傳演算法路徑優化C++編程
[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;
}
Ⅲ 節約里程法,遺傳演算法,神經網路這幾種演算法哪個簡單易懂在路徑優化問題中哪種演算法最簡單易懂
路徑優化的話我認為遺傳演算法最好用,也比較簡單。
Ⅳ 基於遺傳演算法的路徑優化
有木有誠意啊,加你的QQ的驗證問題竟然是你的真名叫什麼……
Ⅳ 路徑優化方法
在配送路線選擇中.主要採取模型化方法進行路線確定。常見的模型有Tabu Search演算法、SOM方法、遺傳演算法、節約里程法等。節約里程法,又稱車輛運行計劃法(VSP—VehiclesSchedIlling Program),適用於實際工作中要求得較優解或最優的近似解。而不一定需要求得最優解的情況。它的基本原理是三角形的一邊之長必定小於另外兩邊之和。當配送中心與用戶里三角形關系時.由配送中心P單獨向兩個用戶A和B往返配貨的車輛運行距離必須大於以配送中心P巡迴向兩用戶發貨的距離。那麼,所計算的結果:2Lpa 2Lpb-(Lp^Lpb Lab)=Lpa Lpb—hb為巡迴發貨比往返發貨的節約里程。
Ⅵ 蟻群演算法相對其他配送路徑優化演算法有什麼優點
可能知識有限,實在沒有看出什麼相同點。對於粒子群而言,每個粒子以及系統都存在一定的規律,具體一點說就是薛定諤方程的范疇下。而對於蟻群來說,我想,應該涉及到生物學的范疇吧,涉及到蟻群的生活方式,交流方式,或許還要涉及到博弈論、統籌學方面的知識,這方面完全不懂了。
Ⅶ 有什麼演算法可以同時解決車輛路徑優化的VRPTW和SDVRP,數學模型怎麼達到
智能優化演算法,比如粒子群演算法、蟻群演算法、禁忌搜索演算法。優點是對問題和模型要求低,搜索速度快;缺點是容易陷入局部最優解。
Ⅷ 刪除路徑演算法與剪枝演算法一樣嗎
路徑如果指的是隱式圖上的路徑的話,它們是一樣的.
如果指的是狹義的圖上的路徑的話,刪除路徑演算法只是剪枝演算法在圖論題目上的應用.
剪枝演算法是在窮舉的基礎上進行優化的演算法.
它的傳統思路便是可行性剪枝和最優性剪枝.它們都是通過判斷一些方向不可能有解或是不可能是最優解來減少枚舉的范圍.如果你將題目看做一張隱式圖,那麼這樣的操作確實可以叫做刪除路徑演算法.
但是如果所說的刪除路徑演算法說得只是標準的圖上的路徑的話其實是不完全等同於剪枝演算法的.可以說它包含於剪枝演算法.
一般的演算法需要刪除路徑的話,也是考慮到這條路徑的不可行或是不可能為最優才可以刪除路徑達到優化復雜度的作用的.
Ⅸ 什麼是 路徑重連 優化 演算法 path relinking
想在Matlab里畫三維曲面圖,數據為12*12的矩陣,每個數據都是類似8.4307e 函數中所使用的演算法都是科研和工程計算中的最新研究成果,而前經過了各種優化