演算法 活動選擇問題

2021-06-21 12:59:20 字數 3968 閱讀 4690

#encoding=utf-8

import sys

def greedy_activity(activity,begin,end):

activity_list=

temp_end_time=activity[begin][1]#獲取最小的結束時間

if begin==end:

return activity_list

for index in xrange(begin,end+1):

if activity[index][0]>temp_end_time:

temp_end_time=activity[index][1]

return activity_list

def greedy_act(activity):

return greedy_activity(activity,0,len(activity)-2)

def dynamic_activity_selector(activity,count_list,best_res):

numofactivity=len(activity)

for start in xrange(0,numofactivity-1):

for end in xrange(start+1,numofactivity):

for tempindex in xrange(start+1,end+1):

if activity[tempindex][0]>=activity[start][1] and activity[tempindex][1]<=activity[end][0]:

print start,end,tempindex

tempcount=count_list[start][tempindex]+count_list[tempindex+1][end]+1

if tempcount>count_list[start][end]:

count_list[start][end]=tempcount

if __name__=="__main__":

timestart = [-1,1,3,0,5,3,5,6,8,8,2,12,sys.maxint]

timefinal= [-1,4,5,6,7,8,9,10,11,12,13,14,sys.maxint]

num=len(timefinal)

timeactivity=[ (timestart[index],timefinal[index]) for index in xrange(num) ]

timeactivity.sort( key=lambda x:x[1])

count_list=[[ 0 for col in xrange(num)] for row in xrange(num) ]

best_res=[[ for col in xrange(num)] for row in xrange(num) ]

#ac_list=greedy_act(timeactivity)

dynamic_activity_selector(timeactivity,count_list,best_res)

#print ac_list

print best_res[0][num-2]

不過,還是有些問題。。不知道錯在**了。。

執行的結果如下:

不知道怎麼會越界了呢?真奇怪。。

問題找到了

tempindex的範圍是[0,12]

當tempindex=12的時候,count_list[tempindex+1][end]指向的是count_list[13][12]所以越界了。但是怎麼解決呢。。

解決的辦法:我就把tempindex的範圍限定為(start+1,min(end+1,numofactivity-1));

所以就沒有報越界錯誤了,但是,還有乙個問題就是

我在輸出

print best_res[0][num-2]

得到的結果是 [1,4,8]而不是[1,4,8,11]這怎麼辦呢?這個該怎麼解決呢?哦,知道了

不是輸出 best_res[0][num-2]而是best_res[0][num-1]

如果想求[begin,end]的的最大活動的話,

那麼呼叫 best_res[begin-1,end+1]

最終的源**為:

#encoding=utf-8

import sys

def greedy_activity(activity,begin,end):

activity_list=

temp_end_time=activity[begin][1]#獲取最小的結束時間

if begin==end:

return activity_list

for index in xrange(begin,end+1):

if activity[index][0]>temp_end_time:

temp_end_time=activity[index][1]

return activity_list

def greedy_act(activity):

return greedy_activity(activity,0,len(activity)-2)

def dynamic_activity_selector(activity,count_list,best_res):

numofactivity=len(activity)

for start in xrange(0,numofactivity-1):

for end in xrange(start+1,numofactivity):

for tempindex in xrange(start+1,min(end+1,numofactivity-1)):

if activity[tempindex][0]>=activity[start][1] and activity[tempindex][1]<=activity[end][0]:

#print start,end,tempindex

tempcount=count_list[start][tempindex]+count_list[tempindex+1][end]+1

if tempcount>count_list[start][end]:

count_list[start][end]=tempcount

if __name__=="__main__":

timestart = [-1,1,3,0,5,3,5,6,8,8,2,12,sys.maxint]

timefinal= [-1,4,5,6,7,8,9,10,11,12,13,14,sys.maxint]

num=len(timefinal)

timeactivity=[ (timestart[index],timefinal[index]) for index in xrange(num) ]

timeactivity.sort( key=lambda x:x[1])

count_list=[[ 0 for col in xrange(num)] for row in xrange(num) ]

best_res=[[ for col in xrange(num)] for row in xrange(num) ]

#ac_list=greedy_act(timeactivity)

dynamic_activity_selector(timeactivity,count_list,best_res)

#print ac_list

print best_res[0][num-1]

輸出結果為:

貪心演算法 活動選擇問題

活動選擇問題 就是給定一組活動的開始時間和結束時間,然後他們都需要使用到乙個資源,這個資源每次只有乙個活動可以用,要求求出乙個最大的相互相容的活動子集。首先定義了乙個集合sij 其中s就是所有活動的集合,fi是活動ai的完成時間si是活動ai的開始時間。這道題如果是用dp來解的話,就需要找到最優解的...

貪心演算法 活動選擇問題

前言 貪心演算法也是用來解決最優化問題,將乙個問題分成子問題,在現在子問題最優解的時,選擇當前看起來是最優的解,期望通過所做的區域性最優選擇來產生乙個全域性最優解。書中先從活動選擇問題來引入貪心演算法,分別採用動態規劃方法和貪心演算法進行分析。本篇筆記給出活動選擇問題的詳細分析過程,並給出詳細的實現...

貪心演算法 活動選擇問題

需要閱讀這篇 的同學應該都知道貪心演算法的定義吧,所以這裡就不贅述什麼叫貪心演算法了。如果確實不知道什麼是貪心演算法,可以去看一下 演算法導論 問度娘也是挺好的。下面簡述一下活動選擇問題 你是乙個場地管理員,你收到的很多的活動申請,每個活動的開始時間和結束時間會有交錯,也就是說有些活動不能同時舉辦,...