贪心法 多机调度问题
贪心法 多机调度问题
//多机调度问题/*贪心法求解多级调度问题的贪心策略师最长处理时间的作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样就可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的时间。
按照最长处理时间作业优先的贪心测落,当m>n,时,只要将机器ide [0,ti)时间去见分配给作业j即可,当m<n时,首先将n个作业从大到小排序,然后依次顺序将作业分配给空闲的处理机算法伪代码将数组t[n]从大到小排序,对应的作业序号存储在数组p[n]中;将数组d[m]初始化为零3:for(i0;i<=m;i++)3.1:s[i]={p[i]}:将m个作业分配给m个机器3.2 d[i]=t[i];for(i=m+1;i<=n;i++)4.1 j=数组d[m]中最小值对应的下标;//j为最先空闲的机器序号4.2 s[j]=s[j]+{p[i]};//将作业分配给最先空闲的的机器j4.3 d[j]=d[j]+d[t];//机器j将在d[j]后空闲*/#include<iostream>using namespace std;void lowsort(int *t,int *p,int n)//将数组t[n]按从小到大的顺序排序,相应的任务编号数组p[n]也要随之改变{int index;for(int i=0;i<n;i++){index=i;for(int j=i+1;j<n;j++){if(t[index]<t[j])index=j;}if(index!=i){int temp;temp=t[index];t[index]=t[i];t[i]=temp;temp=p[i];p[i]=p[index];p[index]=temp;}}int find(int *d,int m){int min=d[0];int k;for(int i=0;i<m;i++){if(d[i]<min){min=d[i];k=i;}}return k;}void ajust(int *t,int *d,int *p,int *s,int n,int m){lowsort(t,p,n);for(int i=0;i<m;i++){d[m]=0;}for(i=0;i<m;i++){s[i]=p[i];cout<<"机器"<<i+1<<"做了任务"<<p[i]<<endl;d[i]=t[i];}for(i=m;i<n;i++){int j=find(d,m);//查找数组d[m]中最小值对应的下标s[j]=s[j]+p[i];cout<<"机器"<<j+1<<"做了任务"<<p[i]<<endl;d[j]=d[j]+t[i];}}void main()int n,m;cout<<"输入任务数量"<<endl;cin>>n;cout<<"输入机器个数"<<endl;cin>>m;int *t=new int [n];int *s=new int [n];int *d=new int [m];int *p=new int[n];cout<<"输入任务编号"<<endl;for(int k=0;k<n;k++)cin>>p[k];cout<<"每件任务所花费的时间"<<endl;for(int i=0;i<n;i++)cin>>t[i];ajust(t,d,p,s,n,m);}。
算法之多机调度问题
}
for(i=m+1;i<=n;i++)
{
for(int k=1;k<m;k++)
{
int o=d[k];
if (o>d[k+1])
{
o=d[k+1];
j=k+1;
}
}
s[j]|=(1<<(p[i]-1));
d[j]=d[j]+t[i];
}
}
void Output(int *p,int n,int *s,int *d,int m) //阅读并理解这个函数
Dsc_Order_By_t(t,p,n); //对作业根据运行时间t进行降序排列
Processing(p,t,n,s,d,m); //用最长运行时间优先算法处理作业
Output(p,n,s,d,m); //输出结果
_getch();
return 0;
}
运行结果图:
t[]={0,2,14,4,16,6,5,3}, //对应作业时间,t[0]不用
s[]={0,0,0,0}, //机器处理的作业集合,如:s[1]存放机器处理过的作业号,s[0]不用
d[]={0,0,0,0}; //机器处理作业的总时间,如:d[2]存放机器处理过的作业的总时间,d[0]不用
int n=sizeof(p)/sizeof(int)-1,m=sizeof(s)/sizeof(int)-1; //n--作业总数,m--机器台数
算法之多机调度问题
用贪心法解决多机调度问题
(1)问题的描述
设有n个独立的作业{1, 2,…, n},由m台相同的机器{M1, M2,…, Mm}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
算法设计之多机调度问题
《算法设计与分析》实训实验报告日期:2016年6月27日电子信息工程学院【问题描述】1、把作业按加工所用的时间从大到小排序2、如果作业数目比机器的数目少或相等,则直接把作业分配下去3、如果作业数目比机器的数目多,则每台机器上先分配一个作业【算法设计】运用贪心算法解决多机调度问题【算法实现】packagecom.test;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.Scanner;public class Duojidiaodu {public static void main(String[] args) {// TODO Auto-generated method stubBufferedReaderbr=new BufferedReader(new InputStreamReader(System.in));try {System.out.println("请输入机器个数:");intjiqigeshu=Integer.parseInt(br.readLine());System.out.println("请输入作业个数:");intzuoyegeshu=Integer.parseInt(br.readLine());Start start=new Start(jiqigeshu, zuoyegeshu);//指明有几台机器以及几道作业start.show();//显示每台机器都有哪些作业} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(br!=null)try {br.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}classJiqiManger{ArrayList<Jiqi> al=new ArrayList<Jiqi>();public void addjiqi(Jiqijiqi){this.al.add(jiqi);}publicJiqigetjiqi(int id){for(int i=0;i<this.al.size();i++){if(this.al.get(i).getId()==id){returnthis.al.get(i);}}return null;}}classJiqi{privateint id;privateArrayList<Zuoye> al;privateintzongshaoshi;publicJiqi(int id) {this.id=id;al=new ArrayList<Zuoye>();}publicintgetId(){return this.id;}public void addzuoye(Zuoyezuoye){this.al.add(zuoye);this.zongshaoshi+=zuoye.getHaoshi();}publicArrayList<Zuoye>getZuoye(){return this.al;}publicintgetZonghaoshi(){returnthis.zongshaoshi;}}classZuoyeManger{ArrayList<Zuoye>zuoye=new ArrayList<Zuoye>();public void addzuoye(Zuoyezuoye){this.zuoye.add(zuoye);}public void paixu(){Object[] temp=this.zuoye.toArray();for(int i=0;i<temp.length-1;i++)for(int j=i+1;j<temp.length;j++){if(((Zuoye)temp[i]).getHaoshi()<((Zuoye)temp[j]).getHaoshi()){Zuoyezuoye=(Zuoye)temp[i];temp[i]=temp[j];temp[j]=zuoye;}}this.zuoye.clear();for(int i=0;i<temp.length;i++)this.zuoye.add(((Zuoye)temp[i]));}publicZuoyegetZuoye(int index){returnthis.zuoye.get(index);}}classZuoye{privateint id;privateinthaoshi;publicZuoye(int id , inthaoshi ) {this.id=id;this.haoshi=haoshi;}publicintgetHaoshi(){returnthis.haoshi;}publicintgetId(){return this.id;}}class Start{privateJiqiMangerjiqiManger=null;privateZuoyeMangerzuoyeManger=null;privateintjiqigeshu,zuoyegeshu;public Start(intjiqigeshu , intzuoyegeshu) {jiqiManger=new JiqiManger();zuoyeManger=new ZuoyeManger();this.jiqigeshu=jiqigeshu;this.zuoyegeshu=zuoyegeshu;Jiqijiqi;Zuoyezuoye;for(int i=0;i<jiqigeshu;i++){jiqi=new Jiqi(i+1);jiqiManger.addjiqi(jiqi);}for(int i=0;i<zuoyegeshu;i++){inthaoshi;Scanner sc=new Scanner(System.in);System.out.println("请输入第"+(i+1)+"号作业的时间:");haoshi=sc.nextInt();zuoye=new Zuoye(i+1, haoshi);zuoyeManger.addzuoye(zuoye);}this.zuoyeManger.paixu();this.fenfa();}private voidfenfa(){int index=0;for(int i=0;i<this.jiqigeshu;i++){jiqiManger.getjiqi(i+1).addzuoye(zuoyeManger.getZuoye(index++));}while(index<this.zuoyegeshu){if(this.getJiqi()==null){System.out.println("对不起,没有机器可以分发作业!");break;}this.getJiqi().addzuoye(zuoyeManger.getZuoye(index++));}}privateJiqigetJiqi(){if(this.jiqiManger.getjiqi(1)==null)return null;int min=jiqiManger.getjiqi(1).getZonghaoshi();intminindex=1;for(int i=1;i<this.jiqigeshu;i++){if(jiqiManger.getjiqi(i+1).getZonghaoshi()<min){min=jiqiManger.getjiqi(i+1).getZonghaoshi();minindex=i+1;}}returnjiqiManger.getjiqi(minindex);}public void show(){ArrayList<Zuoye> al=null;for(int i=0;i<this.jiqigeshu;i++){al=jiqiManger.getjiqi(i+1).getZuoye();System.out.print(i+1+"号机器包含的作业有:{");for(int j=0;j<al.size();j++){if(j==(al.size()-1))System.out.println(al.get(j).getId()+"号作业}");elseSystem.out.print(al.get(j).getId()+"号作业,");}}}}【运行结果】。
贪心算法在多机调度问题中的应用
贪心算法在多机调度问题中的应用
贪心算法在多机调度问题中可以应用于任务调度和资源分配的问题。
在多机调度问题中,我们通常需要将一组任务分配到多台机器上,并优化某个指标(如任务完成时间的最小化、机器的负载均衡等)。
贪心算法在多机调度问题中的应用可以通过以下步骤进行:
1. 确定任务的排序方式:根据任务的一些特征,如任务的处理时间、优先级等,确定一种排序方式。
例如,可以按照任务的处理时间递增顺序进行排序。
2. 初始化机器的状态:在开始调度之前,需要初始化每台机器的状态,如设置机器的剩余处理时间、当前任务等。
3. 贪心选择:从排序后的任务列表中,依次选择任务进行分配。
通过贪心选择,选择当前能够使得指标最小化的任务,并将任务分配给剩余处理时间最短的机器。
4. 更新机器状态:根据分配给机器的任务,更新机器的状态,如更新剩余处理时间、当前任务等。
5. 重复步骤3和步骤4,直到所有任务被分配完毕。
贪心算法在多机调度问题中的应用的核心思想是每次选择局部最优解,并希望通过不断地选择局部最优解,最终得到全局最
优解。
然而,需要注意的是,贪心算法并不能保证一定能够得到全局最优解,因此需要根据具体的问题进行分析和验证。
贪心算法经典问题:活动安排,背包问题,最优装载,单源最短路径 Dijiksra,找零钱问题,多机调度
活动安排public static int greedySelector(int [] s, int [] f, boolean a[]){ //s[]开始时间f[]结束时间int n=s.length-1;a[1]=true;int j=1;int count=1;for (int i=2;i<=n;i++){ if (s[i]>=f[j]) { a[i]=true; j=i; count++; }else a[i]=false;}return count;}背包问题void Knapsack(int n,float M,float v[],float w[],float x[]){ Sort(n,v,w); //以每种物品单位重量的价值Vi/Wi从大到小排序int i;for (i=1;i<=n;i++) x[i]=0;float c=M;for (i=1;i<=n;i++){ if (w[i]>c) break;x[i]=1;c-=w[i];}if (i<=n) x[i]=c/w[i]; //允许放入一个物品的一部分}最优装载void Loading(int x[], T ype w[], T ype c, int n){ int *t = new int [n+1]; //t[i]要存的是w[j]中重量从小到大的数组下标Sort(w, t, n); //按货箱重量排序for (int i = 1; i <= n; i++) x[i] = 0; //O(n)for (int i = 1; i <= n && w[t[i]] <= c; i++){x[t[i]] = 1; c -= w[t[i]];} //调整剩余空间}单源最短路径Dijiksratemplate<class Type>void Dijikstra(int n, int v, Type dist[], int prev[], Type **c){ //c[i][j]表示边(i,j)的权,dist[i]表示当前从源到顶点i的最短特殊路径bool s[maxint];for(int i= 1;i<=n; i++){ dist[i]=c[v][i]; s[i]=false;if(dist[i]==maxint) prev[i]=0;else prev[i]=v;}dist[v]=0 ; s[v]=true;for(int i=1;i<n;i++){ int temp = maxint, u = v;for(int j= 1;j<=n; j++)if( (!s[j])&&(dist[j]<temp) ){u= j ; temp=dist[j]; }s[u]= true;for(int j= 1;j<=n;j++)if( (!s[j])&&(c[u][j])<maxint){ Type newdist = dist[u]+c[u][j];if(newdist<dist[j]) {dist[j]= newdist; prev[j]=u; } }}//ENDFOR}//END找零钱问题#define NUM 4void main(){ int m[NUM]={25,10,5,1};int n; //假设n=99cin>>n;cout<<n<<"的找钱方案为:";for(int i=0;i<NUM;i++)while(n>=m[i]&&n>0){cout<<m[i]<<" ";n-=m[i];}}//END多机调度#define N 10#define M 3void sort(int t[],int n);int set_work1(int t[],int n);int max(int t[],int num);int min(int t[],int m);int set_work2(int t[],int n);static int time[N]={2,8,18,32,50,72,98,128,182,200},s[M]={0,0,0};void main(){sort(time,N);if(M>=N) //作业数小于机器数cout<<set_work1(time,N)<<endl;elsecout<<set_work2(time,N)<<endl;}void sort(int t[],int n){for(int k=0;k<n-1;k++) //用选择法将处理时间从大到小排序{int j=k;for (int i=k; i<n; i++)if (t[i]>t[j]) j=i;{int temp=t[j];t[j]=t[k];t[k]=temp;}}}int max(int t[],int num) //max函数求解处理时间总和最长{int max=t[0];for(int i=1;i<num;i++)if(max<t[i]) max=t[i];return max;}int min(int t[],int m){int min=0; //min记录目前处理作业时间和最小的机器号for(int i=1;i<m;i++)if(s[min]>s[i]) min=i;return min;}int set_work1(int t[],int n){ int m=0;for(int i=0;i<n;i++) //分派作业s[m++]+=t[i];return max(s,N);}int set_work2(int t[],int n){ for(int i=0;i<n;i++)s[min(s,M)]+=t[i];return max(s,M);}。
多机调度问题贪心算法c语言
多机调度问题贪心算法c语言一、引言多机调度问题是指将一组作业分配给多台机器,使得完成所有作业的时间最短。
在实际生产中,多机调度问题是一个常见的优化问题。
贪心算法是解决多机调度问题的一种有效方法。
本文将介绍贪心算法在C语言中的应用。
二、问题描述假设有n个作业需要分配给m台机器进行加工处理,每个作业需要的时间不同,每台机器的处理速度也不同。
现在需要设计一个算法,将这些作业分配给这些机器进行加工处理,并使得完成所有作业所需时间最短。
三、贪心算法思路贪心算法是一种基于局部最优解来构造全局最优解的思想。
对于多机调度问题,我们可以采用以下贪心策略:1. 将所有作业按照所需时间从大到小排序;2. 将第一个作业分配给第一台机器;3. 对于剩余的作业,选择当前处理时间最短的那台机器进行分配;4. 重复步骤3直到所有作业都被分配完毕。
四、C语言实现下面是C语言实现多机调度问题贪心算法的代码:#include <stdio.h>#include <stdlib.h>#define MAX_JOB 1000#define MAX_MACHINE 1000int cmp(const void *a, const void *b) {return *(int *)b - *(int *)a;}int main() {int n, m, job[MAX_JOB], machine[MAX_MACHINE] = {0}; scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {scanf("%d", &job[i]);}qsort(job, n, sizeof(int), cmp);for (int i = 0; i < n; i++) {int min_time = machine[0], min_index = 0;for (int j = 1; j < m; j++) {if (machine[j] < min_time) { min_time = machine[j]; min_index = j;}}machine[min_index] += job[i]; }int max_time = machine[0];for (int i = 1; i < m; i++) {if (machine[i] > max_time) { max_time = machine[i];}}printf("%d\n", max_time);return 0;}五、代码解析1. 宏定义和头文件引入:```#define MAX_JOB 1000#define MAX_MACHINE 1000#include <stdio.h>#include <stdlib.h>```定义了最大作业数和最大机器数,并引入了标准输入输出库和标准库。
贪心算法—多机调度
贪心算法-多机调度一、问题描述设有n个独立的作业,由m台机器进行加工处理,作业i所需的处理时间为t(i)。
约定,任何作业可以在任何机器上加工处理,但未完成前不允许中断处理。
任何作业不能拆分成更小的子作业。
多机调度问题要求给出一种作业调度方案,使n个作业在尽可能短的时间内完成。
二、算法分析1当n<=m时,将机器i的【0~t(i)】时间分配给作业i即可。
2当n>m时,首先将n个作业按照时间从大到小排列。
然后照此顺序将作业分配给空闲的处理机即可。
3创建3个类:JobNode类,MachineNode类, MinHeap类分别用于作业信息,机器信息,对机器类型的堆处理三、代码#include<iostream>using namespace std;#define Max 15template <class Type>class MinHeap{public:MinHeap(int ms);~MinHeap();void Insert(const Type& x);void DeleteMin(Type& x);protected:void FilterDown();//自顶向下构造堆void FilterUp();//自底向上构造堆private:Type *heap;int length;};////////////////////////////////////////template <class Type>MinHeap<Type>::MinHeap(int m){heap=new Type[m+1];length=0;}////////////////////////////////////////template <class Type>void MinHeap<Type>::Insert(const Type& x) {heap[++length]=x;FilterUp();}////////////////////////////////////////template <class Type> template <class Type>void MinHeap<Type>::FilterUp(){//自底向上进行调整int i=length,j=i/2;//父节点的编号Type temp=heap[i];while(i>1){if(temp>=heap[j])break;//找到了相应的位置else{heap[i]=heap[j];i=j;j=i/2;}}heap[i]=temp;}////////////////////////////////////////template <class Type>void MinHeap<Type>::DeleteMin(Type &x){x=heap[1];heap[1]=heap[length];length--;FilterDown();}////////////////////////////////////////template <class Type>void MinHeap<Type>::FilterDown(){int i=1,j=i*2;Type temp=heap[i];while(j<=length){if(j<length && heap[j]>heap[j+1])j++;//如果左右子树都存在,找出最小者,用j标记if(temp<heap[j])break;//找到了相应的位置else{heap[i]=heap[j];i=j;j=2*i;}}heap[i]=temp;}////////////////////////////////////////template <class Type>MinHeap<Type>::~MinHeap(){delete[] heap;}////////////////////////////////////////class JobNode{friend void Greedy(JobNode *,int ,int);friend void main(void);public:operator int() const {return time;}int ID,time;};class MachineNode{friend void Greedy(JobNode *,int ,int); public:operator int() const {return avail;}int ID,avail;};void Sort(JobNode a[],int n){int i,j,k;JobNode tmp;for(i=1;i<n;i++){k=i;for(j=i+1;j<=n;j++){if(a[j].time<a[k].time) k=j;}if(k!=i){tmp=a[i];a[i]=a[k];a[k]=tmp;}}}void Greedy(JobNode a[],int n,int m){if(n<=m){cout<<"为每个作业分配一台机器."<<endl;return;}Sort(a,n);MinHeap<MachineNode>H(m);MachineNode x;for(int i=1;i<=m;i++){x.avail=0;x.ID=i;H.Insert(x);}for(i=n;i>=1;i--){H.DeleteMin(x);cout<<"\n将机器"<<x.ID<<"从"<<x.avail<<"到"<<(x.avail+a[i].time)<<"的时间段分配给作业"<<a[i].ID<<endl;x.avail+=a[i].time;H.Insert(x);}}void main(){int i;int job_cnt; //作业的数目float machine_cnt;//机器数目int Time_of_all=0;JobNode a[Max];//作业所需要的时间// MachineNode b[Max];cout<<"==========多机调度问题===========\n";cout<<"输入机器个数:";cin>>machine_cnt;cout<<"输入作业个数(小于15):";cin>>job_cnt;for(i=1;i<=job_cnt;i++){cout<<"\n请输入第"<<i<<"个作业处理时间:";cin>>a[i].time;a[i].ID=i;}Greedy(a,job_cnt,machine_cnt);}四、结果截图五.实验总结多机调度问题是生活中比较典型的例子,根据经验我们很好确定贪心算法的贪心标准,但是落实到编程,还是有点不够得心应手,还需要加强自己的编程能力。
贪心法之多机调度问题
采用最长处理时间作业优先的贪心选择策略,可以设计出解多机调度问题较好的近似算法。 当n<=m(作业数小于机器数)时,只要将机器 i 的 时间区间分配给作业 i 即可; 当n>m时,首先将n个作业从大到小排序,然后依此顺序将作业分配给空闲的处理机。也就是说从剩下的作业中,选择需要处理时间最
贪心法之多பைடு நூலகம்调度问题
问题描述:
设有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的处理时间为t[i]。 任何作业可以在任何一台机器上面加工处理,但未完 工之前不允许中断处理。任何作业不能拆分成更小的作业。 要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器 加工处理完成。
int i; int mi = 0; for(i=0;i<n;i++) {
mi = min(M); printf("第%d号作业,时间和最小的机器号为%d.时间和为%d:\n",i,mi,s[mi]); s[mi] = s[mi]+t[i];
} int ma = max(s,M); return ma; }
return max; }
//机器数大于待分配作业数 int setwork1(int t[],int n) {
int i; for(i=0;i<n;i++) {
s[i] = t[i]; } int ma = max(s,N); return ma; }
//机器数小于待分配作业数 int setwork2(int t[],int n) {
任务调度问题1—贪心算法
任务调度问题1—贪⼼算法这个问题是《算法导论》上的⼀个经典的贪⼼算法问题——单处理器上具有期限和惩罚的单位时间任务调度问题,⽬标是使惩罚最⼩。
输⼊:第⼀⾏⼀个数n,接下来第2⾏到第n+1⾏,第i⾏分别是d[i]和w[i],其中d[i]表⽰第i个任务的时限,w[i]表⽰第i个任务的惩罚,每个任务的完成时间为单位时间。
输出:⼀⾏⼀个数,为最⼩惩罚。
题解:令集合S为所有任务的集合,A为⼀个任务集合,其中所有的任务满⾜条件:存在某种调配⽅式,使得所有任务能在期限前完成,⼜令l为所有A集合的集合。
可以证明,序对M=(S,l)是⼀个拟阵,于是,可以采⽤贪⼼算法解决它。
同时,⼀个任务集合R属于l,当且仅当它满⾜下列条件:R中在期限在不⼤于t的任务不⼤于t个。
于是算法就出来了:先以w[i]为关键字进⾏排序,再进⾏枚举:保持⼀个数组record[i]保存当前集合中时限在不⼤于i的任务个数,对于每⼀个任务ai,将d[i]之后的record更新(加1),若有⼀个d[j]不满⾜条件,则继续检查下⼀个,反之,将它的惩罚从总惩罚中减去。
最后得到的总惩罚即最⼩惩罚。
代码:1 #include <iostream>2 #include <fstream>3using namespace std;4 ifstream fin("TSP.in");5 ofstream fout("TSP.out");6int w[2001],d[2001]; //w[i]指第i号任务的逾期惩罚,d[i]指第i号任务的期限,每个任务都是单位时间;7int record[2001];8int Max,ans;9int partion(int *a,int start,int end)10 {11int i=start,j=start-1,t=0;12for(i=start;i<=end;i++)13 {14if(a[i]>=a[end])15 {16 j++;17 t=a[i];18 a[i]=a[j];19 a[j]=t;20 t=d[i];21 d[i]=d[j];22 d[j]=t;23 }24 }25return j;26 }27int quicksort(int *a,int start,int end)28 {29if(start>=end)30return0;31int j=partion(a,start,end);32 quicksort(a,start,j-1);33 quicksort(a,j+1,end);34return0;35 }36int main()37 {38int n=0,i=0,j=0;39 fin>>n;40for(i=1;i<=n;i++)41 {42 fin>>d[i]>>w[i];43 }44 quicksort(w,1,n);45for(i=1;i<=n;i++)46 {47if(d[i]>=n+1)48 {49 Max+=w[i];50continue;51 }52for(j=d[i];j<=n;j++)53 {54if(record[j]+1>j)55break;56 }57if(j==n+1)58 {59for(j=d[i];j<=n;j++)60 record[j]++;61 Max+=w[i];62 }63 }64for(i=1;i<=n;i++)65 ans+=w[i];66 ans-=Max;67 fout<<ans<<endl;68 }拟阵作为⼀种⾼级结构,是在贪⼼算法的研究中所必须掌握的,同时也由于它的难度较⼤,更需要我们来认真学习。
多机调度问题贪心算法python代码
多机调度问题贪心算法1. 引言在计算机科学中,多机调度问题是一个重要的研究领域。
它涉及到将一组任务分配给多台机器,以最小化任务的完成时间或最大化机器的利用率。
贪心算法是解决多机调度问题的常用方法之一。
本文将介绍多机调度问题及其贪心算法的原理和实现。
2. 多机调度问题概述多机调度问题是指将一组任务分配给多台机器,使得任务能够在最短的时间内完成。
每个任务有一个预计的执行时间,每台机器有一个可用的执行时间。
任务可以在任何机器上执行,但每个任务只能在一台机器上执行一次。
目标是找到一种任务分配方案,使得所有任务的执行时间最小。
3. 贪心算法原理贪心算法是一种基于局部最优选择的算法。
在多机调度问题中,贪心算法的原理是每次选择执行时间最短的任务,并将其分配给执行时间最短的机器。
这样做的目的是尽量减少任务的等待时间,从而提高整体执行效率。
4. 贪心算法实现步骤贪心算法实现多机调度问题的一般步骤如下:4.1 输入任务和机器信息首先,需要输入任务的数量和每个任务的执行时间。
同时,还需要输入机器的数量和每台机器的可用执行时间。
4.2 初始化任务和机器列表根据输入的任务和机器信息,初始化任务列表和机器列表。
任务列表用于存储待分配的任务,机器列表用于存储每台机器的可用执行时间。
4.3 根据贪心策略选择任务和机器根据贪心策略,每次选择执行时间最短的任务,并将其分配给执行时间最短的机器。
选择完成后,更新机器的可用执行时间。
4.4 重复步骤4.3直到所有任务被分配重复步骤4.3,直到所有任务被分配给机器为止。
4.5 输出任务分配方案和完成时间输出任务分配方案和每个任务的完成时间。
5. 贪心算法的优缺点贪心算法在解决多机调度问题时具有以下优点: - 简单易实现,代码量较小; - 时间复杂度较低,通常为O(nlogn); - 对于某些特定的问题,贪心算法可以得到最优解。
然而,贪心算法也存在一些缺点: - 对于某些问题,贪心算法得到的解可能不是最优解; - 贪心策略的选择可能会影响最终结果; - 贪心算法不适用于所有类型的问题。
算法之多机调度问题
算法之多机调度问题用贪心法解决多机调度问题(1)问题的描述设有n个独立的作业{1,乙…,n},由m台相同的机器{Ml, M乙…,Mm}进行加工处理,作业i所需的处理时间为ti (l<i<n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。
多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
(2)算法设计思想解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。
(3)数据及解题过程设7个独立作业{匕2, 3, 4, 5, 6, 7}由3台机器{M2, M2, M3}加工处理,各作业所需的处理时间分别为{2, 14, 4,16, 6, 5, 3}。
贪心法产生的作业调度如下:(4)程序使用C++运行测试(5)代码如下:#include <iostream>#inelude vconio.h>using namespace std;〃冒泡法对作业时间t降序排列,作业编号P的顺序也随t的顺序改变而改变,这点很重要!void Dsc_Order_By_t(int t[],int p[],int n) 〃注意:数组元素下标从1 开始{〃你的代码int i,j;for (i=l;i<=n;i++)for (j=l;j<=n-i;j++){{int b=t[j+l];t[j+i]=tU];tU)=b;int g=p[j+l]; P D+I]=P U]; P U]=S; }}}for (i=l;i<=n;i++){cout«t[i]«,,\t n;}cout«e ndl;for (i=l;i<=n;i++)cout«e ndl;}void Processing(int p[],int t[],int n’int s[],int d[],int m){ 〃你的代码,根据书中伪代码编写,P154,算法7.9〃其中s[i]={p[i]}ffl位集合表示,代码^:s[i]|=(l«(p[i]-l))〃s[j]=s[j]+{p[i]}实际代码是:s[j]|=(l«(p[i]-l))^懂问我,把它搞清楚!int i; intj; for(i=l;i<=m;i++){s[i]|=(l«(p[i]-D);d[i]=t[i];}for(i=m+l;i<=n;i++){for(int k=l;k<m;k++){int o=d[k];if (o>d[k+l])o=d[k+l];j=k+l;}}sU]|=(l«(p[i]-D);d[j]二d[j]+t[i];}}void Output(int *p,int n,int *sjnt *d,int m) 〃阅读并理解这个函数{int max=0,k=l;cout«endl«"作业在各台机器上的安排如下:"«endl;for(int i=l;i<=m;i++){cout«K机器,,«i«n:for(intj=l;j<=n;j++) if((s[i]»(p[j]-l))&l) cout«*作业*«p0]«" ”; 〃理解位值运算!cout«"总耗时:”《d[i]vvendl;if(max<d[i]) {max=d[i]; k=i;}coutvv“\n“vvnvv”个作业在” vvmvv”台机器上执行完毕最少需要时间H«d[k]«endl;}int main()intp[]={0,l, 2,3, 4,5,6,7}, 〃作业编号,p[0]不用t[]={0,2,14,4,16,6,5,3}, 〃对应作业时间,t[0]不用s[]={0,0,0,0}, 〃机器处理的作业集合,女口:s⑴存放机器处理过的作业号,s[0]不用d[]二{0,000}; 〃机器处理作业的总时间,女口:d[2]存放机器处理过的作业的总时间,d[0]不用int n=sizeof(p)/sizeof(int)-l,m=sizeof(s)/sizeof(int)-l; //n-作业总数,m••机器台数Dsc_Order_By_t(t,p,n); 〃对作业根据运行时间t进行降序排列Processing(p,t,n,s,d,m); 〃用最长运行时间优先算法处理作业Output(p,n,s,d,m); 〃输出结果_getch();return 0;}运行结果图:。
贪心算法求解多机调度问题
多机调度问题一、 问题描述设有n个独立的作业{1,2,…,n},由m台相同的机器进行加工处理。
作业i所需的处理时间为t i。
现约定,任何作业可以在任何一台机器上加工处理,但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。
要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
二、 问题分析这是一个NP完全问题,到目前为止还没有有效的解法。
本报告根据教材指导及实践经验,采用贪心算法进行分析求解,并进行简单评估。
使用贪心算法,能避免许多复杂的子问题分析,便于直观地剖析主要问题。
在选择贪心算法的基础上,进一步地,我们采用最长处理时间作业优先的贪心选择策略,以求设计出解多机调度问题的较好的近似算法。
预期效果:根据最长处理时间作业优先的原则,理应能够得出直观下比较高效的输出结果。
三、算法设计与分析1.算法输入和输出输入:作业数n,机器数m,作业i对应的处理时间t i(t i在测试时用一个一维数组time表示)输出:总耗费时间2.算法说明最长处理时间作业优先的贪心算法,顾名思义,就是将目前还未被处理的且需要处理时间最长的作业,分配给最先空闲的机器,直到分配完所有的作业为止。
3.算法描述(1)(处理1):当n≤m时,只要将机器i的[0,t i]时间区间分配给作业i即可。
(2)(处理2):当n>m时:i.先将耗时最长的m个作业依次分配给m个机器ii.沿着时间轴,寻找最先得到空闲的机器。
将还未被处理且需要处理时间最长的那个作业分配给此机器iii.重复上一步直到所有作业都被处理完毕4.算法分析当n≤m时,算法需要O(1)时间。
当n>m时,算法需要O(nlogn)时间。
四、算法流程图输入是否n≤m处理1 处理2输出图4-1 多机调度算法流程图五、测试数据及其结果分析1.测试数据当输入n=7, m=3, time={2,14,4,16,6,5,3}时(教材示例),经历处理2,输出结果为17 当输入n=7, m=3, time={4,5,13,9,4,11,2}时,经历处理2,输出结果为20当输入n=18, m=3, time={1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9}时,经历处理2,输出结果为33当输入n=3, m=3, time={2,3,5}时,经历处理1,输出结果为52.结果分析观察可知,贪心算法解此问题,比直观感受要更高效。
贪心算法经典问题:活动安排,背包问题,最优装载,单源最短路径 Dijiksra,找零钱问题,多机调度
else a[i]=false;
}
return count;
}
背包问题
void Knapsack(int n,float M,float v[],float w[],float x[])
{Sort(n,v,w);//以每种物品单位重量的价值Vi/Wi从大到小排序
for(int i= 1;i<=n; i++)
{dist[i]=c[v][i]; s[i]=false;
if(dist[i]==maxint) prev[i]=0;
else prev[i]=v;
}
dist[v]=0 ; s[v]=true;
for(int i=1;i<n;i++)
{int temp = maxint, u = v;
if(newdist<dist[j]) {dist[j]= newdist;prev[j]=u; }
}
}//ENDFOR
}//END
找零钱问题
#define NUM4
void main()
{int m[NUM]={25,10,5,1};
int n;//假设n=99
cin>>n;
cout<<n<<"的找钱方案为:";
int max(int t[],int num);
int min(int t[],int m);
int set_work2(int t[],int n);
static int time[N]={2,8,18,32,50,72,98,128,182,200},s[M]={0,0,0};
贪心算法:任务调度问题
数据结构课程设计报告贪心算法:任务调度问题专业计算机科学与技术(软件工程)学生姓名陈亮班级BM计算机091学号**********指导教师吴素芹起止日期2011.1.10-2011.1.14***********目录1简介 (1)2算法说明 (2)3测试结果 (2)4分析与探讨 (8)5小结 (11)参考文献 (11)附录 (12)附录1 源程序清单 (12)贪心算法1 简介贪心算法通过一系列的选择来得到一个问题的解。
它所做的每一个选择都是当前状态下某种意义的最好选择,即贪心选择。
希望通过每次所做的贪心选择导致最终结果是问题的一个最优解。
这种启发式的策略并不总奏效,然而许多情况下确能达到预期的目的。
下面来看一个找硬币的例子。
假设有四种面值的硬币:一分、两分、五分和一角。
现在要找给某顾客四角八分钱。
这时,一般都会拿出四个一角、一个五分、一个两分和一个一分的硬币递给顾客。
这种找硬币的方法与其他的方法相比,它所给出的硬币个数是最少的。
在这里,就是下意思的使用了贪心算法(即尽可能地先考虑大币值的硬币)。
贪心算法并不是从整体最优加以考虑,它所做出的选择只是局部最优选择。
一些问题中,使用贪心算法得到的最后结果并不是整体的最优解,这时算法得到的是一次最优解(Suboptimal Solution)。
在上述的问题中,使用贪心算法得到的结果恰好就是问题整体的最优解。
对于一个具体的问题,怎么知道是否可用贪心算法来解此问题,以及能否得到问题的一个最优解呢?这个问题很难给予肯定的回答。
但是,许多可以用贪心算法求解的问题中一般具有两个重要的性质:贪心选择性质和最优子结构性质。
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择即贪心选择来达到,这是贪心算法可行的第一个基本要素。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所做的贪心选择最终将会得到问题的一个整体最优解。
首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。
基于贪心策略的资源约束多项目调度方法
基于贪心策略的资源约束多项目调度方法资源约束多项目调度是指在有限的资源下,对多个项目进行调度,以最大化项目的效益和资源利用率。
在实际生产中,资源约束多项目调度是一项非常重要的任务,因为它可以帮助企业提高生产效率、降低成本、提高产品质量等。
基于贪心策略的资源约束多项目调度方法是一种常用的调度方法。
贪心策略是指在每个阶段选择当前最优解的策略,以期望最终得到全局最优解。
在资源约束多项目调度中,贪心策略的核心思想是优先考虑那些能够最大化资源利用率的项目。
具体来说,基于贪心策略的资源约束多项目调度方法包括以下步骤:1. 确定项目的优先级。
优先级可以根据项目的紧急程度、重要性、利润等因素来确定。
2. 确定资源的约束条件。
资源的约束条件可以包括人力、物料、设备等方面的限制。
3. 根据项目的优先级和资源的约束条件,选择当前最优的项目进行调度。
具体来说,可以采用以下两种策略:(1)最小松弛度优先策略。
该策略的核心思想是优先考虑那些能够最大化资源利用率的项目。
具体来说,可以计算每个项目的松弛度,即项目最晚完成时间与最早完成时间之差,然后选择松弛度最小的项目进行调度。
(2)最小成本优先策略。
该策略的核心思想是优先考虑那些能够最大化利润的项目。
具体来说,可以计算每个项目的成本和收益,然后选择成本最小、收益最大的项目进行调度。
4. 根据调度结果,更新项目的状态和资源的利用情况。
如果某个项目已经完成,则需要将其从调度列表中删除,并释放相应的资源。
基于贪心策略的资源约束多项目调度方法具有以下优点:1. 算法简单易实现。
贪心策略是一种直观易懂的策略,不需要复杂的数学模型和算法。
2. 调度效果较好。
贪心策略可以在每个阶段选择当前最优解,以期望最终得到全局最优解。
因此,基于贪心策略的资源约束多项目调度方法可以得到较好的调度效果。
3. 适用范围广。
基于贪心策略的资源约束多项目调度方法可以适用于各种不同的生产环境和项目类型。
总之,基于贪心策略的资源约束多项目调度方法是一种常用的调度方法,具有算法简单易实现、调度效果较好、适用范围广等优点。
多机调度问题贪心算法python代码
多机调度问题贪心算法python代码多机调度问题是一种经典的优化问题,它的目标是在多台机器上完成一组任务,使得任务完成时间最短。
贪心算法是求解这个问题的一种有效方法。
贪心算法的基本思想是每次选择当前最优的解决方案,直到达到全局最优解。
在多机调度问题中,我们可以采用以下贪心策略来求解:1. 将所有任务按照完成时间从小到大排序。
2. 将第一个任务分配给第一台机器。
3. 对于剩余的任务,将其分配给当前完成时间最早的机器。
4. 重复步骤3直到所有任务都被分配完毕。
下面是使用Python实现多机调度问题贪心算法的代码:```pythondef schedule(tasks, m):# 按照完成时间从小到大排序tasks.sort(key=lambda x: x[1])# 初始化每台机器的完成时间为0machines = [0] * m# 分配任务for task in tasks:# 找到当前完成时间最早的机器min_time = machines[0]min_machine = 0for i in range(1, m):if machines[i] < min_time:min_time = machines[i]min_machine = i# 将任务分配给该机器并更新其完成时间machines[min_machine] += task[0]# 返回完成时间最晚的机器的完成时间return max(machines)```该代码中,tasks是一个元素为元组的列表,每个元组表示一个任务,第一个元素为任务的处理时间,第二个元素为任务的完成时间。
m表示机器的数量。
我们可以使用以下代码来测试该函数:```pythontasks = [(2, 6), (3, 7), (4, 8), (4, 9), (5, 10)]m = 3print(schedule(tasks, m))```输出结果为:```12```这表示将这些任务分配给3台机器后,完成所有任务需要的最短时间为12。
贪心算法多机调度问题C++程序
实验内容:多机调度问题设有n项独立的作业{1,2,…, n},由m 台相同的机器加工处理。
作业i 所需要的处理时间为台相同的机器加工处理。
设有n 项独立的作业由ti。
约定:任何一项作业可在任何一台机器上处理,但未完工前不准中断处理;任何作业不能拆分成更小的子作业。
多机调度问题要求给出一种调度方案,能拆分成更小的子作业。
多机调度问题要求给出一种调度方案,使所给的n 个作业在尽可台机器处理完。
利用贪心策略,设计贪心算法解决多机调度问题,能短的时间内由m 台机器处理完。
利用贪心策略,设计贪心算法解决多机调度问题,并计算其时间复杂度。
多机调度问题的一个实例:多机调度问题的一个实例:项独立的作业{1,2,3,4,5,6,7},要由三台机器M1, M2 ,M3 处理。
各个作业所需处理。
各个作业所需例如设有7 项独立的作业,要的处理时间分别为{2,14,4,16,6,5,3}。
利用你设计的贪心算法,要的处理时间分别为。
利用你设计的贪心算法,安排作业的处理顺序使得机器处理作业的时间最短。
器处理作业的时间最短。
#include <iostream>using namespace std;void Greedy(int t[],int n,int m);int main() {int n=7,m=3,t[]={2,14,4,16,6,5,3};//待分配的工作Greedy(t,n,m);return 0; }void Greedy(int t[],int n,int m){ int flagn,flagm; int M[]={0,0,0,0,0,0,0,0};for(int i=0;i<n;i++){ int max=0,min=10000;flagn=0;flagm=0;for(int j=0;j<n;j++)//选择时间最多的工作{ if(max<t[j]) { max=t[j]; flagn=j; } }for(j=0;j<m;j++)//选择工作量最小的机器{if(M[flagm]>M[j]){flagm=j;}}M[flagm]=M[flagm]+t[flagn]; t[flagn]=0; //被选择过的机器时间调为0 cout<<flagn<<"work "<<flagm<<"machine"<<endl; } }。
基于回溯法和贪婪法的多机调度问题
目录一. 课程实验概述 (1)1.目的与任务 (1)2.开发环境 (1)3.软件配置 (1)4.参考资料 (1)5.任务完成的一般过程 (1)6.个人完成的程序模块和文档清单 (1)二. 介绍本小组个人的构思与创意 (1)三、介绍自己在小组中完成的工作的具体过程 (2)四、算法与代码解析 (2)1.流程图 (2)2.关键代码,算法复杂度 (4)3.算法在解题中的应用策略 (7)4.程序运行结果 (7)5.问题、解决方法及编程体会 (10)五、实验个人小结 (10)一. 课程实验概述1.目的与任务将对n个独立作业如何分配在m台相同的机器加工处理的多机调度问题进行解决,这就是我们要解决的任务。
目的在于编写一个程序使得解决问题的过程以图形界面方式动态的展示出来,以让用户能够轻易的看出解决的方案以及过程。
2.开发环境系统:Windows 7硬件条件:PC机3.软件配置编程语言:java开发软件:eclipse本程序需要先装好jdk,并修改环境变量,才能运行。
4.参考资料王晓东编著《算法设计与分析(第二版)》清华大学出版社5.任务完成的一般过程首先通过新建工程并确定n与m的大小,随机生成每个独立作业所要完成的时间,也可以对工作时间表的数据进行修改。
然后可以选择以贪心算法来进行求解得到的近似结果,或者以回溯法来进行求解得到的准确结果。
求解结果将会以分阶段柱图的形式展现。
6.个人完成的程序模块和文档清单文本清单为课程设计报告一份。
二. 介绍本小组个人的构思与创意三、介绍自己在小组中完成的工作的具体过程我们小组在一开始就确立了课程设计的方向为多机调度问题,因为对于这个问题的图形界面展示我们有很好的思路,就是以分阶段动态形式的柱图来展示。
因为这个问题较为简单,在贪心算法还是回溯法过程中都没有遇到什么困难,问题主要出现在数据的传递,以及图形界面的设计上,经过反复的修改与考虑之后一一解决。
我们最满意的是我们的界面,以及用不同的颜色代表不同的作业来形成柱图,从而更好的展示出方案的解决过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//多机调度问题
/*
贪心法求解多级调度问题的贪心策略师最长处理时间的作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样就可以保证处理时间长的
作业优先处理,从而在整体上获得尽可能短的时间。
按照最长处理时间作业优先的贪心测落,当m>n,时,只要将机器ide [0,ti)时间去见分配给作业j即可,
当m<n时,首先将n个作业从大到小排序,然后依次顺序将作业分配给空闲的处理机
算法伪代码
将数组t[n]从大到小排序,对应的作业序号存储在数组p[n]中;
将数组d[m]初始化为零
3:for(i0;i<=m;i++)
3.1:s[i]={p[i]}:将m个作业分配给m个机器
3.2 d[i]=t[i];
for(i=m+1;i<=n;i++)
4.1 j=数组d[m]中最小值对应的下标;//j为最先空闲的机器序号
4.2 s[j]=s[j]+{p[i]};//将作业分配给最先空闲的的机器j
4.3 d[j]=d[j]+d[t];//机器j将在d[j]后空闲
*/
#include<iostream>
using namespace std;
void lowsort(int *t,int *p,int n)//将数组t[n]按从小到大的顺序排序,相应的任务编号数组p[n]也要随之改变
{
int index;
for(int i=0;i<n;i++)
{
index=i;
for(int j=i+1;j<n;j++)
{
if(t[index]<t[j])
index=j;
}
if(index!=i)
{
int temp;
temp=t[index];
t[index]=t[i];
t[i]=temp;
temp=p[i];
p[i]=p[index];
p[index]=temp;
}
}
int find(int *d,int m)
{
int min=d[0];
int k;
for(int i=0;i<m;i++)
{
if(d[i]<min)
{
min=d[i];
k=i;
}
}
return k;
}
void ajust(int *t,int *d,int *p,int *s,int n,int m)
{
lowsort(t,p,n);
for(int i=0;i<m;i++)
{
d[m]=0;
}
for(i=0;i<m;i++)
{
s[i]=p[i];
cout<<"机器"<<i+1<<"做了任务"<<p[i]<<endl;
d[i]=t[i];
}
for(i=m;i<n;i++)
{
int j=find(d,m);//查找数组d[m]中最小值对应的下标
s[j]=s[j]+p[i];
cout<<"机器"<<j+1<<"做了任务"<<p[i]<<endl;
d[j]=d[j]+t[i];
}
}
void main()
int n,m;
cout<<"输入任务数量"<<endl;
cin>>n;
cout<<"输入机器个数"<<endl;
cin>>m;
int *t=new int [n];
int *s=new int [n];
int *d=new int [m];
int *p=new int[n];
cout<<"输入任务编号"<<endl;
for(int k=0;k<n;k++)
cin>>p[k];
cout<<"每件任务所花费的时间"<<endl;
for(int i=0;i<n;i++)
cin>>t[i];
ajust(t,d,p,s,n,m);
}。