導航:首頁 > 源碼編譯 > 單行最優路徑演算法

單行最優路徑演算法

發布時間:2022-02-28 22:25:19

① 求最優路徑的演算法

以下是C寫的廣度優先的最短路徑窮舉法,希望對你有所幫助.
#include <iostream>
#include <string>
#include <vector>
#include <map>

using namespace std;

#define SIGHTS 4 //自定義景點個數為4,以後可以擴充

class Sight //景點類信息,以後可以擴充
{
public:
Sight(string name, string sd) { sname = name; sight_detial = sd; }
string Sight_Name() { return sname; }
string Sight_detial() { return sight_detial; }
protected:
string sname; //景點名稱
string sight_detial; //景點備注
};

struct SI
{
string sname; //景點名稱
int index; //景點編碼
};

SI SightInfo[SIGHTS];

map<int, string>results; //距離與路徑的映射結構體,可以動態擴充
vector<Sight> sights; //VECTOR向量保存景點信息,目前的作用只是保存
//但是其強大的功能完全可以應付以後的功能擴充

int MinDistanct = 50000; //假定最小距離為一個很大的值
string Sight_Names = "楓林園蛟橋園青山園麥廬園 "; //目標字元串
string Best_Path; //保存最佳路徑的STRING字元串

int DISTANCE[4][4] = { //查找表,用於儲存接點之間距離的信息
0, 1500, 2500, 2400,
1500, 0, 800, 0,
2500, 800, 0, 200,
2400, 0, 200, 0
};

bool connect[4][4] = { //查找表,用於儲存接點之間連通的信息
0, 1, 1, 1,
1, 0, 1, 0,
1, 1, 0, 1,
1, 0, 1, 0
};

void InitSights()
{ //初始化景點的各類信息
SightInfo[0].index=0;
SightInfo[0].sname = "麥廬園";
SightInfo[1].index=1;
SightInfo[1].sname = "楓林園";
SightInfo[2].index=2;
SightInfo[2].sname = "蛟橋園";
SightInfo[3].index=3;
SightInfo[3].sname = "青山園";

Sight s1("楓林園",
"楓林園以計算機系的理工科學生為主,是江西財經大學的唯一一個計算機學院");
sights.push_back(s1);
Sight s2("蛟橋園",
"蛟橋園是江西財經大學的會計、貿易等財務教學為主的教學樓群,為本部");
sights.push_back(s2);
Sight s3("青山園",
"青山園是江西財經大學的會計、貿易等財務教學為主的學生的宿舍群");
sights.push_back(s3);
Sight s4("麥廬園",
"麥廬園是江西財經大學的外語、藝術等人文科學為主的學習園地");
sights.push_back(s4);
}

void Find_Ways(string start, string end, int DIST, string path, int depth)
{ //遞歸調用,逐層尋找可連通的路徑,並以該路徑繼續重復循環查找,根據分析可以
//知道,所有最優解即最短路徑所經過的接點數目必定小於N,於是採用廣度優先遍歷,
//設置count為循環深度,當count大於SIGHTS時退出循環
int count = 1;
int i,j;
int start1 = 0,end1 = 0;
int distanct = 0, storeDist = 0;
string temp, target, pathway, storePath; //臨時儲存體,用於恢復遞歸調用後會
//改變的數據,以便之後無差別使用

count += depth;

if(count > SIGHTS)
return;

distanct += DIST; //距離累加

if(path=="") //第一次時,pathway初始化為第一個接點名稱
{
pathway = start;
pathway += "=>";
}
if(path!="")
pathway = path;

storeDist = distanct; //填充臨時儲存值
storePath = pathway;

for(i = 0; i < SIGHTS; ++i) //通過遍歷,查找景點名稱對應的編號
{
if(start == SightInfo[i].sname)
start1 = SightInfo[i].index;
if(end == SightInfo[i].sname)
end1 = SightInfo[i].index;
}

for(i = 0; i < SIGHTS; i++) //演算法核心步驟
{
if(connect[start1][i] != 0)
{
if(i==end1) //如果找到了一條路徑,則保存之
{
distanct += DISTANCE[start1][end1];
for(j = 0; j < SIGHTS; ++j)
{
if(end1==SightInfo[j].index)
target = SightInfo[j].sname;
}
pathway += target;
results.insert(make_pair(distanct, pathway)); //保存結果路徑信息

distanct = storeDist; //恢復數據供下次使用
pathway = storePath;
}
else //分支路徑
{
for(j = 0; j < SIGHTS; ++j)
{
if(i==SightInfo[j].index)
temp = SightInfo[j].sname;
}
pathway += temp;
pathway += "=>";
distanct += DISTANCE[start1][i];

Find_Ways(temp, end, distanct, pathway, count); //以該連通的分支
//路徑繼續遞歸調用,查找子層路徑信息。

distanct = storeDist; //恢復數據
pathway = storePath;
}
}
}
}

