会场安排问题(贪心算法):
贪心算法:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
2.相关代码:
#include<stdio.h>
#define M 11
#define MAX 2000
void select(int num,int s[],int f[]){
int preStart=0;
int preFinal=MAX;//保证是无限大即可
int i;
int temp;
int OK=1;
int sel[M];//用来储存相容的活动编号
int selNum=0;
while(OK){
OK=0;
for(i=0;i<M;i++){
if(f[i]<preFinal&&s[i]>=preStart){//寻找开始时间合适地情况下结束时间最早者
preFinal=f[i];
temp=i;
OK=1;
printf("%d-------------->%d\n",s[i],f[i]);
}
}
if(preFinal!=MAX){ //变量的重新赋值
sel[selNum++]=temp;
preStart=f[temp];
preFinal=MAX;
}
}
printf("%d",selNum);//相容数量
}
int main(){
int s[]={1,3,0,5,3,5,6,8,8,2,12};
int f[]={4,5,6,7,8,9,10,11,12,13,14};
select(M,s,f);
}
3.问题解决思路:
把会场要安排的所有活动作为一个集合W,初始开始时间标准为preStart,初始结束时间标准为preFinal.每次放入W的活动要在满足,开始时间s[i]>preStart的前提下f[i]最小。然后把f[i]赋值给preStart. 依次加入,直到加不进去为止。从而把问题解决。
4.为什么贪心算法可以得到最优解?
贪心算法并不是针对任何一个问题都存在最优解,但是针对会场安排问题可以得到最优解。我们可以从贪心算法得到的结果集仅进行倒推。首先去掉结果集中的第一个活动A,那么在剩下的活动中,结束时间最早的活动B的结束时间一定不早于A,那么A活动在最优解中一定合理。再用同样的方式判断活动B,依次类推,则结果集就是最优解。