貪心演算法的正確性證明

2021-09-12 16:01:45 字數 3044 閱讀 1837

貪心演算法最難的部分就是正確性的證明,常用的方法有歸納法(對演算法步數歸納、對問題歸納)和交換論證法(從最優解出發,不變壞地替換,得到貪心策略的解)。下面以三個例子說明這些正確性證法。

活動選擇問題——對演算法步數歸納

最優裝載問題——對問題規模歸納

最小延遲排程——交換論證 s

=s = \

s=為n項活動的集合,si和

fis_i和f_i

si​和fi

​分別為活動i的開始和結束時間,活動i與j相容當且僅當si≥

fj或s

j>=f

is_i \geq f_j或s_j>=f_i

si​≥fj

​或sj

​>=f

i​,求最大的活動集

按截止時間排序

偽**:

定理:演算法select執行到第k步,選擇k項活動i1=

1,i2

,…,i

ki_1=1,i_2,…,i_k

i1​=1,

i2​,

…,ik

​,那麼存在最優解a包含$ i_1=1 ,i_2,…,i_k $

只要此定理成立,演算法至多到第n步得到最優解

歸納基礎:設s

=s = \

s=是活動集,活動按截止時間遞增順序排序,k=1,證明存在最優解包含活動1

任取最優解a,a中的活動按照截止時間遞增的順序排列,如果a的第乙個活動為j,j不為1,令

a ′=

(a−)

∪a' = (a-\) ∪\

a′=(a−

)∪由於f

1<=f

j,a′

f_1 <= f_j ,a'

f1​<=f

j​,a

′ 也是最優解,而且含有1

歸納步驟:

假設命題對k為真,證明對k+1也為真

演算法執行到第k步,選擇了活動i1=

1,i2

,…,i

ki_1=1,i_2,…,i_k

i1​=1,

i2​,

…,ik

​ 根據歸納假設存在最優解a包含i1=

1,i2

,…,i

ki_1=1,i_2,…,i_k

i1​=1,

i2​,

…,ik

​ ,設最優解a包含$i_1=1,i_2,…,i_k $ ,a中剩下的活動選自集合$s』= $ ,且a=∪

ba = \ \cup b

a=∪b

,b一定是s′s'

s′的最優解

根據歸納基礎,存在$s』 $ 的最優解b含有s′s'

s′中的第乙個活動,設為ik+

1i_ik+1

​ ,且$|b』| = |b| $,於是

n個貨櫃1,2…,n裝上輪船,貨櫃i的重量為w

iw_i

wi​ ,輪船載重量限制為c

cc ,無體積限制。如何使裝上船的貨櫃最多。(假設每個貨櫃重量小於c)

將貨櫃按照從輕到重排序,輕者先裝

任務集合s,$\forall i∈s $ ,di為

截止時間

,ti為

加工時間

,均為正

整數d_i為截止時間,t_i為加工時間,均為正整數

di​為截止

時間,t

i​為加

工時間,

均為正整

數 乙個排程f:s→n,f(i)為任務i的開始時間。求最大延遲達到最小的排程,即求f 使得

按照截止時間d

id_i

di​從小到**擇任務,安排時不留空閒時間

偽**:

上述演算法的解的性質:沒有空閒時間,沒有逆序(不存在f(i

)j),d

i>dj

f(i) d_j

f(i)

j),d

i​>dj

​)命題1:所有沒有逆序、沒有空閒時間的排程具有相同的最大延遲

命題1證明:f1和

f2f_1和f_2

f1​和f2

​都沒有逆序,具有相同截止時間的任務必須被連續安排。在這些連續安排的任務中最大延遲是最後乙個任務,被延遲的時間只與已安排任務加工時間之和有關,與任務標號無關。

證明思想:從乙個沒有空閒時間的最優解出發,在不改變最優性的條件下,轉變為沒有逆序的解。

如果乙個最優排程存在逆序,那麼存在i < n使得(i,i+1構成乙個逆序)

存在逆序(i,j),j = i + 1,那麼交換i和j得到的解的逆序數減一,後面證明這個新的排程仍然最優

至多經過n(n-1)/2次交換得到乙個沒有逆序的最優排程

交換相鄰逆序任務(i,j)不影響最優性

交換i,j顯然對其他任務的延遲時間沒有影響

交換後不增加j的延遲

任務i在f

2f_2

f2​的延遲l2i

l_l2

i​小於任務j在$f_1 $ 的延遲l1j

l_l1

j​因此小於$ f_1 $的最大延遲

貪心演算法正確性證明

貪心演算法正確性證明 wiki定義 貪心演算法 英語 greedy algorithm 又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。用大白話說...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 演算法描述 設初始時圖的所有點的集合u 把起點s放入初始集合set中 u u set set 找s經過集合set中的點,能達到的距離最短的點k k in u 將k併入set 言外之意k的前乙個點必然屬於set u u set set 由於每次引入的只有乙個點k,...

Dijkstra演算法正確性證明

問題 求圖中點1到其他各點的最短距離 策略 1.把起點1放入初始集合set中,從剩餘的點中,選取到set 此時set中只有1個點 距離最近的點,併入集合set中,2.從剩餘的點中,找經過集合set,到起點1的最短距離,將最短邊併入set集合 3.依次迴圈,直到所有的邊都併入set 變數的命名 set...