使用python进行活动选择

时间:2019-01-07 20:37:35

标签: python algorithm greedy

我正在尝试使用贪婪算法解决“活动选择”问题。我的代码对某些输入失败。我正在根据finish_time_list对活动列表进行排序。

对于以下输入,代码无法正常工作:

  

activity_list = [1、2、3、4、5、6]

     

start_time_list = [5,4,8,2,3,1]

     

finish_time_list = [13,6,16,7,7,5,4]

     

我排序的活动列表:[6、5、2、4、1、3]

def find_maximum_activities(activity_list,start_time_list, finish_time_list):

    selected =[]


    activity_tmp_list = [x for _,x in sorted(zip(finish_time_list,activity_list))]

    #the first activity is always selected
    i=0
    #print(i)
    selected.append(activity_tmp_list[i])

    #consider rest of Activities
    for j in range(1,len(activity_list)):

        if start_time_list[j]>=finish_time_list[i]:
            print(j)
            selected.append(activity_tmp_list[j])
            i=j
    return selected

activity_list=[1, 2, 3, 4, 5, 6]
start_time_list=[5, 4, 8, 2, 3, 1]
finish_time_list=[13, 6, 16, 7, 5, 4]

print("Activities:",activity_list)
print("Start time of the activities:",start_time_list)
print("Finishing time of the activities:", finish_time_list)

result=find_maximum_activities(activity_list,start_time_list, finish_time_list)
print("The maximum set of activities that can be completed:",result)
  

预期输出:[6,1]

     

实际结果:[6]

1 个答案:

答案 0 :(得分:1)

问题在于,在您的for循环中,您正在将每个开始时间与finish_time_list[i]进行比较。 i=0每次循环运行,在这种情况下,finish_time_list[0]13,这是最后一个结束,因此if将永远不会变为真。

另一个问题是,您正在检查j是否经过start_time_list,但是您从j附加了相同的activity_tmp_list,并对其进行了排序。由于已经对它进行了排序,因此活动索引不会像您想要的那样排列。

更高级的问题是,您仅将活动编号存储在selected数组中,与活动开始或结束的时间无关。在不知道有关已选择内容的信息的情况下,您无法决定是否添加其他活动。我建议您制作一个包含其标签,开始时间和结束时间的Activity类,或将selected设为2D矩阵,以便在选择第一个活动后,其外观类似于{{1 }},其中包含标签,标签的起点和终点。或至少,假设您要保留贪婪算法,只需标签和结束时间即可。

如果还有其他问题,请告诉我。