首頁 後端開發 php教程 PHP實現的迪科斯徹最短路徑

PHP實現的迪科斯徹最短路徑

Sep 18, 2017 am 10:04 AM
php 路徑

這篇文章主要介紹了PHP實現的迪科斯徹(Dijkstra)最短路徑演算法,簡單描述了迪科斯徹(Dijkstra)最短路徑演算法的概念、功能並結合具體實例形式分析了php實現迪科斯徹(Dijkstra)最短路徑演算法的相關步驟與操作技巧,需要的朋友可以參考下

本文實例講述了PHP實現的迪科斯徹(Dijkstra)最短路徑演算法。分享給大家供大家參考,具體如下:

一、待解決問題

單源最短路徑問題,在給定有向圖中求一個頂點(單源頂點)到其他所有頂點的最短路徑問題。在下圖中,每條邊上有一個權值,希望求解A到所有其他頂點(B/C/D/E/F/G)的最短路徑。

二、問題分析(最短路徑的子結構同樣最優性)

如果P (A,G)是從頂點A到G的最短路徑,假設D和F是這條路徑上的中間點,那麼P(D,F)一定時從D到F的最短路徑。如果P(D,F)不是D到F的最短路徑,那必然存在某一個節點M的另一條D到F的路徑可以使P(A,B...M...F,G)比P (A,G)小,自相矛盾。

有了這樣的性質,我們可以了解Dijkstra演算法。

三、Dijkstra演算法

Dijkstra 演算法,又叫迪科斯徹演算法(Dijkstra),又稱為單源最短路徑演算法,所謂單源是在一個有向圖中,從一個頂點出發,求該頂點至所有可到達頂點的最短路徑問題。 問題描述為設G=(V,E)為有向圖,V表示頂點,E表示邊。它的每一邊(i,j)屬於E,都有一個非負權W(I,j),在G中指定一個結點v0,要求把從v0到G的每一個接vj(vj屬於V )的最短有向路徑找出來(或指出不存在)。 Dijstra演算法是運用貪心的策略,從源點開始,不斷地透過相聯通的點找出到其他點的最短距離。

Dijkstra的貪心應用在他利用(二)中的性質,不斷地選取“最近”的節點並試探每個節點的所有可能存在鏈接,以起始點為中心向外層層擴展,直到擴展到終點為止。對於源點A,逐步擴展,根據dist[j]=min{dist[j],dist[i]+matrix[i][j]}更新與i直接相鄰的頂點資訊。

演算法描述

1)演算法想法:

設G=(V,E)是帶權有向圖,把圖中頂點集合V分成兩組,第一組為已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑, 就將加入到集合S中,直到全部頂點都加入S中,演算法就結束了),第二組為其餘未確定最短路徑的頂點集合(以U表示),以最短路徑長度的遞增次序依序把第二組的頂點加入S。在加入的過程中,總維持從源點v到S中各頂點的最短路徑長度不大於從源點v到U中任何頂點的最短路徑長度。此外,每個頂點對應一個距離,S中的頂點的距離就是從v到此頂點的最短路徑長度,U中的頂點的距離,是從v到此頂點只包括S中的頂點為中間頂點的當前最短路徑長度。

2)演算法步驟:

a.初始時,S只包含源點,即S={v},v的距離為0。 U包含除v外的其他頂點,即:U={其餘頂點},若v與U中頂點u有邊,則<u,v>正常有權值,若u不是v的出邊鄰接點,則<u,v>權值為∞。

b.從U選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。

c.以k為新考慮的中間點,修改U中與k相鄰的各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值為頂點k的距離加上k與u邊上的權。

d.重複步驟b和c直到所有頂點都包含在S中。

四、演算法PHP實作


#
&lt;?php
class Dijkstra
{
  private $G;
  public function __construct()
  {
    //有向图存储
    $this-&gt;G = array(
      array(0,1,2,0,0,0,0),
      array(0,0,0,1,2,0,0),
      array(0,0,0,0,0,2,0),
      array(0,0,0,0,0,1,3),
      array(0,0,0,0,0,0,3),
      array(0,0,0,0,0,0,1),
      array(0,0,0,0,0,0,0),
    );
  }
  public function calculate()
  {
    // 存储已经选择节点和剩余节点
    $U = array(0);
    $V = array(1,2,3,4,5,6);
    // 存储路径上节点距离源点的最小距离
    $d = array();
    //初始化图中节点与源点0的最小距离
    for($i=1;$i&lt;7;$i++)
    {
      if($this-&gt;G[0][$i]&gt;0)
      {
        $d[$i] = $this-&gt;G[0][$i];
      }
      else
      {
        $d[$i] = 1000000;
      }
    }
    // n-1次循环完成转移节点任务
    for($l=0;$l&lt;6;$l++)
    {
      // 查找剩余节点中距离源点最近的节点v
      $current_min = 100000;
      $current_min_v = 0;
      foreach($V as $k=&gt;$v)
      {
        if($d[$v] &lt; $current_min)
        {
          $current_min = $d[$v];
          $current_min_v = $v;
        }
      }
      //从V中更新顶点到U中
      array_push($U,$current_min_v);
      array_splice($V,array_search($current_min_v,$V),1);
      //更新
      foreach($V as $k=&gt;$u)
      {
        if($this-&gt;G[$current_min_v][$u]!=0&amp;&amp;$d[$u]&gt;$d[$current_min_v]+$this-&gt;G[$current_min_v][$u])
        {
          $d[$u] = $d[$current_min_v]+$this-&gt;G[$current_min_v][$u];
        }
      }
    }
    foreach($d as $k =&gt; $u)
    {
      echo $k.&#39;=&gt;&#39;.$u.&#39;&lt;br&gt;&#39;;
    }
  }
}
?&gt;
登入後複製

呼叫類別:


$D = new Dijkstra;
$D-&gt;calculate();
登入後複製

執行結果:


1=&gt;1
2=&gt;2
3=&gt;2
4=&gt;3
5=&gt;3
6=&gt;4
登入後複製

以上是PHP實現的迪科斯徹最短路徑的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和時間

CakePHP 專案配置 CakePHP 專案配置 Sep 10, 2024 pm 05:25 PM

CakePHP 專案配置

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

CakePHP 檔案上傳

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

討論 CakePHP

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

See all articles