python實現貪心演算法

2021-10-07 09:36:24 字數 2304 閱讀 3185

在對問題求解時,總是作出在當前看來是最好的選擇。也就是說,不從整體上加以考慮,它所作出的僅僅是在某種意義上的區域性最優解(是否是全域性最優,需要證明)。

問題:有一天海盜們截獲了一艘裝滿各種各樣古董的貨船,每一件都價值連城,一旦打碎就是去了價值,海盜船載重量為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...