贪心算法求解活动选择问题

问题描述:

   有一个需要使用每个资源的n个活动组成的集合S= {a1,a2,···,an },资源每次只能由一个活动使用。每个活动a都有一个开始时间和结束时间,且 0<= s < f
。一旦被选择后,活动a就占据半开时间区间[s,f]。如果[si,fi]和[sj,fj]互不重叠,则称两个ai,aj活动是兼容的。该问题就是要找出一个由互相兼容的活动组成的最大子集.假设输入的活动集合S已经按照结束时间的单调递增顺寻进行了排序.









































i 1 2 3 4 5 6 7 8 9 10 11
si 1 3 0 5 3 5 6 8 8 2 12
fi 4 5 6 7 8 9 10 11 12 13 14

求解思路:

  贪心算法的主要思想就是对问题求解时,总是做出在当前看来是最好的选择,产生一个局部最优解。

  在活动选择问题中,每次的贪心解就是选择Sij结束时间最早的活动,这样就给后面的活动留下了目前看来最多的时间。假设活动已经按照结束时间递增的顺序进行排序,那么我们只需要遍历一次所有活动就可以得到最大兼容活动子集了。

  


/*************************************************************************
> File Name: Activity_selector.c
> Author: He Xingjie
> Mail: [email protected]
> Created Time: 2014年05月28日 星期三 21时27分14秒
> Description: 基于贪心算法的活动选择
************************************************************************/
#include<stdio.h>

#define MAX 11

int s[MAX] = {1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
int f[MAX] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};

void GreedyActivitySelector(int st, int fi)
{
int m, i;

i = st;
printf("a%d ", i+1);

for (m=i+1; m < fi; m++)
{
if (s[m] >= f[i])
{
printf("a%d ", m+1);
i = m;
}
}

printf("\n");
}

int main()
{
GreedyActivitySelector(0, MAX);

return 0;
}

参考:

http://blog.163.com/computer_freshman/blog/static/201131246201221105139572/

时间: 2024-10-25 02:58:52

贪心算法求解活动选择问题的相关文章

【算法导论】贪心算法之活动选择问题

动态规划总是在追求全局最优的解,但是有时候,这样有点费时.贪心算法,在求解过程中,并不追求全局最优解,而是追求每一步的最优,所以贪心算法也不保证一定能够获得全局最优解,但是贪心算法在很多问题却额可以求得最优解. 一.问题概述 活动选择问题: 假定一个有n个活动(activity)的集合S={a1,a2,....,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用.每个活动ai都有一个开始时间si和一个结束时间fi,其中0<=si<fi<正无穷.如

算法导论贪心算法之活动选择

活动选择问题的递归调用算法 #include<iostream> using namespace std; #define N 11 struct node{ int id; int satrt; int end; }A[N+1]; void recursive_activity_seclect(int k,int n) { int m=k+1; while(m<=n&&A[m].satrt<A[k].end) m=m+1; if(m<=n) { cout&l

贪心算法之活动选择问题--求解现实问题的思路

参考<算法导论第二版P222页) 一,如何把现实的问题转变成数学问题?即数学建模的思路? 1,问题描述:现有一组相互竞争的活动,如何调度能够找出一组最大的活动(活动数目最多)使得它们相互兼容? 2,问题转化: 首先,按活动的结束时间单调递增进行排序.那么,为什么要按结束时间排序呢?这个问题留到后面解释. 其次,定义合适的问题子空间,即定义集合S(i,j).问题子空间描述的是现实生活中的问题,而集合S(i,j)则是数学概念,通过某种方式定义一个合适的集合将问题子空间的解转化为集合的解(即求出集合中

贪心算法之活动选择问题

import java.util.ArrayList; import java.util.List; public class ActiveSelector { private int[] s= {0,1,3,0,5,3,5,6,8,8,2,12}; //a0 a1..a11活动开始时间数组 private int[] f = {0,4,5,6,7,9,9,10,11,12,14,16}; //a0 a1..a11活动结束时间数组 List<Activity> ls = new ArrayLi

贪心算法之活动分配问题

贪心算法之活动分配问题 在此之前,我们还讨论过贪心算法的活动选择问题,活动选择问题里面的选择策略在这篇文章里面作为贪心选择策略用到.好吧,让我们进入主题. 问题描述 有一个活动集合S={a1,a2,a3,...an},每一个活动ai都有一个开始时间si和结束时间fi,那么活动ai占用的时间段为[si,fi).如果活动ai和aj的时间段没有交集重叠,那么这两个活动是兼容的,即满足si≤fj或者fi≥sj,[ai,aj]就是兼容的.现在我们需要为这些活动安排教室,保证活动之间各不冲突.请问怎么安排才

基于贪心算法求解TSP问题(JAVA)

前段时间在搞贪心算法,为了举例,故拿TSP来开刀,写了段求解算法代码以便有需之人,注意代码考虑可读性从最容易理解角度写,没有优化,有需要可以自行优化! 一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值. TSP问题

贪心算法解决加油站选择问题(未解决)

//贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include<algorithm> struct Node { float p, d; }; bool cmp(Node a, Node b) { return a.d < b.d; } int main() { Node node[501]; float Cmax, D, Davg, distance,

贪心算法求解汽车加油问题

试用贪心算法求解汽车加油问题: 已知一辆汽车加满油后可行驶n公里,而旅途中有若干个加油站.试设计一个有效算法,指出应在哪些加油站停靠加油,使加油次数最少,请写出该算法: 1 int greedy(vecter<int>x,int n)//定义一个int类型的向量x 2 { 3 int sum=0,k=x.size();//求k为x的长度 4 for(int j=0;j<k;j++) 5 { 6 if(x[j]>n) //加一次油最多行驶n公里,超过的话油不够使,车停在半路上了. 7

[C++] 贪心算法之活动安排、背包问题

一.贪心算法的基本思想 在求解过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解. 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一. 二.贪心算法的基本要素 (1)最优子结构性质 (2)贪心选择性质(局部最优选择) 三.贪心算法实例 1.活动安排 设有n个活