近似演算法 貪心演算法與近似演算法

2021-10-14 20:54:47 字數 3126 閱讀 3569

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...