贪心算法解决活动安排问题报告

合集下载

贪心法解活动安排问题(计算机算法设计与分析)

贪心法解活动安排问题(计算机算法设计与分析)

实验报告
课程名称:算法设计与分析实验名称:贪心法解活动安排问题任课教师:专业:计算机科学与技术
班级: 20xx 级x班学号:
姓名:完成日期: 20xx年x月xx日
五、实验总结
在做本实验之前,自己看了课本上所列举的贪心法解活动安排问题的代码,代码很简单,很容易理解,于是就按课本的代码实现。

通过几个测试用例测试发现结果不对,后来发现自己忘了进行贪心法的一个前提条件,事先没有按各个活动结束时间对所有活动进行非递减排序,所以才会导致结果错误。

经过修正后,自己真正理解了贪心法解活动安排问题的原理,重新完成本次实验内容也是很顺利,在编程方面没有遇到什么困难。

实验3贪心算法(定稿)

实验3贪心算法(定稿)

实验3贪心算法(定稿)第一篇:实验3 贪心算法(定稿)《算法设计与分析》实验报告实验3贪心算法姓名学号班级实验日期实验地点一、实验目的1、掌握贪心算法的设计思想。

2、理解最小生成树的相关概念。

二、实验环境1、硬件环境 CPU:酷睿i5 内存:4GB 硬盘:1T2、软件环境操作系统:Windows10 编程环境:jdk 编程语言:Java三、实验内容:在Prim算法与Kruskal算法中任选一种求解最小生成树问题。

1、你选择的是:Prim算法2、数据结构(1)图的数据结构——图结构是研究数据元素之间的多对多的关系。

在这种结构中,任意两个元素之间可能存在关系,即结点之间的关系可以是任意的,图中任意元素之间都可能相关。

图形结构——多个对多个,如(2)树的数据结构——树结构是研究数据元素之间的一对多的关系。

在这种结构中,每个元素对下(层)可以有0个或多个元素相联系,对上(层)只有唯一的一个元素相关,数据元素之间有明显的层次关系。