void Find_Best_Way()
{ //該函數建立在上述函數執行完畢之後,在map映射結構中通過對比每條路徑的長度,來
//選擇最優解
map<int, string>::iterator itor = results.begin();

while(itor!=results.end()) //尋找最小值
{
// cout<<"distanct = "<<itor->first<<endl;
if(itor->first < MinDistanct)
MinDistanct = itor->first;
itor++;
}

itor = results.begin();

while(itor!=results.end()) //尋找最小值所對應的整個路徑字元串
{
if(itor->first == MinDistanct)
Best_Path = itor->second;
itor++;
}
}

int main(int argc, char *argv[])
{
int choice;
size_t t1=0,t2=0;
string source, termination;

InitSights();

do{
cout<<"////////////////////////////////////////////////////////\n"
<<"**** 請輸入您所需要的服務號碼: ********\n"
<<"**** 1.楓林園介紹 ********\n"
<<"**** 2.蛟橋園介紹 ********\n"
<<"**** 3.青山園介紹 ********\n"
<<"**** 4.麥廬園介紹 ********\n"
<<"**** 5.查詢地圖路徑 ********\n"
<<"**** 6.退出查詢系統 ********\n"
<<"////////////////////////////////////////////////////////\n"
<<endl;

cin>>choice;

switch(choice)
{
case 1:
cout<<sights[0].Sight_Name()<<endl
<<sights[0].Sight_detial()<<endl;
break;

case 2:
cout<<sights[1].Sight_Name()<<endl
<<sights[1].Sight_detial()<<endl;
break;

case 3:
cout<<sights[2].Sight_Name()<<endl
<<sights[2].Sight_detial()<<endl;
break;

case 4:
cout<<sights[3].Sight_Name()<<endl
<<sights[3].Sight_detial()<<endl;
break;

case 5:
flag1:
cout<<"請輸入路徑的起點"<<endl;
cin>>source;
cout<<"請輸入路徑的終點"<<endl;
cin>>termination;

if((t1=Sight_Names.find(source,t1))==string::npos || (t2=Sight_Names.find(termination,t2))==string::npos)
{ //檢查輸入的數據是否含有非法字元
cerr<<"輸入的路徑結點不存在,請重新輸入:"<<endl;
goto flag1;
}
Find_Ways(source, termination, 0, "",0); //尋找所有可能解
Find_Best_Way(); //在所有可能解中找到最優解

cout<<"最佳路徑是:"<< Best_Path <<endl
<<"最小路程為(米):"<< MinDistanct<<endl;

t1 = 0; //恢復字元串下標,以支持下次查詢
t2 = 0;
break;

case 6:
break;

default:
cerr<<"您的選擇超出了范圍,請重新輸入:"<<endl;
break;
}
}while(choice!=6);

system("pause");
return 0;
}

② 單源最短路徑可以用貪心演算法得到最優解嗎

可以。對於權值大於等於零的有相或無相圖,可以使用基於貪心思想的Dijkstra演算法求解單源最短路徑問題。

③ 路徑規劃。求解題思路!!!通過給出點和路徑,計算最優路徑。如何避免環路

