-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專(zhuān)題列表 > 正文
最短路徑算法怎么做(最短路徑算法做圖像分割的代碼-)
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于最短路徑算法怎么做的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開(kāi)始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話(huà)答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫(xiě)出的就越詳細(xì),有微信小程序端、在線(xiàn)網(wǎng)頁(yè)版、PC客戶(hù)端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶(hù)遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話(huà)175-8598-2043,或添加微信:1454722008
本文目錄:
一、java 最短路徑算法 如何實(shí)現(xiàn)有向 任意兩點(diǎn)的最短路徑
Dijkstra(迪杰斯特拉)算法是典型的最短路徑路由算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止。
Dijkstra一般的表述通常有兩種方式,一種用永久和臨時(shí)標(biāo)號(hào)方式,一種是用OPEN, CLOSE表方式
用OPEN,CLOSE表的方式,其采用的是貪心法的算法策略,大概過(guò)程如下:
1.聲明兩個(gè)集合,open和close,open用于存儲(chǔ)未遍歷的節(jié)點(diǎn),close用來(lái)存儲(chǔ)已遍歷的節(jié)點(diǎn)
2.初始階段,將初始節(jié)點(diǎn)放入close,其他所有節(jié)點(diǎn)放入open
3.以初始節(jié)點(diǎn)為中心向外一層層遍歷,獲取離指定節(jié)點(diǎn)最近的子節(jié)點(diǎn)放入close并從新計(jì)算路徑,直至close包含所有子節(jié)點(diǎn)
代碼實(shí)例如下:
Node對(duì)象用于封裝節(jié)點(diǎn)信息,包括名字和子節(jié)點(diǎn)
[java] view plain copy
public class Node {
private String name;
private Map<Node,Integer> child=new HashMap<Node,Integer>();
public Node(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<Node, Integer> getChild() {
return child;
}
public void setChild(Map<Node, Integer> child) {
this.child = child;
}
}
MapBuilder用于初始化數(shù)據(jù)源,返回圖的起始節(jié)點(diǎn)
[java] view plain copy
public class MapBuilder {
public Node build(Set<Node> open, Set<Node> close){
Node nodeA=new Node("A");
Node nodeB=new Node("B");
Node nodeC=new Node("C");
Node nodeD=new Node("D");
Node nodeE=new Node("E");
Node nodeF=new Node("F");
Node nodeG=new Node("G");
Node nodeH=new Node("H");
nodeA.getChild().put(nodeB, 1);
nodeA.getChild().put(nodeC, 1);
nodeA.getChild().put(nodeD, 4);
nodeA.getChild().put(nodeG, 5);
nodeA.getChild().put(nodeF, 2);
nodeB.getChild().put(nodeA, 1);
nodeB.getChild().put(nodeF, 2);
nodeB.getChild().put(nodeH, 4);
nodeC.getChild().put(nodeA, 1);
nodeC.getChild().put(nodeG, 3);
nodeD.getChild().put(nodeA, 4);
nodeD.getChild().put(nodeE, 1);
nodeE.getChild().put(nodeD, 1);
nodeE.getChild().put(nodeF, 1);
nodeF.getChild().put(nodeE, 1);
nodeF.getChild().put(nodeB, 2);
nodeF.getChild().put(nodeA, 2);
nodeG.getChild().put(nodeC, 3);
nodeG.getChild().put(nodeA, 5);
nodeG.getChild().put(nodeH, 1);
nodeH.getChild().put(nodeB, 4);
nodeH.getChild().put(nodeG, 1);
open.add(nodeB);
open.add(nodeC);
open.add(nodeD);
open.add(nodeE);
open.add(nodeF);
open.add(nodeG);
open.add(nodeH);
close.add(nodeA);
return nodeA;
}
}
圖的結(jié)構(gòu)如下圖所示:
Dijkstra對(duì)象用于計(jì)算起始節(jié)點(diǎn)到所有其他節(jié)點(diǎn)的最短路徑
[java] view plain copy
public class Dijkstra {
Set<Node> open=new HashSet<Node>();
Set<Node> close=new HashSet<Node>();
Map<String,Integer> path=new HashMap<String,Integer>();//封裝路徑距離
Map<String,String> pathInfo=new HashMap<String,String>();//封裝路徑信息
public Node init(){
//初始路徑,因沒(méi)有A->E這條路徑,所以path(E)設(shè)置為Integer.MAX_VALUE
path.put("B", 1);
pathInfo.put("B", "A->B");
path.put("C", 1);
pathInfo.put("C", "A->C");
path.put("D", 4);
pathInfo.put("D", "A->D");
path.put("E", Integer.MAX_VALUE);
pathInfo.put("E", "A");
path.put("F", 2);
pathInfo.put("F", "A->F");
path.put("G", 5);
pathInfo.put("G", "A->G");
path.put("H", Integer.MAX_VALUE);
pathInfo.put("H", "A");
//將初始節(jié)點(diǎn)放入close,其他節(jié)點(diǎn)放入open
Node start=new MapBuilder().build(open,close);
return start;
}
public void computePath(Node start){
Node nearest=getShortestPath(start);//取距離start節(jié)點(diǎn)最近的子節(jié)點(diǎn),放入close
if(nearest==null){
return;
}
close.add(nearest);
open.remove(nearest);
Map<Node,Integer> childs=nearest.getChild();
for(Node child:childs.keySet()){
if(open.contains(child)){//如果子節(jié)點(diǎn)在open中
Integer newCompute=path.get(nearest.getName())+childs.get(child);
if(path.get(child.getName())>newCompute){//之前設(shè)置的距離大于新計(jì)算出來(lái)的距離
path.put(child.getName(), newCompute);
pathInfo.put(child.getName(), pathInfo.get(nearest.getName())+"->"+child.getName());
}
}
}
computePath(start);//重復(fù)執(zhí)行自己,確保所有子節(jié)點(diǎn)被遍歷
computePath(nearest);//向外一層層遞歸,直至所有頂點(diǎn)被遍歷
}
public void printPathInfo(){
Set<Map.Entry<String, String>> pathInfos=pathInfo.entrySet();
for(Map.Entry<String, String> pathInfo:pathInfos){
System.out.println(pathInfo.getKey()+":"+pathInfo.getValue());
}
}
/**
* 獲取與node最近的子節(jié)點(diǎn)
*/
private Node getShortestPath(Node node){
Node res=null;
int minDis=Integer.MAX_VALUE;
Map<Node,Integer> childs=node.getChild();
for(Node child:childs.keySet()){
if(open.contains(child)){
int distance=childs.get(child);
if(distance<minDis){
minDis=distance;
res=child;
}
}
}
return res;
}
}
Main用于測(cè)試Dijkstra對(duì)象
[java] view plain copy
public class Main {
public static void main(String[] args) {
Dijkstra test=new Dijkstra();
Node start=test.init();
test.computePath(start);
test.printPathInfo();
}
}
二、求寫(xiě)最短路徑算法。由A地到E地,途經(jīng)B(B1,B2,B3)C(C1,C2,C3)地,基于矩陣乘法求最短路徑。給出步驟
們把求A →E 的最短路分解為四個(gè)階段A →B →C→D →E 來(lái)求解。每一個(gè)階段可以用一個(gè)矩陣來(lái)表示,這個(gè)矩陣稱(chēng)為權(quán)矩陣。相鄰階段的路徑可以用權(quán)矩陣的乘積來(lái)表示。但這里的矩陣乘法和普通矩陣乘積運(yùn)算的區(qū)別是:普通矩陣乘積其對(duì)應(yīng)元素是相應(yīng)元素乘積的代數(shù)和,這里把元素相乘改為相加,元素的代數(shù)和改為取小運(yùn)算,如果不同層節(jié)點(diǎn)間沒(méi)有連接,則視它們之間的距離為無(wú)窮大. 如果是求極大,改為取大運(yùn)算,此時(shí)如果不同層節(jié)點(diǎn)間沒(méi)有連接,則視它們的距離為0。
如下:
由A地到B地的距離可表示為:A[2 5 8]
由B地到C地的權(quán)矩陣可表示為
[3,6,5;7,10,8;4,9,6]
因此由A到C的權(quán)矩陣為[2,5,8][3,6,5;7,10,8;4,9,6]=[5,8,7]
因此由A到D的權(quán)矩陣為[5,8,7)][7,5;3,4;5,2]=[11 ,9]
由A→E的權(quán)矩陣為:[11 ,9][4,2)]=[15,11]
因此從家里到學(xué)校的最短距離為11百米,最近的路徑為從A地出發(fā)經(jīng)過(guò)B1地C1地D2地到達(dá)E地。
下面我們給出基于“矩陣乘法”求解最短路的算法:
第一階段:計(jì)算出圖中從起始點(diǎn)到終點(diǎn)最短路的長(zhǎng)度.
step1 劃分出該網(wǎng)絡(luò)圖中的層次關(guān)系(網(wǎng)絡(luò)劃分為N 層,起點(diǎn)為第一層,終點(diǎn)為第N 層) ;
step2 依次給出從第i 層到第i + 1 層的權(quán)矩陣( i= 1 ,2 , …, N21) ; (若第i 層有m 個(gè)頂點(diǎn);第i + 1 層有n
個(gè)頂點(diǎn), 則從第i 層到第i + 1 層的權(quán)矩陣為m *n
階) .
step3 按照我們定義的矩陣乘法計(jì)算出最短路的
數(shù)值.
第二階段:尋找最短路所經(jīng)過(guò)的中間點(diǎn).
(利用第一階段中step2 的數(shù)據(jù)) 計(jì)算出從第i 層到
終點(diǎn)的最短路, 對(duì)比與i21 層到終點(diǎn)的最短路, 從而確
定出第i 層上最短路所經(jīng)過(guò)的頂點(diǎn)( i = 2 , …, N21) .
三、求一個(gè)最短路徑的算法
以前看到過(guò),貼給你
Private Function OrderXY(X() As Double, Y() As Double)
Dim i, j, k, m, n, num, temp As Double
Dim NewX() As Double
Dim NewY() As Double
Dim Smin As Double '定義最短總距離
If UBound(X()) <> UBound(Y()) Then MsgBox "坐標(biāo)錯(cuò)誤": Exit Function '防止數(shù)據(jù)錯(cuò)誤
n = UBound(X())
ReDim p(n) As Long
p(0) = 0: num = 1
For i = 1 To n
p(i) = i 'p()數(shù)組依次存儲(chǔ)從0到n共n+1個(gè)數(shù)
num = num * i '計(jì)算num,num表示的是n個(gè)坐標(biāo)(除X(0),Y(0)以外)共有n!種排列
Next
ReDim Stance(num - 1) As Double '定義數(shù)組存儲(chǔ)每種連接方法的總距離
ReDim NewX(n)
ReDim NewY(n)
For i = 0 To n - 1 'Stance(0)是按照原坐標(biāo)順序依次連接的總距離
Stance(0) = Stance(0) + Sqr((Y(i + 1) - Y(i)) * (Y(i + 1) - Y(i)) + (X(i + 1) - X(i)) * (X(i + 1) - X(i)))
Next
Smin = Stance(0)
For k = 0 To n
NewX(k) = X(k)
NewY(k) = Y(k)
Next
i = n - 1
'下面對(duì)p()數(shù)組的n個(gè)數(shù)(除0以外)進(jìn)行排列,每產(chǎn)生一種排列方式,坐標(biāo)數(shù)組的數(shù)據(jù)就對(duì)應(yīng)交換,并計(jì)算這一路徑的總距離
Do While i > 0
If p(i) < p(i + 1) Then
For j = n To i + 1 Step -1 '從排列右端開(kāi)始
If p(i) <= p(j) Then Exit For '找出遞減子序列
Next
temp = p(i): p(i) = p(j): p(j) = temp '將遞減子序列前的數(shù)字與序列中比它大的第一個(gè)數(shù)交換
temp = X(i): X(i) = X(j): X(j) = temp '與之對(duì)應(yīng)的X Y也交換
temp = Y(i): Y(i) = Y(j): Y(j) = temp
For j = n To 1 Step -1 '將這部分排列倒轉(zhuǎn)
i = i + 1
If i >= j Then Exit For
temp = p(i): p(i) = p(j): p(j) = temp
temp = X(i): X(i) = X(j): X(j) = temp
temp = Y(i): Y(i) = Y(j): Y(j) = temp
Next
m = m + 1
For k = 0 To n - 1
Stance(m) = Stance(m) + Sqr((Y(k + 1) - Y(k)) * (Y(k + 1) - Y(k)) + (X(k + 1) - X(k)) * (X(k + 1) - X(k)))
Next
If Stance(m) <= Smin Then
Smin = Stance(m)
For k = 0 To n
NewX(k) = X(k): NewY(k) = Y(k)
Next
End If
i = n
End If
i = i - 1
Loop
For k = 0 To n
X(k) = NewX(k): Y(k) = NewY(k)
Next '此時(shí)的X() Y() 就按照最短路徑排列
End Function
四、最短路徑(Dijkstra算法)
0<-->2 = 667;
0<-->5 = 689;
0<-->9 = 1160;
0<-->13 = 1046;
1<-->13 = 242;
2<-->3 = 3036;
3<-->11 = 1892;
4<-->8 = 1180;
4<-->9 = 303;
4<-->14 = 825;
5<-->6 = 898;
5<-->9 = 695;
5<-->10 = 511;
6<-->7 = 707;
6<-->12 = 1419;
6<-->14 = 482;
7<-->8 = 1588;
10<-->11 = 676;
10<-->12 = 1346;
不是已經(jīng)有答案了嗎?還問(wèn)什么呢
以上就是關(guān)于最短路徑算法怎么做相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢(xún),客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
制造業(yè)包括哪些行業(yè)(高端制造業(yè)包括哪些行業(yè))
海報(bào)設(shè)計(jì)app(手機(jī)制作海報(bào)的app免費(fèi))
猜你喜歡
重慶網(wǎng)站制作公司哪家好(重慶網(wǎng)站制作公司聯(lián)系方式)
第一次接推廣應(yīng)該注意什么(第一次接推廣應(yīng)該注意什么事項(xiàng))
小程序在線(xiàn)生成平臺(tái)(小程序在線(xiàn)生成平臺(tái)有哪些)
拍信息流是什么意思(拍信息流是什么意思網(wǎng)絡(luò)用語(yǔ))
知乎是一個(gè)什么樣的軟件(知乎是一個(gè)什么樣的軟件可信嗎)
網(wǎng)頁(yè)的基本結(jié)構(gòu)有哪幾部分(網(wǎng)頁(yè)的基本結(jié)構(gòu)有哪幾部分構(gòu)成)
個(gè)人簡(jiǎn)歷模板word格式百度云(簡(jiǎn)歷模板word個(gè)人簡(jiǎn)歷免費(fèi)百度云)