五大常用算法之三:貪心算法

一、基本概念:

所謂貪心算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。

貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無后效性,即某個狀態以后的過程不會影響以前的狀態,只與當前狀態有關。

所以對所采用的貪心策略一定要仔細分析其是否滿足無后效性。

二、貪心算法的基本思路:

1.建立數學模型來描述問題。
2.把求解的問題分成若干個子問題。
3.對每一子問題求解,得到子問題的局部最優解。
4.把子問題的解局部最優解合成原來解問題的一個解。

三、貪心算法適用的問題

貪心策略適用的前提是:局部最優策略能導致產生全局最優解。

實際上,貪心算法適用的情況很少。一般,對一個問題分析是否適用于貪心算法,可以先選擇該問題下的幾個實際數據進行分析,就可做出判斷。

四、貪心算法的實現框架

從問題的某一初始解出發;

while (能朝給定總目標前進一步)
{
利用可行的決策,求出可行解的一個解元素;
}

由所有解元素組合成問題的一個可行解;

五、貪心策略的選擇

因為用貪心算法只能通過解局部最優解的策略來達到全局最優解,因此,一定要注意判斷問題是否適合采用貪心算法策略,找到的解是否一定是問題的最優解。

六、例題分析

下面是一個可以試用貪心算法解的題目,貪心解的確不錯,可惜不是最優解。

[背包問題]有一個背包,背包容量是M=150。有7個物品,物品可以分割成任意大小。
要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。

物品 A B C D E F G
重量 35 30 60 50 40 10 25
價值 10 40 30 50 35 40 30
分析:
目標函數: ∑pi最大
約束條件是裝入的物品總重量不超過背包容量:∑wi<=M( M=150)
(1)根據貪心的策略,每次挑選價值最大的物品裝入背包,得到的結果是否最優?
(2)每次挑選所占重量最小的物品裝入是否能得到最優解?
(3)每次選取單位重量價值最大的物品,成為解本題的策略。

值得注意的是,貪心算法并不是完全不可以使用,貪心策略一旦經過證明成立后,它就是一種高效的算法。
貪心算法還是很常見的算法之一,這是由于它簡單易行,構造貪心策略不是很困難。
可惜的是,它需要證明后才能真正運用到題目的算法中。

一般來說,貪心算法的證明圍繞著:整個問題的最優解一定由在貪心策略中存在的子問題的最優解得來的。
對于例題中的3種貪心策略,都是無法成立(無法被證明)的,解釋如下:

(1)貪心策略:選取價值最大者。反例:
W=30
物品:A B C
重量:28 12 12
價值:30 20 20
根據策略,首先選取物品A,接下來就無法再選取了,可是,選取B、C則更好。
(2)貪心策略:選取重量最小。它的反例與第一種策略的反例差不多。
(3)貪心策略:選取單位重量價值最大的物品。反例:
W=30
物品:A B C
重量:28 20 10
價值:28 20 10

根據策略,三種物品單位重量價值一樣,程序無法依據現有策略作出判斷,如果選擇A,則答案錯誤。

轉載于:https://www.cnblogs.com/jianhck/p/4274210.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257655.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python學習筆記列表和元組(三)

列表&#xff08;list&#xff09;是Python以及其他語言中最常用到的數據結構之一。Python使用使用中括號 [ ] 來解析列表。列表是可變的&#xff08;mutable&#xff09;——可以改變列表的內容。對應操作&#xff1a;1、查&#xff08;[]切片操作&#xff09; name [tom,張三…

python 函數的調用的時候參數的傳遞_Python Unittest;如何獲取調用函數時傳遞的參數?...

我試圖做一個單元測試來檢查這個python函數(dispatch)是否傳遞了正確的參數來處理\u結果。在在dispatch中調用處理“unu result”的函數時&#xff0c;有沒有方法“劫持”輸入參數&#xff1f;我沒有在調度函數中修改代碼的權限。在以下是單元測試中的want預覽&#xff1a;impo…

博客園客戶端UAP開發隨筆 -- App連接云端內容的橋梁:WebView

當你辛苦的從網上爬下來一篇文章之后&#xff0c;怎么在你的應用內展示這些包含HTML標記的文章&#xff1f;如果你使用的是Javascript開發應用&#xff0c;恭喜你&#xff0c;直接塞進頁面就可以了&#xff0c;同時說明你很熟悉頁面開發&#xff0c;而現在windows也支持這種方式…

listview與gridview點擊時的背景色取消

在布局文件里面的listview控件添加以下代碼android:listSelector"#00000000" //透明色 可以自己選擇點擊顏色轉載于:https://www.cnblogs.com/yulook/p/5219932.html

解決yum命令失效,vim: command not found

安裝python3模塊時&#xff0c;yum命令無法執行錯誤:**/usr/bin/yum: line 3: import: command not found/usr/bin/yum: line 4: try:: command not found/usr/bin/yum: line 5: import: command not found/usr/bin/yum: line 6: except: command not found/usr/bin/yum: line …

C4.5

