《劍指offer》:[56]五岔路口交通管理紅綠燈設計

抽象建模能力
       計算機只是一種工具,是爲我們服務所驅使的工具,我們不能一頭扎入這個編程的海洋出不來甚至迷失了方向。它的作用是幫助我們解決實際生活中的問題。程序員的工作就是把各種現實的問題抽象成數學模型並用計算機的編程語言表達出來,所以我們應該培養自己從日常生活中抽取提煉出問題並建立相應的數學模型,找到問題的規律並解決問題的能力。
建模的第一步:從具體問題中抽象選擇合適的數據結構來表述問題;
建模的第二步:分析模型的內在規律,設計一個解此數學模型的算法;
建模的第三步:編出程序,也就是用編程語言表達這種規律,進行結果的分析及調試直至成功。

       比如青蛙跳臺階問題實質就是斐波拉切問題;還有五岔道路口的交通管理其實就是圖的問題,可以用着色來解決。還有圖書館裏的圖書的查找管理也是一種線性的數據結構,計算不規則物體的體積和麪積就是微積分問題,等等,我們一定要培養這種從事物中抽象出問題核心的東西。

      下面主要介紹一個多岔路口交通燈的管理問題,由於該節的知識點在[37]中已經講過了,所以在這裏插入一點書外知識。

     在一般的道路上,我們通常看見的就是紅綠兩種顏色的交通燈,這樣就可以保持正常的交通秩序,又能達到車流量的最大量。以前當我站在人來人往的天橋上,車如馬龍的街道上的時候,看見這個紅綠燈,看着它默默的每天都是周而復始,幫助這個城市有秩序的運轉,就不明覺厲。能感覺到紅綠兩色對於城市交通的重要性和意義!雖然看起來簡單,但是要想達到讓整個城市的交通暢通無阻而且每天能發揮出公路的最大效率,也就是大道車流量的最大值,背後卻不是這麼簡單的,需要合理的算法設置燈的顏色以及更好實現全局協作。交通情況如下圖所示:


                          圖一                                                                       圖二

    下面就簡單的來說說交通燈的問題吧!--摘自嚴蔚敏老師的《數據結構》(C語言版)一書,覺得挺有意思就寫了下來:

    題目: 要求設計一種交通燈方案,使過往的車輛能有秩序的行駛不發生衝突,並且充分最大發揮公路的效率,盡最大可能緩解城市的交通壓力。

    例如在中上圖一中,就是一個城市的五岔路口,ABCDE分別表示這五個路口,E和C分別是單向車道。這裏每天都有大量的車流量。通常這類交通、道路問題的數學模型是一種稱爲“圖”的數據結構。圖二中的每個頂點表示一條通路,如AB代表車從A開向B。而如果存在矛盾的通路我們用連線來表示,例如AB和EA之間有一條連線,表示有車從A向B行駛的時候就不能有車從E到A行駛。

     由此,我們知道在圖二中,每個圓圈表示圖a五岔路口上的一條通路,兩個圓圈之間的連線表示這兩個圓圈不能同時通行。經過這樣的設計抽象和轉化後,看似複雜的問題這這裏設置交通燈的問題就可以等價爲:對圖着色的問題,
     問題轉換爲:要求對圖上的每個頂點然一種顏色,並且要求有線相連的兩個頂點不能具有相同的顏色,而使用的總的顏色種類儘量的少。
    上圖二中就是一種着色方案。例如將紅色、黃色、藍色和綠色分別編號爲1,2,3,4號燈,那麼當4號燈爲綠色時,那麼只有DA和DB兩條路可以通行,其他的都要顯示爲紅色,禁止通行。只有這樣才能保證在 這個五岔路口車輛能有序的行駛,且效率最高,而且最重要的是把發生意外的可能降到了最低。


發佈了250 篇原創文章 · 獲贊 191 · 訪問量 57萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章