public class Edge { private String startNode; private String endNode; public String getStartNode() { return startNode; } public void setStartNode(String startNode) { this.startNode = startNode; } public String getEndNode() { return endNode; } public void setEndNode(String endNode) {
this.endNode = endNode; } }
public class Node { private String name; private Integer weight; private List<Edge> edges = new ArrayList<Edge>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getWeight() { return weight; } public void setWeight(Integer weight) { this.weight = weight; } public List<Edge> getEdges() { return edges; } public void addEdges(String endNode) { Edge edge = new Edge(); edge.setStartNode(this.getName()); edge.setEndNode(endNode); this.edges.add(edge); } }
public class Graph { private Map<String,Node> nodeMap = new HashMap<String, Node>();
public Map<String, Node> getNodeMap() { return nodeMap; } public void addNode(Node node){ if(node==null){ throw new RuntimeException("bad Node"); } this.nodeMap.put(node.getName(),node); } public void addEdge(String startNodeName,String endNodeName){ if(nodeMap==null) { throw new RuntimeException("nodeMap is null"); } if(nodeMap.get(startNodeName)==null){ throw new RuntimeException("startNode is null"); } if(nodeMap.get(endNodeName)==null){ throw new RuntimeException("endNode is null"); } nodeMap.get(startNodeName).addEdges(endNodeName); } /** * 此方法返回fromNode到toNode的最短路徑,但是如果有環路則會陷入死循環 * @param fromNodeName * @param toNodeName * @return */ public int getMostPath(String fromNodeName,String toNodeName){ Node fromNode = nodeMap.get(fromNodeName); List<Edge> edges = fromNode.getEdges(); if(edges==null){ return -1; } int path = 0; for (Edge edge :edges){
int tempPath = fromNode.getWeight(); String endNodeName = edge.getEndNode(); if(!endNodeName.equals(toNodeName)){ int mostPath = getMostPath(endNodeName, toNodeName); if(mostPath==-1){ continue; } tempPath+=mostPath; }else { tempPath+=nodeMap.get(endNodeName).getWeight(); } if(path<tempPath){ path=tempPath; } } return path; } /** * 可跳過閉環並且返迴路徑list的方法 * @param fromNodeName * @param toNodeName * @param pathList * @return */ public int getMostPathResult(String fromNodeName,String toNodeName,LinkedHashSet<String> pathList){ if(fromNodeName.equals(toNodeName)){ System.out.println("ERR : fromNode == toNode"); return -1; } Node fromNode = nodeMap.get(fromNodeName); List<Edge> edges = fromNode.getEdges(); if(edges==null){ return -1; } boolean add = pathList.add(fromNodeName); if(!add){ System.out.println("有閉環!"+"node:"+fromNodeName+",path:"+pathList); return -1; }
int path = 0; LinkedHashSet<String> temp = new LinkedHashSet<String>(); temp.addAll(pathList); for (Edge edge :edges){ LinkedHashSet<String> temp2 = new LinkedHashSet<String>(); temp2.addAll(temp); int tempPath = fromNode.getWeight(); String endNodeName = edge.getEndNode(); if(!endNodeName.equals(toNodeName)){ int mostPath = getMostPathResult(endNodeName, toNodeName,temp2); if(mostPath==-1){ continue; } tempPath+=mostPath; }else { tempPath+=nodeMap.get(endNodeName).getWeight(); temp2.add(toNodeName); } if(path<tempPath){ path=tempPath; pathList.clear(); pathList.addAll(temp2); } } return path; } }

④ 最短路徑優先演算法

從某頂點出發,沿圖的邊到達另一頂點所經過的路徑中,各邊上權值之和最小的一條路徑叫做最短路徑。解決最短路的問題有以下演算法,Dijkstra演算法,Bellman-Ford演算法,Floyd演算法和SPFA演算法等。

⑤ 最優尋路/遍歷演算法

你說的是圖的搜索演算法,不是樹的演算法。看你的要求,推薦用貪心演算法。
每次從當前的所有下層結點當中選擇花費最小的子結點進入,之後也都是。
不過對這些整數問題,貪心未必能夠找到最好的路徑,真正最好的路徑應該是使用動態規劃演算法的。
找一本計算機競賽的輔導書吧,上面對動態規劃講的會可以的。另外還有一種什麼網路流演算法,我一直沒學會,你可以試試看,也是找圖的最短路徑的。
對於給定2結點之間的搜索,你可以用雙向廣度優先演算法,從2個結點同時出發,向路徑中間結點搜索最短路徑。

⑥ 導航系統最優路徑選擇的演算法

請學習 最短路徑演算法。

⑦ 求解:圖論中常見的最短路徑演算法有幾種都是什麼

主要是有三種、、

第一種是最直接的貪心dijkstra演算法、、可以利用堆數據結構進行優化、、缺點就是不能求有負權的最短路與判斷負環、、

第二種是bellman-ford演算法、、根據鬆弛操作的性質是可以來判斷負環的、、時間復雜度是O(nm)的、、

第三種是SPFA演算法、、把他單獨拿出來作為一種演算法並不是非常好的、、他的實質應該是上面的bellman-ford演算法的隊列優化時間復雜度更低、O(KE)、K的值約等於2、、

⑧ 最佳路線演算法

如果節點數n比較小的話,狀態壓縮一下就可以了。
就是說dist[i][j]表示到達第i個點的時候,已經走過的節點的狀態為j的最短距離,然後再用dijkstra或者spfa跑一邊求出 dist[1][(1 << n) - 1]即使答案。

⑨ 路徑分析的最優路徑分析方法

