1、贪心算法

    贪心算法问题:

        活动安排:

 
            见《算法导论》一书P238.对于活动的安排问题理解:
.由知Aij表示在活动i的开始后,活动j结束前的活动安排。则由知
Aij=Aik+ak+Akj.由知
    Aik表示在活动i结束后,活动k开始前的活动数。
    Akj表示在活动k结束后,活动j开始前的活动数。
因此不包含活动 ak
  • 最早结束活动算法。
  1. /*
  2. 入口参数:
  3. k:第k个活动
  4. len:总的活动
  5. start_time:活动的开始时间
  6. end_time:活动的结束时间
  7. 注释:
  8. 本方法采用贪心算法解决活动安排的问题,有两张表分别表示活动的开始时间和结束时间。
  9. 于是每次都判断活动k是否合适。于是只有当活动m的开始时间大于活动k的结束时间时才
  10. 是合适的。
  11. */
  12. void dynamicPlan(int k,int len,int*start_time,int*end_time){
  13. int m=k+1;
  14. while(m<=len&&start_time[m]<end_time[k]){
  15. m++;
  16. }
  17. if(m<=len){
  18. std::cout<<m<<std::endl;
  19. std::cout<<start_time[m]<<std::endl;
  20. std::cout<<end_time[m]<<std::endl;
  21. std::cout<<std::endl;
  22. dynamicPlan(m,len,start_time,end_time);
  23. }
  24. }
 
  1. int start_time[11]={1,3,0,5,3,5,6,8,8,2,12};
  2. int end_time[11]={4,5,6,7,9,9,10,11,12,14,16};
 
这是一个简单的数据集。其中Si表示活动的开始时间,fi,表示的是活动的结束时间。但是注意fi是经过排序处理的,否则将出现如下情况。
如其中有某一活动开始时间为3但是结束时间为11。则明显是不行的。因为在上面的算法中,总是优先执行开始时间较早的那个活动。因此在
计算前务必对结束时间进行排序。这样。总是那些时间短的优先在前面进行选择。
  • 最晚开始活动的算法
    1. void dynamicPlan_endtime(int k,int len,int*start_time,int*end_time){
    2. int m=k+1;
    3. while(m<=len&&end_time[m]>start_time[k]){
    4. m++;
    5. }
    6. if(m<=len){
    7. std::cout<<m+1<<std::endl;
    8. std::cout<<"start time->"<<start_time[m]<<std::endl;
    9. std::cout<<" end time->"<<end_time[m]<<std::endl;
    10. dynamicPlan_endtime(m,len,start_time,end_time);
    11. }
    12. }
    如上图代码部分,按最晚开始活动的时间算法进行。
    1. int start_time_1[11]={12,8,8,6,5,5,3,3,2,1,0};
    2. int end_time_1[11]={16,14,11,10,7,9,9,5,12,4,6};
    最晚开始活动的一种贪心算法。在上述数组中,己经对活动进行了排序,排序的规则是按活动开始顺序,活动开始晚的排在前面,开始早的排在后面。
    这就后办了,你从后面往前面走。因为是按活动的结束时间进行排序,因此,我们相当于对活动的时间长度进行了考虑,想一下,有个活动它开始得早,但是
    却结束得晚,只要一选中它,则其它的活动就没得选了。因此,在按活动进行排序是必要的。每次取当前活动的开始时间与另上一些活动的结束时间进行比较
    。由于开始时间是进行排过序的。则知开始时间晚的一般来说活动时间不长。然后另外的活动由于是按开始时间从晚到早的排序,则在它向后滑时,它的开始时间晚,结束时间也早。那么它是理想的选择。

算法对“贪心”的体现

           由知在“最早结束”的算法中,由于我们是首先对活动的结束时间进行了一次排序,由早到晚,因此,我们在后面的选择的时候
总是优先选择结束时间早的(由于我们是对数组从前往后移),但是同时它的起始时间是大于当前我们活动的结束时间。因此它的活动、
       时间长度相对来说是最短的,也就是局部最优解。
         同理,对“最晚开始”的算法中。我们首先以活动的开始时间按大到小的顺序进行排序。然后从活动后往前开始。优先取活动开始时
       间最晚的。同时我们所选活动的开始时间应该是小于当前活动的结束时间的。则其活动长度相对来说是最优的。因此。贪心地洗择活动
        时间较短的活动。、
 
 
 
 
 





posted @ 2015-07-17 20:02  yml435  阅读(248)  评论(0编辑  收藏  举报