貪心演算法最難的部分就是正確性的證明,常用的方法有歸納法(對演算法步數歸納、對問題歸納)和交換論證法(從最優解出發,不變壞地替換,得到貪心策略的解)。下面以三個例子說明這些正確性證法。
活動選擇問題——對演算法步數歸納
最優裝載問題——對問題規模歸納
最小延遲排程——交換論證 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...