貪心演算法簡介:
貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。
貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。
基本思路
思想 貪心演算法的基本思路是從問題的某乙個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解。每一步只考慮乙個資料,他的選取應該滿足區域性優化的條件。若下乙個資料和部分最優解連在一起不再是可行解時,就不把該資料新增到部分解中,直到把所有資料列舉完,或者不能再新增演算法停止 。
過程
演算法特性編輯
貪婪演算法可解決的問題通常大部分都有如下的特性:
隨著演算法的進行,將積累起其它兩個集合:乙個包含已經被考慮過並被選出的候選物件,另乙個包含已經被考慮過但被丟棄的候選物件。
有乙個函式來檢查乙個候選物件的集合是否提供了問題的解答。該函式不考慮此時的解決方法是否最優。
還有乙個函式檢查是否乙個候選物件的集合是可行的,也即是否可能往該集合上新增更多的候選物件以獲得乙個解。和上乙個函式一樣,此時不考慮解決方法的最優性。
選擇函式可以指出哪乙個剩餘的候選物件最有希望構成問題的解。
最後,目標函式給出解的值。
為了解決問題,需要尋找乙個構成解的候選物件集合,它可以優化目標函式,貪婪演算法一步一步的進行。起初,演算法選出的候選物件的集合為空。接下來的每一步中,根據選擇函式,演算法從剩餘候選物件中選出最有希望構成解的物件。如果集合中加上該物件後不可行,那麼該物件就被丟棄並不再考慮;否則就加到集合裡。每一次都擴充集合,並檢查該集合是否構成解。如果貪婪演算法正確工作,那麼找到的第乙個解通常是最優的
舉個栗子:
還是上篇文中的 活動時間問題:
想要使用貪心演算法的話,得先找到適合貪心演算法的規律(區域性最優選擇)
對於任何非空的活動集合s,假如am是s中結束時間最早的活動,則am一定在s的某個最大相容活動子集中。
**實現:
using system;
namespace _5_1_1貪心演算法_活動選擇問題
console.readkey();
}//活動開始時間s,結束時間f
static
int s = ;
static
int f = ;
//引數:開始/結束的活動個數,開始/結束活動的時間
public
static list activity(int startnumber, int endnumber,int starttime,int endtime )
}//找剩下的時間中結束時間最早的活動
list list = activity(temp + 1, endnumber, f[temp], endtime);
list.add(temp);
return
list;}}
}
迭代法更符合上面貪心演算法的文字描述,,,
**如下:
using system;
namespace _5_1_2貪心演算法_活動選擇問題_迭代
; int f = ;
//開始結束活動的時間
int starttime = 0;
int enstime = 24;
//儲存最大活動個數的列表
list list = new list();
//從第乙個活動到最後乙個活動
for (int i = 1; i <= 11; i++)
}foreach (int item in list)
console.readkey();}}
}
活動安排問題 貪心演算法
問題表述 設有n個活動的集合 e 其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有乙個活動能使用這一資源。每個活 i都有乙個要求使用該資源的起始時間 si和乙個結束時間 fi,且 si 如果選擇了活動 i,則它在半開時間區間 si,fi 內占用資源。若區間 si,fi 與區間 sj,...
活動安排問題(貪心演算法)
類似的問題是 選點問題和區間覆蓋問題。活動安排問題就是要在所給的活動集合中選出最大的相容活動子集合,是可以用貪心演算法有效求解的很好例子。該問題要求高效地安排一系列爭用某一公共資源的活動。貪心演算法提供了乙個簡單 漂亮的方法使得盡可能多的活動能相容地使用公共資源。設有n個活動的集合e 其中每個活動都...
貪心演算法 活動選擇問題
活動選擇問題 就是給定一組活動的開始時間和結束時間,然後他們都需要使用到乙個資源,這個資源每次只有乙個活動可以用,要求求出乙個最大的相互相容的活動子集。首先定義了乙個集合sij 其中s就是所有活動的集合,fi是活動ai的完成時間si是活動ai的開始時間。這道題如果是用dp來解的話,就需要找到最優解的...