HOME 首頁
SERVICE 服務產品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關于我們
CONTACT 聯系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    最短路徑算法怎么做(最短路徑算法做圖像分割的代碼-)

    發(fā)布時間:2023-04-18 16:37:37     稿源: 創(chuàng)意嶺    閱讀: 119        

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于最短路徑算法怎么做的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網頁版、PC客戶端

    官網:https://ai.de1919.com。

    創(chuàng)意嶺作為行業(yè)內優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008

    本文目錄:

    最短路徑算法怎么做(最短路徑算法做圖像分割的代碼-)

    一、java 最短路徑算法 如何實現有向 任意兩點的最短路徑

    Dijkstra(迪杰斯特拉)算法是典型的最短路徑路由算法,用于計算一個節(jié)點到其他所有節(jié)點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。

    Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表方式

    用OPEN,CLOSE表的方式,其采用的是貪心法的算法策略,大概過程如下:

    1.聲明兩個集合,open和close,open用于存儲未遍歷的節(jié)點,close用來存儲已遍歷的節(jié)點

    2.初始階段,將初始節(jié)點放入close,其他所有節(jié)點放入open

    3.以初始節(jié)點為中心向外一層層遍歷,獲取離指定節(jié)點最近的子節(jié)點放入close并從新計算路徑,直至close包含所有子節(jié)點

    代碼實例如下:

    Node對象用于封裝節(jié)點信息,包括名字和子節(jié)點

    [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用于初始化數據源,返回圖的起始節(jié)點

    [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;

    }

    }

    圖的結構如下圖所示:

    Dijkstra對象用于計算起始節(jié)點到所有其他節(jié)點的最短路徑

    [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(){

    //初始路徑,因沒有A->E這條路徑,所以path(E)設置為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é)點放入close,其他節(jié)點放入open

    Node start=new MapBuilder().build(open,close);

    return start;

    }

    public void computePath(Node start){

    Node nearest=getShortestPath(start);//取距離start節(jié)點最近的子節(jié)點,放入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é)點在open中

    Integer newCompute=path.get(nearest.getName())+childs.get(child);

    if(path.get(child.getName())>newCompute){//之前設置的距離大于新計算出來的距離

    path.put(child.getName(), newCompute);

    pathInfo.put(child.getName(), pathInfo.get(nearest.getName())+"->"+child.getName());

    }

    }

    }

    computePath(start);//重復執(zhí)行自己,確保所有子節(jié)點被遍歷

    computePath(nearest);//向外一層層遞歸,直至所有頂點被遍歷

    }

    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é)點

    */

    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用于測試Dijkstra對象

    [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();

    }

    }

    二、求寫最短路徑算法。由A地到E地,途經B(B1,B2,B3)C(C1,C2,C3)地,基于矩陣乘法求最短路徑。給出步驟

    們把求A →E 的最短路分解為四個階段A →B →C→D →E 來求解。每一個階段可以用一個矩陣來表示,這個矩陣稱為權矩陣。相鄰階段的路徑可以用權矩陣的乘積來表示。但這里的矩陣乘法和普通矩陣乘積運算的區(qū)別是:普通矩陣乘積其對應元素是相應元素乘積的代數和,這里把元素相乘改為相加,元素的代數和改為取小運算,如果不同層節(jié)點間沒有連接,則視它們之間的距離為無窮大. 如果是求極大,改為取大運算,此時如果不同層節(jié)點間沒有連接,則視它們的距離為0。

    如下:

    由A地到B地的距離可表示為:A[2 5 8]

    由B地到C地的權矩陣可表示為

    [3,6,5;7,10,8;4,9,6]

    因此由A到C的權矩陣為[2,5,8][3,6,5;7,10,8;4,9,6]=[5,8,7]

    因此由A到D的權矩陣為[5,8,7)][7,5;3,4;5,2]=[11 ,9]

    由A→E的權矩陣為:[11 ,9][4,2)]=[15,11]

    因此從家里到學校的最短距離為11百米,最近的路徑為從A地出發(fā)經過B1地C1地D2地到達E地。

    下面我們給出基于“矩陣乘法”求解最短路的算法:

    第一階段:計算出圖中從起始點到終點最短路的長度.

    step1  劃分出該網絡圖中的層次關系(網絡劃分為N 層,起點為第一層,終點為第N 層) ;

    step2  依次給出從第i 層到第i + 1 層的權矩陣( i= 1 ,2 , …, N21) ; (若第i 層有m 個頂點;第i + 1 層有n

    個頂點, 則從第i 層到第i + 1 層的權矩陣為m *n

    階) .

    step3  按照我們定義的矩陣乘法計算出最短路的

    數值.

    第二階段:尋找最短路所經過的中間點.

    (利用第一階段中step2 的數據) 計算出從第i 層到

    終點的最短路, 對比與i21 層到終點的最短路, 從而確

    定出第i 層上最短路所經過的頂點( i = 2 , …, N21) .

    三、求一個最短路徑的算法

    以前看到過,貼給你

    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 "坐標錯誤": Exit Function '防止數據錯誤

    n = UBound(X())

    ReDim p(n) As Long

    p(0) = 0: num = 1

    For i = 1 To n

    p(i) = i 'p()數組依次存儲從0到n共n+1個數

    num = num * i '計算num,num表示的是n個坐標(除X(0),Y(0)以外)共有n!種排列

    Next

    ReDim Stance(num - 1) As Double '定義數組存儲每種連接方法的總距離

    ReDim NewX(n)

    ReDim NewY(n)

    For i = 0 To n - 1 'Stance(0)是按照原坐標順序依次連接的總距離

    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

    '下面對p()數組的n個數(除0以外)進行排列,每產生一種排列方式,坐標數組的數據就對應交換,并計算這一路徑的總距離

    Do While i > 0

    If p(i) < p(i + 1) Then

    For j = n To i + 1 Step -1 '從排列右端開始

    If p(i) <= p(j) Then Exit For '找出遞減子序列

    Next

    temp = p(i): p(i) = p(j): p(j) = temp '將遞減子序列前的數字與序列中比它大的第一個數交換

    temp = X(i): X(i) = X(j): X(j) = temp '與之對應的X Y也交換

    temp = Y(i): Y(i) = Y(j): Y(j) = temp

    For j = n To 1 Step -1 '將這部分排列倒轉

    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 '此時的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;

    不是已經有答案了嗎?還問什么呢

    以上就是關于最短路徑算法怎么做相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。


    推薦閱讀:

    圖的四種最短路徑算法(圖的四種最短路徑算法是)

    院線電影最短時長

    最短路徑算法有哪些(最短路徑算法總結)

    制造業(yè)包括哪些行業(yè)(高端制造業(yè)包括哪些行業(yè))

    海報設計app(手機制作海報的app免費)