拓扑排序和关键路径的图形化显示
資源下載地址:https://download.csdn.net/download/sheziqiong/85883662
資源下載地址:https://download.csdn.net/download/sheziqiong/85883662
算法實現設計說明
題目
給定一個有向圖,完成:
軟件功能
首先,軟件的首要功能就是接受一個有向圖的輸入,之后才能進行鄰接鏈表的顯示以及拓撲排序與關鍵路徑顯示等功能。
如圖所示,該程序可以通過先輸入節點,再輸入邊的形式輸入一個有向圖。
之后,可以將鄰接鏈表以動畫的形式顯示出來,大概的實現方法是對鄰接鏈表進行遍歷,并且將相應的節點與邊的信息儲存到圖形顯示配置項[1]當中,進行顯示。
其次,該程序可以根據給出的鄰接鏈表進行拓撲排序,并且能夠以動畫的形式將拓撲排序的過程顯示出來。具體的實現方法就是在進行拓撲排序的同時將每一輪的排序結果都加載到動畫顯示配置項中,之后進行顯示,而每一輪排序中間則是設置了延遲,確保能夠出現動畫效果,動畫的延遲可以由外部輸入決定。
最后,該程序還能夠顯示輸入圖的關鍵路徑,并且顯示各頂點的 Ve,Vl 以及各個邊(活動)的 L 和 E 的值。具體的實現方法也是對輸入得到的鄰接矩陣實現關鍵路徑算法,計算出各個頂點的最早開始時間以及最晚開始時間,進而計算出各個邊上的最早和最晚開始時間,并且計算出關鍵路徑,并且將相關的信息存儲到圖像顯示的配置項當中,從而完成對關鍵路徑的顯示。
設計思想
整個算法實現題的其實按照題目的順序來就是一個比較完整的實現思路。
首先是讀取鄰接鏈表,根據給定的節點信息確定節點的數量以及名稱,開辟存儲空間。之后讀取邊的信息,對于給定的每一條邊,找到它的源點,在其后的鏈式結構中添加相應的匯點以及邊權,完成鄰接鏈表的構建。
拓撲排序的過程,首先是創建存儲各個節點入度的數組,并將其入度都初始化為 0。之后遍歷整個鄰接表,對于每條邊上出現的匯點,都相應的將其入度+1,得到每個節點的入度情況。遍歷入度表,找到所有入度為 0 的節點,將節點名稱加入棧中。
由于拓撲排序每次都會將一個節點從原圖中剔除,所以對其進行完整的拓撲排序的次數一定是固定的,等于圖中節點的個數。在第一次進行拓撲排序時,棧中應該是有初始入度為0的節點,之后彈出棧頂元素,然該元素所指的其他的節點的入度減一,并且監測入度改變,如果該節點入度變為了零,則將該節點也加入棧中,這樣做保證了尋找其他的入度為 0 的點不會產生額外開銷。之后每一次循環都重復此操作,即可完成整個拓撲排序的過程。其中,如果在進行某一次拓撲排序時,發現棧已空,在上一輪排序中沒有產生出入度為 0 的節點,則說明該圖無法產生有效的拓撲排序,則跳出循環,彈出錯誤顯示框。[2]
在完成拓撲排序之后,需要實現的是關鍵路徑算法。關鍵路徑簡單來說就是進行了一次正拓撲排序以及一次逆拓撲排序,在進行正拓撲排序的同時計算出各個頂點的最早發生時間,再通過逆拓撲排序計算出各個頂點的最晚發生時間。之后再遍歷整張圖,根據節點信息計算出每個邊(活動的)最早發生時間以及最晚發生時間,并據此確定出該活動是否為關鍵活動,并且將計算出的信息都存入圖形顯示配置項中,進行顯示。[3]
邏輯結構與物理結構
邏輯結構:
在進行圖存儲時,采用的邏輯結構為圖形結構,圖為有向圖,每個節點都可能有多個前驅節點和多個后繼節點,是多對多的圖形結構。
在進行拓撲排序中,利用了棧來存儲所有的入度為 0 的節點,棧的開始節點與終端節點都是唯一的,每個節點有且只有一個前驅節點,有且僅有一個后繼節點,屬于線性結構。
在拓撲排序中存儲各個節點的度關系,以及關鍵路徑中存儲各點以及各邊的最早最晚發生時間時,則是使用了集合結構,各個節點之間并沒有明確的邏輯關系,只是為了反映各個節點與其對應值的關系。
物理結構:
對于鄰接矩陣的存儲來說,首先是利用了散列存儲結構,形成了節點名稱到所指向節點鏈的映射。之后某一結點所指向的所有節點則是利用了鏈式存儲結構,方便了頻繁的插入刪除。
對于存儲入度為 0 節點的棧來說,由于主要是會頻繁產生插入和刪除操作,并且我們只關心尾部的節點情況,因此利用鏈式存儲結構實現。
對于存儲節點與其度的對應關系以及節點與邊和最早最晚發生時間的數據結構來說,由于我們只關心對應值的情況,因此是使用散列存儲結構進行存儲。[4]
開發平臺
開發平臺:
Electron 8.0.3 GitHub 發布的跨平臺桌面應用開發工具,支持 Web 技術開發桌面
應用,其本身是基于 C++ 開發的,GUI 核心來自于 Chrome,而 JavaScript 引擎使用 v8。[5]
第三方庫:
ECharts 一個使用 JavaScript 實現的開源可視化庫,可以流暢的運行在 PC 和移動設備上,兼容當前絕大部分瀏覽器(IE8/9/10/11,Chrome,Firefox,Safari 等),底層依賴輕量級的矢量圖形庫 ZRender,提供直觀,交互豐富,可高度個性化定制的數據可視化圖表。[6]
jQuery 一個快速、簡潔的 JavaScript 框架。 jQuery 設封裝 JavaScript 常用的功能代碼,提供一種簡便的 JavaScript 設計模式,優化 HTML 文檔操作、事件處理、動畫設計和Ajax 交互。[7]
軟件的運行環境:Windows10
系統的運行結果分析說明
調試與開發過程:首先是對題目進行了仔細地閱讀與思考,對于整個的算法流程以及數據結構設計有了一個大致的構想。之后便是搜索相關庫與相關資料,進行開發。由于項目采用的是基于 Electron 進行開發,因此整個項目的開發過程實際上就是在進行前端開發。
調試工具則是利用 Electron 中集成的類似瀏覽器的調試控制臺進行調試。
運行結果說明:首先可以打開程序可以看到輸入界面,可以進行節點以及邊的情況的輸入。在程序打開之后是有默認的預置的值,當然也可以進行自行重新輸入以及調整。
點擊“鄰接鏈表”按鈕,可以顯示輸入圖形的鄰接鏈表:
點擊“拓撲排序”按鈕,可以顯示對給定圖的拓撲排序的動畫
點擊“關鍵路徑”按鈕之后,則會顯示當前圖的關鍵路徑:
當進行錯誤輸入時,進行鄰接鏈表以及拓撲排序關鍵路徑等操作時將會顯示錯誤提示
當輸入的圖的情況不滿足拓撲排序條件時,即構成了回環時,則會報錯并且提示無法進行拓撲排序或者關鍵路徑生成操作。
操作說明
在打開程序以后,會自動進入輸入界面,可輸入得內容主要有圖中的節點個數、各個節點的編號、邊的個數、各個邊的情況以及拓撲排序動畫的顯示延遲。
各輸入框的輸入規則如下:
輸入節點個數要求是一個阿拉伯數字。
輸入的節點數量應當余輸入的節點個數保持一致,輸入節點過少可能引發錯誤,輸入節點過多后續節點將不會被讀取。各個節點編號之間用空格隔開,節點編號支持任意字符串,不僅限于數字。
輸入的邊的個數要求是一個阿拉伯數字。
輸入邊的信息時,每行輸入一條邊的信息,每條邊的形式如下:u v w,u 表示源點的節點名稱,v 表示匯點的節點名稱,w 表示邊的權重,三個數據之間需要用空格隔開。u v 需要都是在輸入的節點名稱中出現過的名稱,邊的數量需要和上面輸入的數量相同。
輸入完成后,即可點擊相應按鈕顯示相應動畫。
資源下載地址:https://download.csdn.net/download/sheziqiong/85883662
資源下載地址:https://download.csdn.net/download/sheziqiong/85883662
總結
以上是生活随笔為你收集整理的拓扑排序和关键路径的图形化显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.3.3 x86 虚拟机创建的问题
- 下一篇: java调用print2flash_文档