C4.5是機器學習算法中的另一個分類決策樹算法&#xff0c;它是基于ID3算法進行改進后的一種重要算法&#xff0c;相比于ID3算法&#xff0c;改進有如下幾個要點&#xff1a; 用信息增益率來選擇屬性。ID3選擇屬性用的是子樹的信息增益&#xff0c;這里可以用很多方法來定義信息…

(周日賽)Sort the Array

題意&#xff1a;一段數字&#xff0c;逆置其中兩個使其遞增 DescriptionBeing a programmer, you like arrays a lot. For your birthday, your friends have given you an array a consisting of ndistinct integers. Unfortunately, the size of a is too small. You want a…

jqgrid學習(三)

1.修改jqgrid自帶的行編輯按鈕樣式 //jqgrid默認的行編輯樣式 {name : ,index : ,width : 70,fixed : true,sortable : false,resize : false,formatter : actions,},//修改每行的編輯按鈕圖標為目標樣式//當表格中數據加載完畢后&#xff0c;執行此方法 loadComplete : functi…

事件Event對象

事件event對象 當事件發生時&#xff0c;會向調用函數傳遞一個event對象&#xff0c;event對象記錄當前事件發生時的環境信息。 一個事件只能對應一個event對象&#xff0c;并且event對象是短暫存在的。 DOM中的event對象的使用方法 1、在HTML標記中&#xff0c;通過事件來調用…

解決mac osx下pip安裝ipython權限的問題

1pip install ipython --user -U下面是pip install gevent的錯誤提示&#xff0c; 又是 Operation not permitted … 12345#xiaorui.ccpip install gevent...raise Error, errorsError: [(/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_marker…

談談分布式事務之三: System.Transactions事務詳解[下篇]

在前面一篇給出的Transaction的定義中&#xff0c;信息的讀者應該看到了一個叫做DepedentClone的方法。該方法對用于創建基于現有Transaction對 象的“依賴事務&#xff08;DependentTransaction&#xff09;”。不像可提交事務是一個獨立的事務對象&#xff0c;依賴事務依附于…

HDU——2444 The Accomodation of Students

The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)                    Total Submission(s): 7086 Accepted Submission(s): 3167 Problem DescriptionThere are a group of studen…

iOS開發系列--觸摸事件、手勢識別、搖晃事件、耳機線控

-- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點觸摸的強大功能&#xff0c;喬布斯讓人們認識到手機其實是可以不用按鍵和手寫筆直接操作的&#xff0c;這不愧為一項偉大的設計。今天我們就針對iOS的觸摸事件&#xff08;手勢操作&#xff09;、運動事件、遠程控制…

關于Hyper-V備份的四大注意事項

盡管Hyper-V備份相對簡單&#xff0c;但備份管理員仍需注意四大問題。這四方面的問題在創建備份時可能不太重要&#xff0c;但在備份恢復時影響甚大。 1、對于虛擬機來說不僅意味著虛擬磁盤 就目前來看&#xff0c;企業在執行Hyper-V備份時最常見的誤區就是把虛擬機當做物理服務…

python為什么忽然火了_為什么Python突然就火了起來了呢?

近日&#xff0c;TIOBE發布10月編程語言排行榜顯示&#xff0c;15年來TIOBE指數的前8名一直保持不變&#xff0c;而Python正在成為一種新的大型語言。越來越多的企業在使用Python進行開發&#xff0c;越來越多的人正在加入Python程序員行列!TIOBE 10月編程語言排行榜前20名Pyth…

SQL 2005 全文索引

全文索引技術是目前搜索引擎的關鍵技術。 試想在1M大小的文件中搜索一個詞&#xff0c;可能需要幾秒&#xff0c;在100M的文件中可能需要幾十秒&#xff0c;如果在更大的文件中搜索那么就需要更大的系統開銷&#xff0c;這樣的開銷是不現實的。 所以在這樣的矛盾下出現了全文索…

python重命名窗口_Python:即時重命名方法名稱

如果要繼續在已切換到使用屬性的對象上使用get_Field和set_Field(您只需訪問或分配給Field),則可以使用包裝器對象&#xff1a;class NoPropertyAdaptor(object):def __init__(self, obj):self.obj objdef __getattr__(self, name):if name.startswith("get_"):retu…

nginx優化之請求直接返回json數據

對于有些服務端接口返回是固定值的json&#xff0c;可通過配置nginx直接返回json&#xff0c;減少程序的加載對資源的占用&#xff0c;減少接口響應時間 location ~* (request/update)$ { default_type application/json; return 200 {"update":"no&quo…

ARP掃描工具arp-scan

2019獨角獸企業重金招聘Python工程師標準>>> ARP掃描工具arp-scan arp-scan是Kali Linux自帶的一款ARP掃描工具。該工具可以進行單一目標掃描&#xff0c;也可以進行批量掃描。批量掃描的時候&#xff0c;用戶可以通過CIDR、地址范圍或者列表文件的方式指定。該工具…

數據庫索引的作用和優點缺點

為什么要創建索引呢&#xff1f;這是因為&#xff0c;創建索引可以大大提高系統的性能。 第一&#xff0c;通過創建唯一性索引&#xff0c;可以保證數據庫表中每一行數據的唯一性。 第二&#xff0c;可以大大加快 數據的檢索速度&#xff0c;這也是創建索引的最主要的原因。 第…