第 1 章 貪婪演算法

2021-03-31 08:56:30 字數 1932 閱讀 7589

雖然設計乙個好的求解演算法更像是一門藝術,而不像是技術,但仍然存在一些行之有效的能夠用於解決許多問題的演算法設計方法,你可以使用這些方法來設計演算法,並觀察這些演算法是如何工作的。一般情況下,為了獲得較好的效能,必須對演算法進行細緻的調整。但是在某些情況下,演算法經過調整之後效能仍無法達到要求,這時就必須尋求另外的方法來求解該問題。

本章首先引入最優化的概念,然後介紹一種直觀的問題求解方法:貪婪演算法。最後,應用該演算法給出貨箱裝船問題、揹包問題、拓撲排序問題、二分覆蓋問題、最短路徑問題、最小代價生成樹等問題的求解方案。

1.1 最優化問題

本章及後續章節中的許多例子都是最優化問題( optimization problem),每個最優化問題都包含一組限制條件( c o n s t r a i n t)和乙個優化函式( optimization function),符合限制條件的問題求解方案稱為可行解( feasible solution),使優化函式取得最佳值的可行解稱為最優解(optimal solution)。

例1-1 [ 渴嬰問題] 有乙個非常渴的、聰明的小嬰兒,她可能得到的東西包括一杯水、一桶牛奶、多罐不同種類的果汁、許多不同的裝在瓶子或罐子中的蘇打水,即嬰兒可得到n 種不同的飲料。根據以前關於這n 種飲料的不同體驗,此嬰兒知道這其中某些飲料更合自己的胃口,因此,嬰兒採取如下方法為每一種飲料賦予乙個滿意度值:飲用1盎司第i 種飲料,對它作出相對評價,將乙個數值si 作為滿意度賦予第i 種飲料。

通常,這個嬰兒都會盡量飲用具有最大滿意度值的飲料來最大限度地滿足她解渴的需要,但是不幸的是:具有最大滿意度值的飲料有時並沒有足夠的量來滿足此嬰兒解渴的需要。設ai是第i 種飲料的總量(以盎司為單位),而此嬰兒需要t 盎司的飲料來解渴,那麼,需要飲用n種不同的飲料各多少量才能滿足嬰兒解渴的需求呢?

設各種飲料的滿意度已知。令xi 為嬰兒將要飲用的第i 種飲料的量,則需要解決的問題是:

找到一組實數xi(1≤i≤n),使n ?i = 1si xi 最大,並滿足:n ?i=1xi =t 及0≤xi≤ai 。

需要指出的是:如果n ?i = 1ai < t,則不可能找到問題的求解方案,因為即使喝光所有的飲料也不能使嬰兒解渴。

對上述問題精確的數學描述明確地指出了程式必須完成的工作,根據這些數學公式,可以對輸入/ 輸出作如下形式的描述:

輸入:n,t,si ,ai(其中1≤i≤n,n 為整數,t、si 、ai 為正實數)。

輸出:實數xi(1≤i≤n),使n ?i= 1si xi 最大且n ?i=1xi =t(0≤xi≤ai)。如果n ?i = 1ai

在這個問題中,限制條件是n ?i= 1xi =t 且0≤xi≤ai,1≤i≤n。而優化函式是n ?i= 1si xi 。任何滿足限制條件的一組實數xi 都是可行解,而使n ?i= 1si xi 最大的可行解是最優解。

例1-2 [裝載問題] 有一艘大船準備用來裝載貨物。所有待裝貨物都裝在貨箱中且所有貨箱的大小都一樣,但貨箱的重量都各不相同。設第i 個貨箱的重量為wi(1≤i≤n),而貨船的最大載重量為c,我們的目的是在貨船上裝入最多的貨物。

這個問題可以作為最優化問題進行描述:設存在一組變數xi ,其可能取值為0或1。如xi 為0,則貨箱i 將不被裝上船;如xi 為1,則貨箱i 將被裝上船。我們的目的是找到一組xi ,使它滿足限制條件n ?i = 1wi xi ≤c 且x i ? , 1 ≤i≤n。相應的優化函式是n ?i= 1xi 。

滿足限制條件的每一組xi 都是乙個可行解,能使n ?i= 1xi 取得最大值的方案是最優解。

例1-3 [最小代價通訊網路] 城市及城市之間所有可能的通訊連線可被視作乙個無向圖,圖的每條邊都被賦予乙個權值,權值表示建成由這條邊所表示的通訊連線所要付出的代價。包含圖中所有頂點(城市)的連通子圖都是乙個可行解。設所有的權值都非負,則所有可能的可行解都可表示成無向圖的一組生成樹,而最優解是其中具有最小代價的生成樹。

在這個問題中,需要選擇乙個無向圖中的邊集合的子集,這個子集必須滿足如下限制條件:所有的邊構成乙個生成樹。而優化函式是子集中所有邊的權值之和。

**自沙大工作室

第1章 導言

本章作為整個c語言學習的框架 1.1 入門 轉義字元 n只代表乙個字元。轉義字元為表示無法輸入的字元或不可見的字元提供一種通用可擴充的機制。t 製表符,b 回退符,雙引號,反斜槓符本身。要將它們列印出來,則在斜槓前再加 前加 1.2 變數與算術表示式 1 c語言中,所有變數都必須在函式起始處先宣告,...

第1章 起點

第1章起點 寫乙個最最簡單的程式 hello world。print hello world 假定你把上面這句儲存在 hello.lua 檔案中,你在命令列只需要 prompt lua hello.lua 看到結果了嗎?讓我們來看乙個稍微複雜點的例子 defines a factorial func...

第1章 簡介

桉樹企業版 ee 2.0是乙個基於linux體系架構,對企業資源 硬體 儲存 網路 統一管理的雲平台。桉樹雲是iaas層面的雲平台,對基礎裝置進行管理和擴充套件,為企業提供私有雲 可以部署在企業的防火牆之內,僅供企業內部使用,確保資料的安全性 和混合雲部署方案。桉樹在設計之初就考慮了易用性 模組化和...