1.道路預處理
進行道路數據錄入時,往往在道路的交叉接合處出現重疊或相離的情況,不宜計算機處理。因此,需要對原始數據進行預處理,使道路接合符合處理要求。進行預處理時,取每條線段的首末節點坐標為圓心,以給定的閾值為半徑作圓域,判斷其他線段是否與圓域相交,如果相交,則相交的各個線對象共用一個節點號。
2.道路自動斷鏈
對道路進行預處理之後即可獲得比較理想的數據,在此基礎上再進行道路的自動斷鏈。步驟如下:
(1)取出所有線段記錄數n,從第一條線段開始;
(2)找出所有與之相交的線段並求出交點數m;
(3)將m個交點和該線段節點在判斷無重合後進行排序;
(4)根據交點數量,該線段被分成m+1段;
(5)第一段在原始位置不變,後m段從記錄尾開始遞增;
(6)重復(2)~(5),循環至n。
3.節點匹配
拓撲關系需使用統一的節點。節點匹配方法是按記錄順序將所有線段的始末點加上相應節點號,坐標相同的節點共用一個節點號,與前面所有線段首末點都不相同的節點按自然順序遞增1。
4.迪傑克斯特拉(Dijkstra)演算法
經典的圖論與計算機演算法的有效結合,使得新的最短路徑演算法不斷涌現。目前提出的最短路徑演算法中,使用最多、計算速度比較快,又比較適合於計算兩點之間的最短路徑問題的數學模型就是經典的Dijkstra演算法。
該演算法是典型的單源最短路徑演算法,由Dijkstra EW於1959年提出,適用於所有弧的權均為非負的情況,主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。該演算法的基本思想是:認為兩節點間最佳路徑要麼是直接相連,要麼是通過其他已找到的與起始點的最佳路徑的節點中轉點。定出起始點P0後,定能找出一個與之直接相連且路徑長度最短的節點,設為P1,P0到P1就是它們間的最佳路徑。
Dijkstra演算法的基本流程如下:首先將網路中所有節點分成兩組,一組包含了已經確定屬於最短路徑中點的集合,記為S(該集合在初始狀態只有一個源節點,以後每求得一條最短路徑,就將其加入到集合S中,直到全部頂點都加入到S中,演算法就結束了);另一組是尚未確定最短路徑的節點的集合,記為V,按照最短路徑長度遞增的次序依次把第二組的頂點加入到第一組中,在加入的過程中總保持從源點到S中各頂點的最短路徑長度不大於從源點到V中任何頂點的最短路徑長度。此外,每個頂點對應一個距離,S中的頂點距離就是從源點到此頂點的最短路徑長度,V中的頂點距離是從源點到此頂點只包括S中的頂點為中間頂點的當前最短路徑長度。

⑩ "最短路徑優先演算法"的優缺點

這個演算法一般出現在網路中,用於路由器的路由定址,我也只了解這方面的優缺點。如果不對,LZ就別看了。
所謂最短路徑,實際上說的是跳數。比如從一條路走會經過三個路由器,而從另一條路走,會經過兩個路由器,那麼此演算法會判斷2跳比3跳要短,但具體每一跳會花多長時間,經過多長路程,它不會考慮的。所以不一定演算法的最短路徑就是真實的最短。因為很多因素演算法沒有考慮,比如通信質量,網線長度……
C語言我只看過一個模擬現實的例子,大概是說公車走什麼路線長度最短,那個演算法考慮的是路線的長短,而不是跳數,優點當然就是路線的絕對最短,缺點就是沒考慮到其他現實因素,比如是否堵車(相當於網路通信質量)之類。
總之不管什麼演算法,考慮到的因素就是它的優點,反過來說,缺點往往就是演算法忽略的因素。
補充一下,如果說的不是演算法本身的優劣,而是細節的實現方面,那就是從時間復雜度和空間復雜度兩個方面去考慮了,希望對LZ有用。

閱讀全文

與單行最優路徑演算法相關的資料

熱點內容
底部異地持倉源碼 瀏覽:103
加密應用手機 瀏覽:794
程序員考試考什麼科目 瀏覽:483
程序員必備文檔編輯 瀏覽:958
踩水果解壓大全 瀏覽:632
什麼是dk伺服器在 瀏覽:459
nusoapphp下載 瀏覽:927
黑莓原生解壓rar 瀏覽:954
百度解壓縮在哪 瀏覽:786
硬解壓卡怎麼用 瀏覽:181
新買的聯想伺服器怎麼配置 瀏覽:755
mc命令方塊的代碼 瀏覽:650
伺服器老打不開怎麼辦 瀏覽:254
單片機智能儀器 瀏覽:706
別告訴我你會記筆記pdf 瀏覽:160
一套谷歌51瀏覽器易源碼 瀏覽:378
unix安裝命令 瀏覽:59
cephmonitor源碼 瀏覽:440
單片機的硬體結構重點 瀏覽:558
地鐵逃生用什麼伺服器最好 瀏覽:931