树形结构——一个对多个,如3、算法伪代码 Prim(G,E,W)输入:连通图G 输出:G的最小生成树T 1.S←{1};T=∅ 2.While V-S ≠∅ do3.从V-S中选择j使得j到S中顶点的边e的权最小;T←T∪{e}4.S←S∪{j}3、算法分析时间复杂度:O(n)空间复杂度:O(n^2)4、关键代码(含注释)package Prim;import java.util.*;publicclass Main { staticintMAXCOST=Integer.MAX_VALUE;staticint Prim(intgraph[][], intn){ /* lowcost[i]记录以i为终点的边的最小权值,当lowcost[i]=0时表示终点i加入生成树 */ intlowcost[]=newint[n+1];/* mst[i]记录对应lowcost[i]的起点,当mst[i]=0时表示起点i加入生成树 */ intmst[]=newint[n+1];intmin, minid, sum = 0;/* 默认选择1号节点加入生成树,从2号节点开始初始化*/ for(inti = 2;i<= n;i++){/* 标记1号节点加入生成树 */ mst[1] = 0;/* n个节点至少需要n-1条边构成最小生成树 */ for(inti = 2;i<= n;i++){/* 找满足条件的最小权值边的节点minid */ for(intj = 2;j<= n;j++){/* 输出生成树边的信息:起点,终点,权值 */System.out.printf(“%c1, minid + 'A''A' + 1;intj = chy-'A' + 1;graph[i][j] = cost;graph[j][i] = cost;for(intj = 1;j<= n;j++){ } graph[i][j] = MAXCOST;} } System.out.println(”Total:"+cost);} }5、实验结果(1)输入(2)输出最小生成树的权值为:生成过程:(a)(b)(d)(e)(c)四、实验总结(心得体会、需要注意的问题等)这次实验,使我受益匪浅。

贪心算法(4):活动选择问题

贪心算法(4):活动选择问题

贪⼼算法(4):活动选择问题我们继续回到上⼀堂课留下的课外习题:活动选择问题。

活动选择问题是很常见的场景。

例如各个部门共享⼀个会议室,利⽤该算法能使会议室安排尽量多的会议。

【问题】给你n个活动的开始时间和结束时间,从中选择你可以参与的活动,但是同⼀时间你只能参与⼀个活动,请找出你可以参与的最多活动数。

例如:考虑下⾯3个活动a1,a2和a3, 它们{开始时间点,结束时间点}分别为:a1 {start=10,finish=20}a2 {start=12,finish=25}a3 {start=20,finish=30}贪⼼算法直接在每⼀步选择当前看来最好的选择。

在开始时,选择活动结束时间最早的那个活动,这样能够给其他活动尽可能的腾出多余的时间。

⽽后每⼀步都在剩下的活动中选取,也遵循类似的原则。

由于获取已经按照结束时间排序好,所以这⾥第⼀个选择的活动就是a0,由于a0于时间20结束,马上再找⼀个活动,只有a2可以选择,a2结束之后再也没有活动可选了。

因此得到答案:最多可以参加两个活动(a0,a2)。

算法分析和设计现在请你设计⼀种贪⼼算法解决类似活动选择问题。

我们设计下列贪⼼算法的贪⼼策略:选择其余活动中完成时间最短的下⼀个活动,并且开始时间⼤于或等于先前所选活动的结束时间。

我们可以根据他们的完成时间对活动进⾏排序,以便我们始终将下⼀个活动视为最⼩完成时间活动。

算法描述如下{k}}U{1},必定仍然是⼀个最佳解决⽅案,说明如下:因为S 中的活动是独⽴的,⽽在排序队列中,【活动1】在所有活动中具有最⼩的结束时间,因为k不等于1,【活动k】的完成时间必定是⼤于等与【活动1】的完成时间,因此把【活动k】换成【活动1】后的新⽅案S‘必定也是最佳解决⽅案。

算法实现在以下C/C++代码实现中,假设活动已根据其完成时间进⾏了排序。

#include<stdio.h>// n --> 活动个数// s[] --> 数组保存所有活动的开始时间// f[] --> 数组保存所有活动的结束时间void printMaxActivities(int s[], int f[], int n){int i, j;printf ('选择以下的活动\n');// 第⼀个活动总是选中i = 0;printf('%d ', i);// 依次检查余下的活动for (j = 1; j < n; j++){//如果某活动在之前选择的活动结束之后开始if (s[j] >= f[i]){printf ('%d ', j);i = j;}}}//主程序int main(){int s[] = {1, 3, 0, 5, 8, 5};int f[] = {2, 4, 6, 7, 9, 9};int n = sizeof(s)/sizeof(s[0]);printMaxActivities(s, f, n);return 0;}注意:若是finish数组没有排序,需要先对它进⾏排序。

《2024年基于贪心算法的动态规划策略》范文

《2024年基于贪心算法的动态规划策略》范文

《基于贪心算法的动态规划策略》篇一一、引言在计算机科学和优化理论中,动态规划和贪心算法是两种常用的解决优化问题的方法。

动态规划更侧重于通过保存子问题的解来避免重复计算,而贪心算法则倾向于在当前状态下做出最优选择。

本文将探讨如何结合这两种算法的思想,设计一种基于贪心算法的动态规划策略,以解决一些具有挑战性的实际问题。

二、背景及问题阐述在实际生活中,我们常常需要面对一系列具有复杂约束的优化问题。

这些问题通常需要在有限的时间内,通过计算寻找一种最满意的解决方案。

例如,在资源分配、路径规划、网络流等问题中,我们往往需要在满足一定约束条件下,追求某种指标(如成本、时间、效率等)的最优化。

针对这些问题,本文提出了一种基于贪心算法的动态规划策略。

三、贪心算法与动态规划的结合1. 贪心策略贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。

它的特点是在每一步选择中都只考虑当前状态,而不从整体最优上加以考虑。

2. 动态规划动态规划是一种通过保存子问题的解来避免重复计算,从而解决最优化问题的方法。

它通常将问题分解为若干个子问题,并保存子问题的解以供后续使用。

结合这两种算法的思想,我们可以设计一种基于贪心策略的动态规划方法。

具体而言,我们可以在动态规划的过程中,利用贪心策略来指导子问题的选择和解决。

这样可以在保证解的质量的同时,提高算法的效率。

四、策略设计及实施1. 问题分解与建模首先,我们需要将问题分解为若干个子问题,并建立相应的数学模型。

这通常涉及到对问题的深入理解和分析,以确定哪些子问题的解对最终结果具有关键影响。

2. 贪心策略的引入在建立数学模型后,我们可以引入贪心策略来指导子问题的选择和解决。

具体而言,我们可以在每一步选择中,根据当前状态和目标函数的特点,选择最有利于达到全局最优的子问题进行处理。

3. 动态规划的实现在引入贪心策略后,我们可以利用动态规划的思想来求解问题。

贪心算法解活动安排实验报告

贪心算法解活动安排实验报告

实验3 贪心算法解活动安排问题一、实验要求1.要求按贪心法求解问题;2.要求读文本文件输入活动安排时间区间数据;3.要求显示结果。

二、实验仪器和软件平台仪器:带usb接口微机软件平台:WIN-XP + VC++6.0三、源程序#include "stdafx.h"#include<stdio.h>#include<stdlib.h>#include<algorithm>#define N 50#define TURE 1#define FALSE 0int s[N];/*开始时间*/int f[N];/*结束时间*/int A[N];/*用A存储所有的*/int Partition(int *b,int *a,int p,int r);void QuickSort(int *b,int *a,int p,int r);void GreedySelector(int n,int *s,int *f,int *A);int main(){int n=0,i;while(n<=0||n>50){printf("\n");printf("请输入活动的个数,n=");scanf("%d",&n);if(n<=0) printf("请输入大于零的数!");else if(n>50) printf("请输入小于50的数!");}printf("\n请分别输入开始时间s[i]和结束时间f[i]:\n\n");for(i=1;i<=n;i++){printf("s[%d]=",i,i);scanf("%d",&s[i]);printf("f[%d]=",i,i);scanf("%d",&f[i]);printf("\n");}QuickSort(s,f,1,n); //按结束时间非减序排列printf("按结束时间非减序排列如下:\n"); /*输出排序结果*/ printf("\n 序号\t开始时间结束时间\n");printf("-------------------------\n");for(i=1;i<=n;i++)printf(" %d\t %d\t %d\n",i,s[i],f[i]);printf("-------------------------\n");GreedySelector(n,s,f,A);//贪心算法实现活动安排printf("安排的活动序号依次为:");for(i=1;i<=n;i++){if(A[i])printf("\n%d %d-->%d",i,s[i],f[i]);}printf("\n");system("pause");return 0;}//快速排序void QuickSort(int *b,int *a,int p,int r){int q;if(p<r)q=Partition(b,a,p,r);QuickSort(b,a,p,q-1);/*对左半段排序*/ QuickSort(b,a,q+1,r);/*对右半段排序*/ }}//产生中间数int Partition(int *b,int *a,int p,int r){int k,m,y,i=p,j=r+1;int x=a[p];y=b[p];while(1){while(a[++i]<x);while(a[--j]>x);if(i>=j)break;else{k=a[i];a[i]=a[j];a[j]=k;m=b[i];b[i]=b[j];b[j]=m;}a[p]=a[j];b[p]=b[j];a[j]=x;b[j]=y;return j;}//贪心算法实现活动安排void GreedySelector(int n,int *s,int *f,int *A){//用集合A来存储所选择的活动A[1]=TURE; //默认从第一次活动开始执行int j=1; //j记录最近一次加入到A中的活动for(int i=2;i<=n;i++){//f[j]为当前集合A中所有活动的最大结束时间//活动i的开始时间不早于最近加入到集合A中的j的时间f[j]if(s[i]>=f[j]){A[i]=TURE; //当A[i]=TURE时,活动i在集合A中j=i;}else A[i]=FALSE; }}四、运行结果五、实验小结贪心算法总是做出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。

Java实验贪心算法,包含普通背包和贪心算法中的活动安排

Java实验贪心算法,包含普通背包和贪心算法中的活动安排

实验报告7课程数据结构与算法实验名称贪心策略第页班级11计本学号105032011130 姓名风律澈实验日期:2013年4月15日报告退发(订正、重做)一、实验目的掌握贪心策略的原理和应用。

二、实验环境1、微型计算机一台2、WINDOWS操作系统,Java SDK,Eclipse开发环境三、实验内容必做题:1、编写程序,求解普通背包问题,要求输出背包所能容纳物品的最大价值(最优值),及与该最大价值相应的装入背包中的每件物品信息。

2、设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。

每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。

如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。

若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。

也就是说,当si≥fj或sj≥fi时,活动i与活动j 相容。

编写程序,在所给的活动集合中选出最大的相容活动子集合。

要求输出活动数量(即最优值)和最大相容活动子集中的每个活动(即最优解)。

四、实验步骤和结果(附上代码和程序运行结果截图)1、普通背包问题//goods.classpublic class goods implements Comparable<goods> {private static int ids=1;private int id;private int weight;private int value;private int use;//初始化对象//public goods(int w,int v){super();id=ids++;weight=w;value=v;use=0;}//获取输出值//public float getVW(){return this.value/this.weight;}public int getw(){return this.weight;}public int getv(){return this.value;}public int getuse(){return e;}//输出设置//public void setuse(int u){e=u;}//方法//public int compareTo(goods o){if(this.value*o.weight>o.value*this.weight) return-1;//使用交叉相乘的方法避免除法,a/b?c/d=ad?bcif(this.value*o.weight<o.value*this.weight) return 1;return 0;}public String toString(){return"物品编号"+this.id+" 物品重量"+this.weight+" 物品价值"+this.value+" 物品使用情况"+e;}}//NormalBagimport java.util.ArrayList;import java.util.PriorityQueue;public class NormalBag {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub//初始化队列//PriorityQueue<goods> pq=initpq();//定义暂存结果数组//ArrayList<goods> place=new ArrayList<goods>();//初始化背包值//int c=10;//背包当前容量int v=0;//背包当前价值//开始放入物品//goods t;//设定暂存记录变脸while(true){//设定借宿条件//if(c==0)break;if(pq.isEmpty())break;//取出替换元素//t=pq.poll();//开始比较//if(t.getw()<=c){v+=t.getv();t.setuse(t.getw());c-=t.getw();}else{v+=c*t.getVW();t.setuse(c);c=0;}place.add(t);}//输出结果//System.out.println(v);System.out.println(place);}//创建队列元素private static PriorityQueue<goods> initpq() {// TODO Auto-generated method stubPriorityQueue<goods>pq=new PriorityQueue<goods>();pq.offer(new goods(2,6));pq.offer(new goods(2,3));pq.offer(new goods(6,5));pq.offer(new goods(5,4));pq.offer(new goods(4,6));return pq;}}2.活动安排问题public class GreedySelector {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub//初始化//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};//结束时间数组,已排序int a[]=new int[s.length];//定义标记选择过的活动数组int count=0;//活动数量计数器//开始选择//greedyselector(s,f,a);//输出//for(int i=0;i<s.length;i++){//输出活动序号if(a[i]==1){System.out.print("活动"+(i+1)+" ");count++;}}System.out.println();System.out.print("活动总数量为:"+count);//输出总活动数量}private static void greedyselector(int[] s, int[] f, int[] a) { // TODO Auto-generated method stub//贪心选择为,先结束的互动优先,这样剩余的时间达到最大,安排活动最多//int n=s.length-1;a[0]=1;//最先的那个最优int j=0;for(int i=1;i<=n;i++){if(s[i]>=f[j]){a[i]=1;j=i;}elsea[i]=0;}}}五、实验总结(本次实验完成的情况,心得体会)。

第4章 贪心算法(1)活动安排问题

第4章 贪心算法(1)活动安排问题
3
4.1 活动安排问题
活动安排问题是可以用贪心算法有效求解的很 好例子。
该问题要求高效地安排一系列争用某一公共资 源的活动,使得尽可能多的活动能兼容地使用 公共资源。
4
问题描述
设有n个活动的集合E={1, 2, …, n},其中每个 活动都要求使用同一资源,而在同一时间内只 有一个活动能使用这一资源。
2
贪心算法
例2:若上述硬币面值改为:
一角一分、五分和一分 现在要找给顾客一角五分钱,如何给出硬币? 答案:错:1个一角一分,4个一分
对:3个五分
虽然贪心算法不能对所有问题都得到整体最优 解,但对许多问题它能产生整体最优解。
在一些情况下,即使贪心算法不能得到整体最 优解,其最终结果却是最优解的很好的近似解。
ቤተ መጻሕፍቲ ባይዱ17
0-1背包问题
给定n种物品和一个背包。物品i的重量是wi, 其价值为vi,背包的容量为c。应如何选择装 入背包的物品,使得装入背包中物品的总价 值最大?
说明:在选择装入背包的物品时,对每种物 品i只有2种选择,即装入背包或不装入背包。 不能将物品i装入背包多次,也不能只装入部 分的物品i。
16
3、贪心算法与动态规划算法的 差异
贪心算法和动态规划算法都要求问题具有最 优子结构性质,这是两类算法的一个共同点。
对于具有最优子结构的问题应该选用贪心算 法还是动态规划算法求解?
是否能用动态规划算法求解的问题也能用贪 心算法求解?
下面研究2个经典的组合优化问题,并以此 说明贪心算法与动态规划算法的主要差别。
每个活动i都有一个要求使用该资源的起始时 间si和一个结束时间fi,且si <fi 。
5
问题描述
如果选择了活动i,则它在半开时间区间[si, fi) 内占用资源。若区间[si, fi)与区间[sj, fj)不相交, 则称活动i与活动j是相容的。也就是说,当si≥fj

《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告实验序号:07实验项目名称:实验8 贪心算法(一)一、实验题目1.删数问题问题描述:键盘输入一个高精度的正整数N(不超过250 位),去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的非负整数。

编程对给定的N 和k,寻找一种方案使得剩下的数字组成的新数最小。

若输出前有0则舍去2.区间覆盖问题问题描述:设x1,x2,...xn是实轴上的n个点。

用固定长度为k的闭区间覆盖n个点,至少需要多少个这样的固定长度的闭区间?请你设计一个有效的算法解决此问题。

3.会场安排问题问题描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。

设计一个有效的贪心算法进行安排。

(这个问题实际上是著名的图着色问题。

若将每一个活动作为图的一个顶点,不相容活动间用边相连。

使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。

)4.导弹拦截问题问题描述:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。

某天,雷达捕捉到敌国的导弹来袭。

由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

给定导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

二、实验目的(1)通过实现算法,进一步体会具体问题中的贪心选择性质,从而加强对贪心算法找最优解步骤的理解。

(2)掌握通过迭代求最优的程序实现技巧。

(3)体会将具体问题的原始数据预处理后(特别是以某种次序排序后),常能用贪心求最优解的解决问题方法。

三、实验要求(1)写出题1的最优子结构性质、贪心选择性质及相应的子问题。

(2)给出题1的贪心选择性质的证明。

(3)(选做题):写出你的算法的贪心选择性质及相应的子问题,并描述算法思想。

0021算法笔记——【贪心算法】贪心算法与精彩活动安排问题

0021算法笔记——【贪心算法】贪心算法与精彩活动安排问题

0021算法笔记——【贪心算法】贪心算法与活动安排问题1、贪心算法(1)原理:在对问题求解时,总是做出在当前看来是最好的选择。

也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。

贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

(2)特性:贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。

能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质。

1)贪心选择性质所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。

这是贪心算法可行的第一个基本要素。

贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。

对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

证明的大致过程为:首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。

做了贪心选择后,原问题简化为规模更小的类似子问题。

然后用数学归纳法证明通过每一步做贪心选择,最终可得到问题的整体最优解。

其中,证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。

2)最优子结构性质当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

(3)贪心算法与动态规划算法的差异:动态规划和贪心算法都是一种递推算法,均有最优子结构性质,通过局部最优解来推导全局最优解。

两者之间的区别在于:贪心算法中作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留,贪心算法每一步的最优解一定包含上一步的最优解。

贪心算法解决活动安排问题

贪心算法解决活动安排问题
待安排的11个活动的开始时间和结束时间按结束时间的 非减序排列如下:
表1 安排活动非减序时间表
-
5
贪心算法实现
贪心算法的计算过 程如下图所示。图 中每行相应于算法 的一次迭代。阴影 长条表示的活动是 已选入集合A的活动 ,而空白长条表示 的活动是当前正在 检查相容性的活动 。
图-1 贪心算法的计算过程图
减序算法
贪心算法
时间复杂度 O(n2)
O(nlogn) O(n)
-
8
小组任务分工
1. 算法: 2. 李文治 3. 2. PPT: 4. 制作:陈平,谢华欣,韩月梅 5. 3.文档: 6. 制作:陈平,谢华欣,韩月梅
-
-
返回
-
贪心算法算法思想及分析 Nhomakorabea活动安排运用贪心算法的思路为,尽可能多的使更多的 事件得到资源的安排。按这种方法选择相容活动为未安 排活动留下尽可能多的时间。也就是说,该算法的贪心 选择的意义是使剩余的可安排时间段极大化,以便安排 尽可能多的相容活动。实现方法是在满足相容的条件下, 使结束时间靠前的活动得到资源,这样就为后续时间留 下更多的安排时间,以使更多的活动得到安排。
运用贪心算法解决活动安排问题
Using the greedy algorithm to solve the problem of activity arrangement
组长:李文治 组员: 陈平 谢华欣 韩月梅
内容提要
1 问题描述 2 算法思想及分析 3 实验及结果 4 实验总结
-
问题描述
问题描述
陈平谢华欣韩月梅运用贪心算法解决活动安排问题usingthegreedyalgorithmtosolvetheproblemofactivityarrangement问题描述实验及结果实验总结算法思想及分析问题描述设有n个活动的集合e12n其中每个活动都要求使用同一资源如演讲会场等而在同一时间内只有一个活动能使用这一资源

贪心算法解决活动安排问题研究

贪心算法解决活动安排问题研究

贪心算法解决活动安排问题研究摘要:利用贪心算法解决如何使用最少的资源安排一系列活动。

并证明了贪心算法解决此问题的有效性,且进行了实例验证,并进行了复杂度分析,此算法是解决资源组合规划问题较好的方法。

关键词:贪心算法;java程序;复杂度分析;活动安排问题中图分类号:tp312文献标识码:a文章编号:16727800(2011)012004302基金项目:广西研究生教育创新计划(22m58)作者简介:苏方方(1986-),女,河南商丘人,广西师范大学计算机科学与信息工程学院硕士研究生,研究方向为自然语言处理和算法;张金玲(1986-),女,山东菏泽人,广西师范大学计算机科学与信息工程学院硕士研究生,研究方向为远程教育和算法。

0引言假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。

这里就需要选用合适的算法来解决类似的问题。

虽然计算机的计算能力每年都在飞快增加,但是,需要处理的信息量更是呈指数级的增长。

互联网的信息流量在飞快进步,数据量更是达到了前所未有的程度。

无论是三维图形,海量数据处理等都需要极大的计算量。

在网络时代,越来越多的挑战需要靠卓越的算法来解决。

1贪心算法以及贪心算法的基本要素贪心算法是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法。

并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解。

贪心算法可以简单描述为:对一组数据进行排序,找出最小值,进行处理,再找出最小值,再处理。

也就是说贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望得到结果是最好或最优的算法。

贪心算法解题步骤:①从问题的某个初始解出发;②采用循环语句,就根据局部最优策略,得到一个部分解,缩小问题的范围或规模;③将所有部分解综合起来,得到问题的最终解。

另外它也是一种某种度量意义下的最优解的分级处理方法。

对于一个具体的问题,怎么知道是否可用贪心算法来解决问题,以及能否得到问题的一个最优解呢?从许多可以用贪心算法求解的问题中可以看到它们一般具有两个重要的性质:①贪心选择性质;②最优子结构性质。

贪心算法实验小结

贪心算法实验小结

贪心算法实验小结
最近,我和我的同学们在实验室里进行了一次关于贪心算法的实验,探究贪心算法在旅行商问题中的应用。

实验的准备工作非常简单,我们只需要准备好实验所需的数据,并将其输入到计算机中即可。

之后,我们使用贪心算法来解决这个旅行商问题,运用贪心思想,在遍历所有城市时,选择当前停留时间最短的城市作为下一站,以期最终获得最短的旅行路线。

实验的过程中,我们发现,贪心算法可以有效地解决旅行商问题,即使在城市数量较多的情况下,它仍然能够在较短的时间内得到最优解。

除了旅行商问题之外,贪心算法还可以应用于其他许多其他问题,比如背包问题,最大化问题等。

在这次实验中,我们研究到了贪心算法的原理和应用,对于贪心算法在求解复杂问题中的重要性有了更深的认识。

此外,我们也体会到了贪心算法的局限性,它只能获得局部最优解,而不能保证全局最优解。

总之,本次实验对我们的研究有很大的帮助,不仅加深了对贪心算法的认识,而且还能够更好地理解其在实际问题中的应用,让我们更加清楚如何有效地利用贪心算法来解决复杂问题。

贪心算法解决活动安排问题报告

贪心算法解决活动安排问题报告

贪心算法解决活动安排问题金潇Use the greedy algorithm to solve the arrangement for activitiesJinxiao摘要:贪心算法在当前来看是最好的选择。

是用利用启发式策略,在不从整体最优上加以考虑的情况下,来做出局部最优选择的一种算法。

本文通过贪心算法的经典案例—活动安排问题入手,描述了贪心算法的基本思想和可能产生的问题,并简述该算法的好处和特点,最后给出几种经典的贪心算法。

关键字:贪心算法、局部最优选择Abstract:A greedy algorithm is any algorithm that follows the problem solving heuristic of making the locally optimal choice at each stage with the hope of finding the global optimum. This article through the greedy algorithm of the classic case--activities problems, describes the greedy algorithm the basic ideas and possible problems, and briefly introduces the advantages and characteristics of the algorithm, and finally gives several classic the greedy algorithm. Keywords:greedy algorithm、the locally optimal choice1.引言:贪心法是一种改进了的分级处理方法。

用贪心法设计算法的特点是一步一步地进行,每一步上都要保证能获得局部最优解。

贪心算法实验报告(C语言)

贪心算法实验报告(C语言)

实验2、《贪心算法实验》一、实验目的1. 了解贪心算法思想2. 掌握贪心法典型问题,如背包问题、作业调度问题等。

二、实验内容1. 编写一个简单的程序,实现单源最短路径问题。

2. 编写一段程序,实现找零。

【问题描述】当前有面值分别为2角5分,1角,5分,1分的硬币,请给出找n分钱的最佳方案(要求找出的硬币数目最少)。

3. 编写程序实现多机调度问题【问题描述】要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m 台机器加工处理完成。

约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。

作业不能拆分成更小的子作业。

三、算法思想分析1.初始化将源点设计为红点集,其余点设计为蓝点,重复选择蓝点集中与源点路径最短的点加入红点集,更新剩余的蓝点集路径,直至蓝点集为空或者只剩下没有连通的点,那么源点到其余所有点的最短路径就出来了。

2.找零问题是典型的贪心问题,但是并不代表所有的找零都能用贪心算法找到最优解。

只有满足贪心选择性质的找零才能找到最优解,本题满足贪心选择性质,直接先一直选面值最大的硬币,再一次减小即可。

3.先对作业按时长进行重排序,再依次找目前用时最短的机器安排工作并加上对应时长,最后总时长为机器中用时最长的那个时长。

四、实验过程分析1.单源最短路径的算法思想并不难,但是在实际编码过程中还是有很多小问题需要注意,首先,一定要新建数组存储路径变化,因为后面计算路径时会用到原数组,如果直接在原数组上更改后面就找不到原数据了,那么就会出现偏差。

其次就是建议先写个伪代码,判断的if-else语句比较多,容易搞混,在代码中一定要及时备注,某些代码的功能是什么,不然再次看代码时需要思考很久甚至忘记。

2.找零问题直接用while循环或者不断取余取模即可解决。

3.作业调度问题大致分为三步,一是排序,二是不断找最短时长的机器安排作业,三是找最长时间为作业完成时间。

五、算法源代码及用户屏幕1.(1)算法源码/**********************单源最短路径问题。

数据结构与算法-贪心算法实验报告

数据结构与算法-贪心算法实验报告

贪心算法实验报告课程数据结构与算法实验名称贪心策略第页班级学号姓名实验日期:2019年9月15日报告退发(订正、重做)一、实验目的掌握贪心策略的原理和应用。

二、实验环境1、微型计算机一台2、WINDOWS操作系统,Java SDK,Eclipse开发环境三、实验内容必做题:1、编写程序,求解普通背包问题,要求输出背包所能容纳物品的最大价值(最优值),及与该最大价值相应的装入背包中的每件物品信息。

2、设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。

每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。

如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。

若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。

也就是说,当si≥fj或sj≥fi时,活动i与活动j 相容。

编写程序,在所给的活动集合中选出最大的相容活动子集合。

要求输出活动数量(即最优值)和最大相容活动子集中的每个活动(即最优解)。

四、实验步骤和结果(附上代码和程序运行结果截图)1、普通背包问题//goods.classpublic class goods implements Comparable<goods> {private static int ids=1;private int id;private int weight;private int value;private int use;//初始化对象//public goods(int w,int v){super();id=ids++;weight=w;value=v;use=0;}//获取输出值//public float getVW(){return this.value/this.weight;}public int getw(){return this.weight;}public int getv(){return this.value;}public int getuse(){return e;}//输出设置//public void setuse(int u){e=u;}//方法//public int compareTo(goods o){if(this.value*o.weight>o.value*this.weight) return -1;//使用交叉相乘的方法避免除法,a/b?c/d=ad?bcif(this.value*o.weight<o.value*this.weight) return 1;return 0;}public String toString(){return"物品编号"+this.id+" 物品重量"+this.weight+" 物品价值"+this.value+" 物品使用情况"+e;}}//NormalBagimport java.util.ArrayList;import java.util.PriorityQueue;public class NormalBag {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub//初始化队列//PriorityQueue<goods> pq=initpq();//定义暂存结果数组//ArrayList<goods> place=new ArrayList<goods>();//初始化背包值//int c=10;//背包当前容量int v=0;//背包当前价值//开始放入物品//goods t;//设定暂存记录变脸while(true){//设定借宿条件//if(c==0)break;if(pq.isEmpty())break;//取出替换元素//t=pq.poll();//开始比较//if(t.getw()<=c){v+=t.getv();t.setuse(t.getw());c-=t.getw();}else{v+=c*t.getVW();t.setuse(c);c=0;}place.add(t);}//输出结果//System.out.println(v);System.out.println(place);}//创建队列元素private static PriorityQueue<goods> initpq() {// TODO Auto-generated method stubPriorityQueue<goods>pq=new PriorityQueue<goods>();pq.offer(new goods(2,6));pq.offer(new goods(2,3));pq.offer(new goods(6,5));pq.offer(new goods(5,4));pq.offer(new goods(4,6));return pq;}}2.活动安排问题public class GreedySelector {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub//初始化//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};//结束时间数组,已排序int a[]=new int[s.length];//定义标记选择过的活动数组int count=0;//活动数量计数器//开始选择//greedyselector(s,f,a);//输出//for(int i=0;i<s.length;i++){//输出活动序号if(a[i]==1){System.out.print("活动"+(i+1)+" ");count++;}}System.out.println();System.out.print("活动总数量为:"+count);//输出总活动数量}private static void greedyselector(int[] s, int[] f, int[] a) { // TODO Auto-generated method stub//贪心选择为,先结束的互动优先,这样剩余的时间达到最大,安排活动最多//int n=s.length-1;a[0]=1;//最先的那个最优int j=0;for(int i=1;i<=n;i++){if(s[i]>=f[j]){a[i]=1;j=i;}elsea[i]=0;}}}五、实验总结(本次实验完成的情况,心得体会)。

贪心算法解决会场安排问题、多处最优服务次序问题(含源代码)

贪心算法解决会场安排问题、多处最优服务次序问题(含源代码)

西安邮电大学(计算机学院)课内实验报告实验名称:贪心算法专业名称:计算机科学与技术班级:学生姓名:学号(8位):指导教师:实验日期: 2014年5月22日1.实验目的及实验环境实验目的:通过实际应用熟悉贪心算法,并解决会场安排问题、多出最优服务次序问题实验环境:Visual C++ 6.0二. 实验内容1.会场安排问题.假设要在足够多的回厂里安排一批活动,并希望使用尽可能少的会场,设计一个有效的贪心算大进行安排(这个问题实际上是注明的图着色问题。

若将每一个活动作为图的一个顶点,不相容活动间用边相连。

使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数)2.多处最优服务次序问题设有n个顾客同时等待一项服务。

顾客i需要的服务时间为ti,1<=i<=n。

共有s处可以提供此项服务。

应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。

三.方案设计1、设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。

每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。

如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。

若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。

也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。

由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。

直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。

也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。

算法greedySelector的效率极高。

当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。

算法分析与设计实验报告--贪心法 (2)

算法分析与设计实验报告--贪心法 (2)
例1已知如下图所示的单行线交通网,每弧旁的数字表示通过这条单行线所需要的费用,现在某人要从v1出发,通过这个交通网到v8去,求使总费用最小的旅行路线。
Dijkstra方法的基本思想是从vs出发,逐步地向外探寻最短路。执行过程中,与每个点对应,记录下一个数(称为这个点的标号),它或者表示从vs到该点的最短路的权(称为P标号)、或者是从vs到该点的最短路的权的上界(称为T标号),方法的每一步是去修改T标号,并且把某一个具T标号的改变为具P标号的点,从而使G中具P标号的顶点数多一个,这样至多经过n-1(n为图G的顶点数)步,就可以求出从vs到各点的最短路。
if(D[j]>D[min]+graph[min][j]||D[j]==-1)
{D[j]=D[min]+graph[min][j]; //每次迭代求最小值,最后一次即为到源点的最短路径
P[j]=min;
}
}
}
void main()
{instital(R, B, D, P);
theshortestway(R, B, D, P);
using namespace std;
int const ZUSHU = 5;
int Ling[] = {50,20,10,5,1};
int GeShu[ZUSHU];
void ZhaoLing(int n)
{for(int i=0;i<ZUSHU;i++)
{GeShu[i] = n / Ling[i];n = n % Ling[i];}
(1)初始时,S中仅含有源节点。
(2)设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,用数组D[i]记录顶点i当前所对应的最短特殊路径长度。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.引言:
贪心法是一种改进了的分级处理方法。

用贪心法设计算法的特点是一步一步地进行,每一步上都要保证能获得局部最优解。

每一步只考虑一个数据,它的选取满足局部优化条件。

若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。

这种能够得到某种度量意义下的最优解的分级处理方法称为贪心法。

贪心算法总是做出在当前看来是最优的选择,也就是说贪心算法并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该题运用贪心算法可以得到最优解或较优解。

2.贪心算法的基本思想及存在问题
贪心法的基本思想:
从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。

当达到某算法中的某一步不能再继续前进时,算法停止。

1.建立数学模型来描述问题。

2.把求解的问题分成若干个子问题。

3.对每一子问题求解,得到子问题的局部最优解。

4.把子问题的解局部最优解合成原来解问题的一个解。

3.活动安排问题:
3.1 贪心算法解决活动安排问题
学校举办活动的安排问题是用贪心算法有效求解的一个很好例子。

活动安排问题要求安排一系列争用某一公共资源的活动。

用贪心算法可使尽可能多的活动能兼容的使用公共资源。

设有n个活动的集合{0,1,2,…,n-1},其中每个活动都要求使用同一资源,如会场等,而在同一时间内只有一个活动能使用这一资源。

每个活动i都有一个要求使用该资源的起始时间starti和一个结束时间endi,且starti<endi。

如选择了活动i,则它在半开时间区间[starti,endi)内占用资源。

若区间[starti,endi)与区间[startj,endj)不相交,称活动i与活动j是相容的。

也就是说,当start j≥endi或starti≥endj时,活动i与活动j相容。

活动安排问题就是在所给的活动集合中选出最大的相容子活动集合。

设各活动的起始时间和结束时间存储于数组start[]和end[]中,不失一般性,假设结束时间安非递减排列:end[0]≤end[1] ≤…≤end[n-1]。

算法中用集合a来存储所选择的活动。

活动i被选择当且仅当a[i]的值为true。

变量j记录最近一次选择的活动。

设j 是当前最近选择的活动,也就是所选择的活动中编号最大的活动,即:
j=max{i|0≤i<n,a[i]=true}
算法开始选择活动0,并将j初始化为0.然后依次检查活动i是否与当前已选择的所有活动相容。

如相容则安排活动i,否则不安排活动i,再继续检查下一活动与所有已选择活动的相容性。

由于k是当前已选择活动的最大结束时间,故活动i与当前所有选择活动相容的充分且必要条件是其开始时间start[i]不早于最近选择的活动j的结束时间end[j],即start[i]≥end[j]。

若活动i满足此条件,则活动i被选择,因而取代活动j的位置。

由于活动是以其完成时间的非减序排列的,所以算法每次总是选择具有最早完成时间的相容活动i。

这种方法选择相容活动就使剩余活动留下尽可能多的时间。

也就是该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。

3.2 活动安排实例
设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:
算法的计算过程如下图所示。

图中每行相应于算法的一次迭代。

阴影长条表示的活动是已选入集合的活动,而空白长条表示的活动是当前正在检查相容性的活动。

若被检查的活动i的开始时间starti小于最近选择的活动j的结束时间endj,则不选择活动i,否则选择活动i加入集合中。

选择的活动有:1,4,8和11。

6.结束语
贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法,本文通过活动安排问题这一经典案例对贪心算法进行简要分析,利用图表给出较直观实例,得到了贪心算法是一种高效算法的结论。

相关文档
最新文档