在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解(是否是全域性最優,需要證明)。
問題:有一天海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件都價值連城,一旦打碎就是去了價值,海盜船載重量為c,每件固定的重量為wi,海盜們該如何盡可能裝載最多數量的古董呢?
解決思路:
古董的種量清單:
船載重量固定為c,只要每次選擇重量最小的古董,直到不能再裝為止,這樣裝載的古董數量最大, 這就是貪心策略;
把古董按重量從小到大排序,根據策略選出盡可能多的古董。
# 定義每個古董的重量
antique =[4
,10,7
,11,3
,5,14
,2]def
max_ans
(antique)
:# 對重量進行排序
anti_sort =
sorted
(antique)
# ans記錄裝載古董數量, tmp記錄裝載古董重量
ans, tmp =0,
0# 記錄裝載的古董
ship =
for anti in anti_sort:
tmp += anti
if tmp <30:
ans +=
1print
('裝載古董的數量:'
, ans)
print
('裝載的古董:'
, ship)
max_ans(antique)
問題描述:假設山洞中有n種寶物,每種寶物有一定重量w和相應的價值v,毛驢運載能力一種寶物只能拿一樣,寶物可分割。怎樣才能使毛驢運走寶物的價值最大呢?
問題分析:
可以嘗試三種貪心策略:
每次挑選價值最大的裝東西入揹包;
每次挑選最重的東西;
每次選取單位重量價值最大的東西。
演算法設計:
計算出每件寶物的價效比,按照從高到低排序;
根據貪心策略,按價效比從大到小選取寶物,直到達到毛驢的運載能力。每次選擇寶物後判斷是否小於m,如果不小於則取走寶物的一部分,程式結束。
# datas中的每個元素代表乙個古董,每乙個列表第乙個元素代表古董重量,第二個元素代表古董的價值
datas =[[
4,3]
,[2,
8],[
9,18]
,[5,
6],[
5,8]
,[8,
20],[
5,5]
,[4,
6],[
5,7]
,[5,
15]]m =
30# 毛驢運載能力
w =0
# 獲取的總價值
# 計算每件寶物的價效比,從高到底進行排序
for i in
range
(len
(datas)):
price = datas[i][1
]/ datas[i][0
]# 列表中新增價效比元素
datas[i]
datas.sort(key=
lambda data: data[2]
, reverse=
true
)# 從高到低
# 按照價效比從小到大進行選取寶物,直到達到毛驢的運載能力
for data in datas:
if data[0]
< m:
w += data[1]
m -= data[0]
else
: w += data[2]
* m break
print
('總價值:'
, w)
深入思考:想一下如果寶物不可分割,貪心演算法得到的是否是最優解?注意: 物品可分割的裝載問題稱為揹包問題,不可分割問題的裝載問題稱為0-1揹包問題。0-1揹包問題不具有貪心選擇性質,貪心演算法不能得到全域性最優解,僅僅是最優解的近似解。0-1揹包問題可用動態規劃演算法求解。 python 貪心演算法的實現
貪心演算法 貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的...
Python實現貪心演算法的示例
今天乙個研究生同學問我乙個問題,問題如下 超市有m個顧客要結賬,每個顧客結賬的時間為ti i取值從1到m 超市有n個結賬出口,請問全部顧客怎麼選擇出口,可以最早完成全部顧客的結賬,並用 實現。其實利用的就是貪心演算法來解決這個問題,那麼,什麼是貪心演算法?怎麼用貪心演算法解決這個問題?讓我一一道來。...
MATLAB實現貪心演算法
在這裡是為了實現 用貪心演算法模擬出隨機產生的20個點間的最短路徑。蟻群演算法實現,有興趣可以對比一下 matlab實現蟻群演算法 n 20 用於記錄點數 x zeros 1,n 產生乙個與經過點數相同的行向量 y zeros 1,n best 1 1 n 生成乙個用來儲存點順序的矩陣 handle...