1.1 教室排程問題
假設有如下課程表,你希望將盡可能多的課程安排在某間教室上。
你沒法讓這些課都在這間教室上,因為有些課的上課時間有衝突。
你希望在這間教室上盡可能多的課。如何選出盡可能多且時間不衝突的課程呢?這個問題好像很難,不是嗎?實際上,演算法可能簡單得讓你大吃一驚。具體做法如下。
(1) 選出結束最早的課,它就是要在這間教室上的第一堂課。
(2) 接下來,必須選擇第一堂課結束後才開始的課。同樣,你選擇結束最早的課,這將是要在這間教室上的第二堂課。重複這樣做就能找出答案!下面來試一試。美術課的結束時間最早,為10:00 a.m.,因此它就是第一堂課。
接下來的課必須在10:00 a.m.後開始,且結束得最早。
英語課不行,因為它的時間與美術課衝突,但數學課滿足條件。最後,計算機課與數學課的時間是衝突的,但**課可以。
因此將在這間教室上如下三堂課。
很多人都跟我說,這個演算法太容易、太顯而易見,肯定不對。但這正是貪婪演算法的優點——簡單易行!貪婪演算法很簡單:每步都採取最優的做法。在這個示例中,你每次都選擇結束最早的課。用專業術語說,就是你每步都選擇區域性最優解,最終得到的就是全域性最優解。信不信由你,對於這個排程問題,上述簡單演算法找到的就是最優解!顯然,貪婪演算法並非在任何情況下都行之有效,但它易於實現!下面再來看乙個例子。
1.2 揹包問題
假設你是個貪婪的小偷,揹著可裝35磅(1磅≈0.45千克)重東西的揹包,在商場伺機盜竊各種可裝入揹包的商品。
你力圖往揹包中裝入價值最高的商品,你會使用哪種演算法呢?
同樣,你採取貪婪策略,這非常簡單。
(1) 盜竊可裝入揹包的最貴商品。
(2) 再盜竊還可裝入揹包的最貴商品,以此類推。
只是這次這種貪婪策略不好使了!例如,你可盜竊的商品有下面三種。
你的揹包可裝35磅的東西。音響最貴,你把它給偷了,但揹包沒有空間裝其他東西了。
你偷到了價值3000美元的東西。且慢!如果不是偷音響,而是偷膝上型電腦和結他,總價將為3500美元!
在這裡,貪婪策略顯然不能獲得最優解,但非常接近。動態規劃將介紹如何找出最優解。不過小偷去購物中心行竊時,不會強求所偷東西的總價最高,只要差不多就行了。
從這個示例你得到了如下啟示:在有些情況下,完美是優秀的敵人。有時候,你只需找到乙個能夠大致解決問題的演算法,此時貪婪演算法正好可派上用場,因為它們實現起來很容易,得到的結果又與正確結果相當接近。
練習:
1.你在一家家具公司工作,需要將家具發往全國各地,為此你需要將箱子裝上卡車。每個箱子的尺寸各不相同,你需要盡可能利用每輛卡車的空間,為此你將如何選擇要裝上卡車的箱子呢?請設計一種貪婪演算法。使用這種演算法能得到最優解嗎?
答:種貪婪策略是,選擇可裝入卡車剩餘空間內的最大箱子,並重複這個過程,直到不能再裝入箱子為止。使用這種演算法不能得到最優解。
2.你要去歐洲旅行,總行程為7天。對於每個旅遊勝地,你都給它分配乙個價值——表示你有多想去那裡看看,並估算出需要多長時間。你如何將這次旅行的價值最大化?請設計一種貪婪演算法。使用這種演算法能得到最優解嗎?
答:不斷地挑選可在餘下的時間內完成的價值最大的活動,直到餘下的時間不夠完成任何活動為止。使用這種演算法不能得到最優解。
1.3集合覆蓋問題
假設你辦了個廣播節目,要讓全美50個州的聽眾都收聽得到。為此,你需要決定在哪些廣播台播出。在每個廣播台播出都需要支付費用,因此你力圖在盡可能少的廣播台播出。現有廣播台名單如下。
每個廣播台都覆蓋特定的區域,不同廣播台的覆蓋區域可能重疊。
如何找出覆蓋全美50個州的最小廣播台集合呢?聽起來很容易,但其實非常難。具體方法如下。
(1) 列出每個可能的廣播台集合,這被稱為冪集(power set)。可能的子集有2n個。
(2) 在這些集合中,選出覆蓋全美50個州的最小集合。
問題是計算每個可能的廣播台子集需要很長時間。由於可能的集合有2n個,因此執行時間為o(2n)。如果廣播台不多,只有5~10個,這是可行的。但如果廣播台很多,結果將如何呢?隨著廣播台的增多,需要的時間將激增。假設你每秒可計算10個子集,所需的時間將如下。
沒有任何演算法可以足夠快地解決這個問題!怎麼辦呢?
貪婪演算法可化解危機!使用下面的貪婪演算法可得到非常接近的解。
(1) 選出這樣乙個廣播台,即它覆蓋了最多的未覆蓋州。即便這個廣播台覆蓋了一些已覆蓋的州,也沒有關係。
(2) 重複第一步,直到覆蓋了所有的州。
貪婪演算法是不錯的選擇,它們不僅簡單,而且通常執行速度很快。在這個例子中,貪婪演算法的執行時間為o(n2),其中n為廣播台數量。
下面來看看解決這個問題的**。
1. 準備工作
出於簡化考慮,這裡假設要覆蓋的州沒有那麼多,廣播台也沒有那麼多。
首先,建立乙個列表,其中包含要覆蓋的州。
states_needed = set(["mt
近似演算法作業
近似演算法作業 題目 證明g中的最大團size為 等價於 g m中最大團size為m 證明 充分性 若g中最大團size為 根據g m的構造過程,g m中至少有存在乙個size為m 的團。首先g m中的最大團不可能小於m 如果小於小於m 則說明,構成g m最大團,每個g貢獻了少於 的結點,這種情況是...
概率演算法和近似演算法
前面已經提到了顯示中大多數難解問題問題最後都被證明是np 完全問題。這意味著,除非np p,它們是不可能有多項式時間演算法的 而且,在這篇文章提到即使np p,人們也可能找不到乙個np完全問題的 有效 演算法 所以人們發展了各種工具來避開它們,最常用的兩種方法是使用概率演算法和近似演算法,這兩種方法...
連分數近似演算法
2019年2月19日註 這篇文章原先發在自己github那邊的部落格,時間是2017年2月5日 這道題源自數學實驗上面的一組實驗,當時困擾了我特別久,題目的內容是用matlab求出 的連分數展開及每層迭代的值。因為matlab的數值精度的問題,當你執行3 16450 16421時,就算你設定了for...