表上作业法的源代码

表上作业法的源代码
表上作业法的源代码

/* 表上作业法的源代码*/

#include "stdio.h"

#include "alloc.h"

#include "math.h"

/* #define debug */

#define a(j) (*(C+(M-1)*N+j)) /*销量数组*/

#define b(i) (*(C+i*N+N-1)) /*产量数组*/

#define c(i,j) (*(C+i*N+j)) /*运价数组*/

#define x(i,j) (*(X+i*(N-1)+j)) /*运量数组*/

/*(<1.0E15:基本解,>=1.0E15:运量为0) */

#define s(i,j) (*(S+i*(N-1)+j)) /*检验数数组Sij */ #define u(i) (*(U+i)) /*位势数组Ui*/

#define v(i) (*(V+i)) /*位势数组Vi*/

#define cpi(k) ((CP+k)->i) /*闭回路点i标*/

#define cpj(k) ((CP+k)->j) /*闭回路点i标*/

#define cpf(k) ((CP+k)->f) /*闭回路点i标*/

/* f=0:j++; f=2:j--;

f=1;i--; f=3:i++; */

/*void TP(int M,int N,double *C,double *X); */

10 6 30

0 20 30 40 50 60

12 7 14 16 9 10 9 13 8 14

183 185 119 162 137 102 179 118 114

189 107 169 161 179 169 140 135 112

184 149 128 106 165 178 199 183 194

127 184 173 124 125 151 127 178 160

162 105 150 185 179 153 174 121 142

108 163 157 138 189 171 114 131 165

150 159 131 155 135 165 124 167 107

109 107 149 175 162 108 182 135 181

106 136 183 134 179 188 136 131 189

166 158 159 180 162 104 116 159 111

void main()

{

int M,N,i,j;

double *C; /*存储运价,产量及销量*/

double *X; /*存储运量分配方案*/

float z;

FILE *fp;

char fn[80];

double sum;

void TP(int M,int N,double *C,double *X);

printf("please input the data file name: ");

scanf("%s",fn);

if((fp=fopen(fn,"r"))==NULL)

{

}

fscanf(fp,"%d%d",&M,&N);

M++; N++;

X=(double *)malloc(sizeof(double)*(M-1)*(N-1));

C=(double *)malloc(sizeof(double)*M*N);

/* 把运价,供应量和需求量的数据读入到数组c(i,j); */

/*---高太光:这里可以直接定义固定的数组c(i,j),也可以从文件读取

for(i=0;i

{

for(j=0;j

{

fscanf(fp,"%f",&z);

c(i,j)=z;

}

printf("\n");

}

fclose(fp);

/* output c(i,j); */

printf("\n=============Data File================\n");

for(i=0;i

for(j=0;j

{

printf("%10.3f",c(i,j));

}

printf("\n");

}

getch();

TP(M,N,C,X);

/* 输出产销分配方案; */

printf("\n=============Best Solution===================\n"); sum=0;

for(i=0;i

{

for(j=0;j

{

if(x(i,j)>=1.0e15)

printf("%10s","******");

else

{printf("%10.3f",x(i,j));

sum+=(x(i,j)*c(i,j));

}

}

printf("\n");

}

printf("\n\n\tThe min Cost is: %-10.4f\n",sum);

}

struct PATH{

int i,j,f;

}; /*记录闭回路点结构*/

void TP(int M,int N, double *C,double *X)

{

double *U,*V,*S;

int MN1,m,n;

struct PATH *CP;

int k,i,j,l,k1,l1,ip;

double Cmin,sum;

int I0,J0,Imin,Jmin;

int fi,fj,fc,f;

MN1=(M-1)+(N-1)-1;

m=M-1;n=N-1;

S=(double *)malloc(sizeof(double)*(M-1)*(N-1));

U=(double *)malloc(sizeof(double)*M);

V=(double *)malloc(sizeof(double)*N);

CP=(struct PA TH *)malloc(sizeof(struct PATH)*(MN1+1)); #ifdef debug

printf("\nM=%d,N=%d,m=%d,n=%d\n",M,N,m,n);

printf("\nb(i)is following:\n");

for(i=0;i

printf("%8.4f\t",b(i));

printf("\na(j)is folowing:\n");

for(j=0;j

printf("%8.4f\t",a(j));

printf("\n");

getch();

#endif

/*解初始化Xij=1.0e15; */

for(i=0;i

for(j=0;j

x(i,j)=1.0e15;

/*最小元素法求初始可行解*/

for(k=0;k

{

Cmin=1.0e15;

for(i=0;i

{

fi=0;

for(l=0;l

/* 去除已经用过的行; */

if(i==cpi(l)){fi=1;break;}

}

if(fi==1)continue;

for(j=0;j

{

fj=0;

for(l=0;l

{

/* 去除已经用过的列; */

if(j==cpj(l)){fj=1;break;}

}

if(fj==1) continue;

if(Cmin>c(i,j))

{

Cmin=c(i,j);I0=i;J0=j;

#ifdef debug

printf("\n now c(i,j)=%8.4f\n",c(i,j));

#endif

}

} /*end for j */

}/* end for i */

/*得到了未划去的最小运价所在格的坐标(I0,J0)和最小运价Cmin */

if(k>0)

{if(Cmin==1.0e15&&cpi(k-1)==0)

{for(l1=0;l1

if(x(l1,cpj(k-1))==1.0e15)

{x(l1,cpj(k-1))=0;

}

}

else if(Cmin==1.0e15&&cpi(k-1)!=0)

{for(l1=0;l1

if(x(cpi(k-1),l1)==1.0e15)

{x(cpi(k-1),l1)=0;

}

}

}

if(b(I0)

{

cpi(k)=I0;cpj(k)=-1;

x(I0,J0)=b(I0);

#ifdef debug

printf("I0=%d,J0=%d,x(I0,J0)=%8.4f,k=%d,cpi(k)=%d,cpj(k)=%d\n",I0,J0,x(I0,J0),k,cpi(k),cpj(k));

#endif

a(J0)-=b(I0);

b(I0)=0;

}

else

{

x(I0,J0)=a(J0);

#ifdef debug

printf("I0=%d,J0=%d,x(I0,J0)=%8.4f,k=%d,cpi(k)=%d,cpj(k)=%d\n",I0,J0,x(I0,J0),k,cpi(k),cpj(k));

#endif

b(I0)-=a(J0);

a(J0)=0;

}

} /*END FOR K 用最小元素法求得了初使可行解*/

/*输出初始可行解*/

printf("\n=============init Solution===================\n");

sum=0;

for(i=0;i

{

for(j=0;j

{

if(x(i,j)>=1.0e15)

printf("%10s","******");

else

{printf("%10.3f",x(i,j));

sum+=(x(i,j)*c(i,j));

}

}

printf("\n");

}

printf("\n\n\tThe Cost is: %-10.4f\n",sum);

getch();

/***************循环换入换出,直到检验数为非负数*****************************/

/*循环决定换入变量*/

while(1)

{

/*位势置初值Ui,Vi=1.0e15 */

for(i=0;i

u(i)=1.0e15;

for(j=0;j

v(j)=1.0e15;

/*求位势*/

l=0;u(0)=0;

for(i=0;i

{

for(j=0;j

{

if(u(i)>=1.0e15&&v(j)>=1.0e15&&x(i,j)<1.0e15)

{

cpi(l)=i;cpj(l)=j;l++; /*记录未求过位势的位置*/

}

else if(x(i,j)<1.0e15&&u(i)<1.0e15)

{v(j)=c(i,j)-u(i);}

else if(x(i,j)<1.0e15&&v(j)<1.0e15)

{u(i)=c(i,j)-v(j);}

}/*end for i */

/*按记录位置求其余位势*/

if(l>0)

{

while(1)

{

ip=0;

for(k=0;k

{

i=cpi(k);j=cpj(k);

if((u(i)>=1.0e15)&&(v(j)>=1.0e15)&&(x(i,j)<1.0e15))

{

cpi(ip)=i;cpj(ip)=j;ip++; /*记录未求过位势的位置*/

}

else if(x(i,j)<1.0e15&&u(i)<1.0e15)

{v(j)=c(i,j)-u(i);}

else if(x(i,j)<1.0e15&&v(j)<1.0e15)

{u(i)=c(i,j)-v(j);}

}/*end for k */

if(ip==0)break;

l=ip;

}/*end for while */

} /*end if l */

#ifdef debug

printf("\nU(i):");

for(i=0;i

{printf("%10.2f",u(i));

}

printf("\nV(j):");

for(j=0;j

{printf("%10.2f",v(j));

}

printf("\n");

#endif

/*求检验数*/

for(i=0;i

{

for(j=0;j

{ s(i,j)=1.0e15;

if(x(i,j)>=1.0e15) s(i,j)=c(i,j)-u(i)-v(j);

}

}

/*求最小检验数*/

Cmin=1.0e15;

for(i=0;i

{

for(j=0;j

if(Cmin>s(i,j))

{Cmin=s(i,j);I0=i;J0=j;}

}

}

#ifdef debug

printf("\ncheck number:\n");

for(i=0;i

{

for(j=0;j

{

printf("s(%d,%d)=%-10.2f\n",i,j,s(i,j));

}

printf("\n");

}

printf("Smin=%-10.2f",Cmin);

getch();

#endif

if(Cmin>=0) return; /*已经得到最优解,返回主程序*/ /*此时找到了入基变量X(I0,J0) */

/*求闭回路*/

for(k=0;k

{

cpf(k)=-1;

}/*end for k */

cpi(0)=I0;cpj(0)=J0;

k=0;

while(1)

{

f=cpf(k);

/*设置闭回路搜索方向*/

while(1)

{

i=cpi(k);j=cpj(k);

fc=0;

f++;

cpf(k)=f;

if(f>=4)break;

/*避免反向搜索*/

if(k>0)

{

if(f==0&&cpf(k-1)==2) continue;

else if(f==1&&cpf(k-1)==3)continue;

else if(f==2&&cpf(k-1)==0)continue;

else if(f==3&&cpf(k-1)==1)continue;

}

if(f==0)

{/*沿J+方向搜索*/

while(1)

{

if(j>=n){fc=2;break;}

if((i==I0)&&(j==J0))

{fc=1;break;}

if(s(i,j)>=1.0e15)

{fc=3;break;}

}

}/*end j+ */

else if(f==1)

{ /*沿i-方向搜索*/

while(1)

{ i--;

if(i<0){fc=2;break;}

if((i==I0)&&(j==J0)){fc=1;break;}

if(s(i,j)>=1.0e15){fc=3;break;}

}

}/*end if=1 */

else if(f==2)

{/*沿J-方向搜索*/

while(1)

{

j--;

if(j<0){fc=2;break;}

if((i==I0)&&(j==J0)){fc=1;break;}

if(s(i,j)>=1.0e15){fc=3;break;}

}

} /*end f==2 */

else if(f==3)

{/*沿I+方向搜索*/

while(1)

{

i++;

if(i>=m){fc=2;break;}

if((i==I0)&&(j==J0)){fc=1;break;}

if(s(i,j)>=1.0e15){fc=3;break;}

}

}/*end f==3 */

if((fc==1)||(fc==3))break;

}/*end while flag 2 */

if(fc==0)

{/*沿些方向搜索失败,退回回到前一点*/ k--;

}

else if(fc==1)break; /*搜索完成*/

else if(fc==3)

{/*沿此方向搜索成功,前进一点*/

k++;

cpi(k)=i;cpj(k)=j;

#ifdef debug

printf("\n");

getch();

#endif

cpf(k)=-1;

}

}/*end while */

/*去除闭回路中的非转折点*/

l=0;

while(l

{ i=l+1;

while(i<=k)

{if(cpf(l)==cpf(i)) i++;

else break;

}

if(i>(l+1))

{j=l+1;

k1=k-(i-j);

/*如果某些点前进方向相同,则去除中间各点*/ while(i<=k)

{cpi(j)=cpi(i);

cpj(j)=cpj(i);

cpf(j)=cpf(i);

i++;j++;

}

l+=2;

k=k1;

}

else l++;

}/*end while l

/*查找闭回路上基本解的最小值*/

Cmin=x(cpi(1),cpj(1));

Imin=cpi(1);Jmin=cpj(1);

for(i=3;i<=k;i+=2)

{if(Cmin>x(cpi(i),cpj(i)))

{Cmin=x(cpi(i),cpj(i));

Imin=cpi(i);Jmin=cpj(i);

}

}

/*换入基变量*/

x(I0,J0)=Cmin;

for(i=1;i<=k;i+=2)

{x(cpi(i),cpj(i))-=Cmin;

if((i+1)<=k) x(cpi(i+1),cpj(i+1))+=Cmin;

}

x(Imin,Jmin)=1.0e15;

}

free(CP);

free(V);

free(U);

free(S);

}

================END====================

处理器调度习题

处理器调度 选择题 当CPU执行操作系统代码时,则处理机处于( )。 A.执行态 B.目态 C.管态 D.就绪态 ( )是机器指令的扩充,是硬件的首次延伸,是加在硬件上的第一层软件。 A.系统调用 B.操作系统 C.内核 D.特权指令 操作系统提供给程序员的接口是( )。 A.进程 B.系统调用 C.库函数 D.B和C 用户程序向系统提出使用外设的请求方式是( )。 A.作业申请 B.原语 C.系统调用 D.I/O指令 当作业正常完成进入完成状态时,操作系统( )。 A.将输出该作业的结果并删除内存中的作业 B.将收回该作业的所占资源并输出结果 C.将收回该作业的所占资源及输出结果,并删除该作业 D.将收回该作业的所占资源及输出结果,并将它的控制块从当前的队列中删除 下列选项是关于作业和进程关系的描述,其中哪一个是不正确的( )。 A.作业的概念主要用在批处理系统中,而进程的概念则用在几乎所有的OS中。 B.作业是比进程低一级的概念。 C.一个作业至少由一个进程组成。 D.作业是用户向计算机提交任务的实体,而进程是完成用户任务的执行实体以及向系统申请分配资源的基本单位。 作业从后备作业到被调度程序选中的时间称为( )。 周转时间B.响应时间C.等待调度时间D.运行时间 设有三个作业J1,J2,J3,它们同时到达,运行时间分别为T1,T2,T3,且T1≤T2≤T3,若它们在一台处理机上按单道运行,采用短作业优先算法,则平均周转时间为( )。 A.T1+T2+T3 B.1/3(T1+T2+T3) C.T1+2/3T2+1/3T3 D.T1+1/3T2+2/3T3 从作业提交给系统到作业完成的时间间隔称为作业的( )。 A.中断时间 B.等待时间 C.周转时间 D.响应时间 设有四个作业同时到达,每个作业执行时间均为2 h,它们在一台处理机上按单道方式运行,则平均周转时间为( )。 A.1 h B.5 h C.2.5 h D.8 h FCFS调度算法有利于( )。 A.长作业和CPU繁忙型作业 B.长作业和I/O繁忙型作业 C.短作业和CPU繁忙型作业 D.短作业和I/O繁忙型作业 下列哪种说法不是SJ(P)F调度算法的缺点( )。 A.对于长作业(进程)不利 B.未考虑作业(进程)的紧迫程度 C.不能有效降低作业(进程)的平均等待时间 D.由于根据的是用户提供的估计执行时间,因此不一定真正做到短而优先。 选择排队进程中等待时间最长的进程被优先调度,该调度算法是( )。 A.先来先服务调度算法B.短进程优先调度算法 C.优先权调度算法D.高响应比优先调度算法 在采用动态优先权的优先权调度算法中,如果所有进程都具有相同优先权初值,则此时的优先权调度算法实际上和( )相同。

表上作业法

表上作业法 什么是表上作业法 表上作业法是指用列表的方法求解线性规划问题中运输模型的计算方法。是线性规划一种求解方法。当某些线性规划问题采用图上作业法难以进行直观求解时,就可以将各元素列成相关表,作为初始方案,然后采用检验数来验证这个方案,否则就要采用闭合回路法、位势法等方法进行调整,直至得到满意的结果。这种列表求解方法就是表上作业法。 [编辑] 表上作业法的步骤[1] 1、找出初始基本可行解(初始调运方案,一般m+n-1个数字格),用西北角法、最小元素法; (1)西北角法: 从西北角(左上角)格开始,在格内的右下角标上允许取得的最大数。然后按行(列)标下一格的数。若某行(列)的产量(销量)已满足,则把该行(列)的其他格划去。如此进行下去,直至得到一个基本可行解。 (2)最小元素法: 从运价最小的格开始,在格内的右下角标上允许取得的最大数。然后按运价从小到大顺序填数。若某行(列)的产量(销量)已满足,则把该行(列)的其他格划去。如此进行下去,直至得到一个基本可行解。 注:应用西北角法和最小元素法,每次填完数,都只划去一行或一列,只有最后一个元例外(同时划去一行和一列)。当填上一个数后行、列同时饱和时,也应任意划去一行(列),在保留的列(行)中没被划去的格内标一个0。 2、求出各非基变量的检验数,判别是否达到最优解。如果是停止计算,否则转入下一步,用位势法计算; 运输问题的约束条件共有m+n个,其中:m是产地产量的限制;n是销地销量的限制。其对偶问题也应有m+n个变量,据此: σ ij = c ij? (u i + v j) ,其中前m个计为,前n个计为

由单纯形法可知,基变量的σ ij = 0 c ij? (u i + v j) = 0因此u i,v j可以求出。 3、改进当前的基本可行解(确定换入、换出变量),用闭合回路法调整; (因为目标函数要求最小化) 表格中有调运量的地方为基变量,空格处为非基变量。基变量的检验数σ ij = 0,非基变量的 检验数。σ ij < 0表示运费减少,σij > 0表示运费增加。 4、重复②,③,直到找到最优解为止。 [编辑] 表上作业法计算中的问题 1、无穷多最优解 产销平衡的运输问题必定存最优解。如果非基变量的σ ij = 0,则该问题有无穷多最优解。 2、退化 表格中一般要有(m+n-1)个数字格。但有时,在分配运量时则需要同时划去一行和一列,这时需要补一个0,以保证有(m+n-1)个数字格。一般可在划去的行和列的任意空格处加一个0即可。 [编辑] 表上作业法案例分析 [编辑] 案例一:表上作业法在物流配送中的应用[2] 配送是物流系统的一项十分重要的功能。随着物流行业的发展,物流公司迅速增加,各个物流公司之间的竞争日趋激烈。如何加强管理以减少成本问题成为各物流公司非常关注的话题。一般来说,配送中心数量减少,配送中心距离客户的距离就会越长,配送成本就越高;配送中心数量增多,配送中心距离客户的距离就会缩短,配送成本就越少,但是配送中心的管理成本随之增加。本文讨论利用现有的配送中心向客户的配送问题,寻求最小的配送成本。

3-2 作业调度算法

第二讲作业调度算法主讲教师:张新彩

3.2 作业调度算法 3.2.1 先来先服务算法 3.2.2 短作业 / 进程优先算法 3.2.3 优先级调度算法 3.2.4 高响应比优先调度算法

3.2.1 先来先服务算法 ?适用于作业调度 ?从后备作业队列中选择一个或多个最先进入的作业,将 它们调入内存,为它们分配资源、创建进程,然后放入 就绪队列。 ?适用于进程调度 ?从就绪进程队列中选择一个最先进入的进程,为之分配 处理机,使之投入运行;直到运行完成或阻塞,才会让 出处理机。

3.2.1 先来先服务算法 4 平均周转时间为(4+6+10+11+14)/5=9 作业A 、B 、C 、D 、E 分别在0、1、2、3、4时刻到达,需要的服务时间分别为4、3、5、2、4。请用先来先服务算法计算它们的完成时间、周转时间、带权周转时间和平均周转时间。 作业 名 到达 时间 服务 时间 开始执 行时间 完成 时间 周转 时间 带权周 转时间 A 4 B 1 3 C 2 5 D 3 2 E 4 4 4 7 12 14 1 2 2 5.5 0 4 7 12 4 6 10 11 18 3.5 14 14 简单易实现,有利于长作业,不利于短作业

3.2.2 短作业 / 进程优先算法 ?短作业优先(SJF) ?从后备队列中选择一个或多个估计运行时间最短的作业 调入内存。 ?短进程优先(SPF) ?从就绪队列中选出一个估计运行时间最短的进程,将处 理机分配给它,使它立即执行。

3.2.2 短作业 / 进程优先算法 6 平均周转时间为(4+3+8+9+16)/5=8 作业 名 到达 时间 服务 时间 开始执 行时间 完成 时间 周转 时间 带权周 转时间 作业A 、B 、C 、D 、E 分别在0、1、2、3、4时刻到达,需要的服务时间分别为4、3、5、2、4。请用短作业优先算法计算它们的完成时间、周转时间、带权周转时间和平均周转时间。 4 1 0 4 6 1. 5 4 3 9 8/3 6 8 13 9/4 9 9 18 16/5 13 16 D 3 2 B 1 3 E 4 4 C 2 5 A 0 4

处理器调度习题教学内容

处理器调度习题

处理器调度 选择题 ?当CPU执行操作系统代码时,则处理机处于( )。 ?A.执行态 B.目态 C.管态 D.就绪态 ?( )是机器指令的扩充,是硬件的首次延伸,是加在硬件上的第一层软件。 ?A.系统调用 B.操作系统 C.内核 D.特权指令 ?操作系统提供给程序员的接口是( )。 ?A.进程 B.系统调用 C.库函数 D.B和C ?用户程序向系统提出使用外设的请求方式是( )。 ?A.作业申请 B.原语 C.系统调用 D.I/O指令 ?当作业正常完成进入完成状态时,操作系统( )。 ?A.将输出该作业的结果并删除内存中的作业 ?B.将收回该作业的所占资源并输出结果 ?C.将收回该作业的所占资源及输出结果,并删除该作业 ?D.将收回该作业的所占资源及输出结果,并将它的控制块从当前的队列中删除 ?下列选项是关于作业和进程关系的描述,其中哪一个是不正确的( )。 ?A.作业的概念主要用在批处理系统中,而进程的概念则用在几乎所有的OS中。 ?B.作业是比进程低一级的概念。 ?C.一个作业至少由一个进程组成。 ?D.作业是用户向计算机提交任务的实体,而进程是完成用户任务的执行实体以及向系统申请分配资源的基本单位。 ?作业从后备作业到被调度程序选中的时间称为( )。 ?周转时间B.响应时间C.等待调度时间D.运行时间 ?设有三个作业J1,J2,J3,它们同时到达,运行时间分别为T1,T2,T3,且T1≤T2≤T3,若它们在一台处理机上按单道运行,采用短作业优先算法,则平均周转时间为( )。 ?A.T1+T2+T3 B.1/3(T1+T2+T3) ?C.T1+2/3T2+1/3T3 D.T1+1/3T2+2/3T3 ?从作业提交给系统到作业完成的时间间隔称为作业的( )。 ?A.中断时间 B.等待时间 C.周转时间 D.响应时间 ?设有四个作业同时到达,每个作业执行时间均为2 h,它们在一台处理机上按单道方式运行,则平均周转时间为( )。 ?A.1 h B.5 h C.2.5 h D.8 h ?FCFS调度算法有利于( )。 ?A.长作业和CPU繁忙型作业 B.长作业和I/O繁忙型作业 ?C.短作业和CPU繁忙型作业 D.短作业和I/O繁忙型作业 ?下列哪种说法不是SJ(P)F调度算法的缺点( )。 ?A.对于长作业(进程)不利 ?B.未考虑作业(进程)的紧迫程度 ?C.不能有效降低作业(进程)的平均等待时间 ?D.由于根据的是用户提供的估计执行时间,因此不一定真正做到短而优先。 ?选择排队进程中等待时间最长的进程被优先调度,该调度算法是( )。 ?A.先来先服务调度算法B.短进程优先调度算法 ?C.优先权调度算法D.高响应比优先调度算法 ?在采用动态优先权的优先权调度算法中,如果所有进程都具有相同优先权初值,则此时的优先权调度算法实际上和( )相同。 ?A.先来先服务调度算法B.短进程优先调度算法

表上作业法

运输问题的求解方法 ——表上作业法 产销平衡表与单位运价表 表上作业法 一、产销平衡表与单位运价表 运输问题还可用产销平衡表与单位运价表进行描述。 假设某种物资有m个生产地点Ai(i=1,2,…,m),其产量(供应量)分别为ai(i=1,2,…,m),有n个销地Bj(j=1,2,…,n),其销量(需求量)分别为bj(j=1,2,…,n)。从Ai到Bj运输单位物资的运价(单价)为Cij。将这些数据汇总可以得到产销平衡表和单位运价表5.3.1。 表5.3.1 产销平衡表与单位运价表 二、表上作业法 运输这一类特殊问题可用更加简便的求解方法———表上作业法求解,实质仍是单纯形法,步骤如下: (1)确定初始调运方案,即找出初始基可行解,在产销平衡表上给出m+n-1个数字格。 (2)求非基变量的检验数,即在表上计算空格的检验数,判别是否达到最优解:是否存在负的检验数?如果存在负的检验数,则初始调运方案不是最优方案;如果所有检验数都非负,则初始调运方案已经是最优方案了。如果已经得到最优调运方案,则停止计算,否则转入下一步。 (3)确定换入变量和换出变量,找出新的调运方案(新的基可行解),即在表上用闭回路法进行调整。 (4)重复(1)~(2),直到求出最优解为止。 (一)确定初始可行基的方法 ?最小元素法 从单位运价表中最小的运价开始确定供销关系,然后考虑运价次小的,一直到给出初始基可行解为止。 ?伏格尔法 采用最小元素法可能造成其他处的更多浪费,伏格尔法考虑最小运费与次小运费之间的差额,差额越大,就按次小运费调运。

(二)最优解的判别 计算非基变量(空格)的检验数,当所有的检验数时,为最优解。 求空格检验数的方法有: ?闭回路法 以某一空格为起点找一条闭回路,用水平或垂直线向前划,每碰到一数字格转900后,继续前进,直到回到起始空格为止。 闭回路如图5.3.1的(a)、(b)、(c)等所示。从每一个空格出发一定存在并且可以找到唯一的闭回路。因为,m+n-1个数字格(基变量)对应的系数向量是一个基,任一空格(非基变量)对应的系数向量是这个基的线性组合。 ?位势法 一种较为简便的求检验数的方法。 设是对应运输问题的m+n个约束条件的对偶变量。B是含有一个人工变量X a的初始基矩阵。X a在目标函数中的系数Ca ,由线性规划的对偶理论可知 而每一个决策变量Xij的系数向量,所以 由单纯形法可知,所有基变量的检验数等于0,即 下面用具体例子说明表上作业法的计算步骤。 例1:假设某种物资共有3个产地,其日产量分别是:A1为7 t,A2为4 t,A3为9 t;该种物资的4个销售地,其日销量分别:B1为3 t,B2为6 t,B3为5 t,B4为6 t;各产地到销售地的单位物资的运价如表5.3.2所示。在满足各销售点需要量的前提下,如何调运该种物资,才能使总运费达到最小? 表5.3.2

(完整word版)单纯形法的解题步骤

三、单纯形法的解题步骤 第一步:作单纯形表. )(1)把原线性规划问题化为标准形式; )(2)找出初始可行基,通常取约束方程组系数矩阵中的单位矩阵; )(3)目标函数非基化; )(4)作初始单纯形表. 第二步:最优解的判定. (1) 若所有检验数都是非正数,即,则此时线性规划问题已取 得最优解. (2) 若存在某个检验数是正数,即,而所对应的列向量无正分量,则线性规划 问题无最优解. 如果以上两条都不满足,则进行下一步. 第三步:换基迭代. ,并确定所在列的非基变量为进基变量. (1)找到最大正检验数,设为 (2)对最大正检验数所在列实施最小比值法,确定出主元,并把主元加上小括号. 主元是最大正检验数 所在列,用常数项与进基变量所对应的列向 量中正分量的比值最小者; 替换出基变量,从而得到新的基变量.也就是主元所在 (3)换基:用进基变量 (4)利用矩阵的行初等变换,将主元变为1,其所在列其他元素都变为零,从此得到新的单纯形表; (5)回到第二步,继续判定最优解是否存在,然后进行新一轮换基迭代,直到问题得到解决为止. 例3 求.

解(1)化标准型:令 ,引进松弛变量 ,其标准型为 求 (2)作单纯形表:在约束方程组系数矩阵中 的系数构成单位矩阵,故取 为基变量,目标函数已非基化了,作初始单纯形表并“换基迭代”(见表6.8).表 6.8

(3)最终结果:此时检验数均为非正数,线性规划问题取得最优解,最优解为 目标函数取得最优值. 原线性规划问题的最优解为:.目标函数的最优值为14,即. 例4 用单纯形方法解线性规划问题. 求. 解此数学模型已是标准型了,其中约束方程含有一个二阶单位矩阵(1、2行,3、4列构成),取为基变量,而目标函数没有非基化.从约束方程找出 ,, 代入目标函数 , 经整理后,目标函数非基化了. 作单纯形表,并进行换基迭代(见表6.9). 最大检验数,由最小比值法知:为主元,对主元所在列施以行初等变出基,非基变量进基. 换,基变量

操作系统实验 FCFS和短作业优先SJF调度算法模拟

. 题目先来先服务FCFS和短作业优先SJF进程调度算法 姓名: 学号: 专业: 学院: 指导教师:林若宁 二零一八年十一月

一、实验目的 模拟单处理器系统的进程调度,分别采用短作业优先和先来先服务的进程调度算法作为进程设计算法,以加深对进程的概念及进程调度算法的理解. 二、实验内容 1. 短作业优先调度算法原理 短作业优先调度算法,是指对短作业或断进程优先调度的算法。它们可以分别可以用于作业调度和进程调度。短作业优先调度算法,是从后备队列中选择一个或若干个运行时间最短的作业,将它们调入内存运行。短进程优先调度算法,是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。 2. 先来先服务调度算法原理 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。 三、程序设计 1.概要设计 程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;主函数流程:输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果 2.算法流程

SJF算法流程图:

3.详细设计 (1)定义一个结构体 typedef struct PCB { char job_id[10]; //作业ID float Arr_time; //到达时刻 float Fun_time; //估计运行时间 float Wait_time; //等待时间 float Start_time; //开始时刻 float Fin_time; //完成时刻 float Tur_time; //周转时间 float WTur_time; //带权周转时间 int Order; //优先标记 }list; (2)先来先服务算法函数 void fcfs(list *p,int count) //先来先服务算法{ list temp; //临时结构体变量int i; int j;

表上作业法

第三章 运输问题 主要内容 运输问题的模型、算法 讲授重点 运输问题的模型、算法 讲授方式 讲授式、启发式 第一节 运输问题及其数学模型 一、运输问题的数学模型 设某种物品有m 个产地A 1,A 2,…,A m ,各产地的产量分别是a 1,a 2,…,a m ;有n 个销地B l ,B 2,…,B n ,各销地的销量分别为b l ,b 2,…,b n 。假定从产地A i (i =1,2,…,m)向销地B j (j =1,2,…,n)运输单位物品的运价是c ij ,问怎样调运这些物品才能使总运费最小? 这是由多个产地供应多个销地的单品种物品运输问题。为直观清楚起见,可列出该出该问题的运输表,如表3-1所示。 设 ij x 表示从A i 运往B j 的物品数量, ij c 表示从A i 运往B j 的单位物品的运价。则对于平 衡运输问题( ∑∑=== n j j m i i b a 1 1),其数学模型的一般形式可表示为: ∑∑=== n j m i ij ij x c s 11 min ()()()????? ???? ==≥====∑∑==n j m i x n j b x m i a x ij j m i ij i n j ij ,2,1;,2,10 ,,2,1,,2,11 1 (3.1) 二、运输问题数学模型的特点 对于平衡运输问题( ∑∑=== n j j m i i b a 1 1 ),可以证明其有如下两个特点: (1)矩阵A 的秩R(A)=m+n-1。 (2)问题必有最优解,而且当j i b a ,皆为整数时,其最优解必为整数最优解。 第二节 表上作业法求解运输问题 一、给出运输问题的初始可行解(初始调运方案) 1、最小元素法 解题步骤: ⑴在运价表中找到最小运价c 1k ; ⑵将的A L 产品给B k ;

各类作业调度算法

实验二作业调度实验 一. 目的要求: 用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。 二. 例题:为单道批处理系统设计一个作业调度程序。 由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。 作业调度算法:采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。 每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。 作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。 各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。 每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。 调度算法的流程图如下图所示。

三 . 实习题: 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。 对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间,以比较各种算法的优缺点。 2、编写并调度一个多道程序系统的作业调度模拟程序。

作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 3、编写并调试一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于优先级的作业调度。 可以参考课本中的例子自行设计。 三 . 实验过程: 1、编写并调试一个单道处理系统的作业等待模拟程序。 先来先服务(FCFS): main.cpp: /* **先来先服作业调度算法模拟 */ #include #include #define MAX_SOURCE 1000 //资源总数(对于单通道的作业调度可以忽略系统资源问题) using namespace std; struct jobCB { string name; double subtime;//提交时间 double runtime;//运行时间 double source;//资源 char state;//进程状态 struct jobCB *next; //链指针 }*ready,*rail,*p; int length; double maxsource; double now_source; double allTi;//总周转时间 double allWi;//总带权周转时间 double time;//时钟 void init()

表上作业法的源代码

表上作业法的源代码-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

/* 表上作业法的源代码 */ #include "stdio.h" #include "alloc.h" #include "math.h" /* #define debug */ #define a(j) (*(C+(M-1)*N+j)) /*销量数组*/ #define b(i) (*(C+i*N+N-1)) /*产量数组*/ #define c(i,j) (*(C+i*N+j)) /*运价数组*/ #define x(i,j) (*(X+i*(N-1)+j)) /*运量数组 */ /*(<1.0E15:基本解,>=1.0E15:运量为0) */ #define s(i,j) (*(S+i*(N-1)+j)) /*检验数数组Sij */ #define u(i) (*(U+i)) /*位势数组Ui*/ #define v(i) (*(V+i)) /*位势数组Vi*/ #define cpi(k) ((CP+k)->i) /*闭回路点i标*/ #define cpj(k) ((CP+k)->j) /*闭回路点i标*/ #define cpf(k) ((CP+k)->f) /*闭回路点i标*/ /* f=0:j++; f=2:j--; f=1;i--; f=3:i++; */ /*void TP(int M,int N,double *C,double *X); */ 10 6 30 0 20 30 40 50 60 12 7 14 16 9 10 9 13 8 14 183 185 119 162 137 102 179 118 114 189 107 169 161 179 169 140 135 112 184 149 128 106 165 178 199 183 194 127 184 173 124 125 151 127 178 160 162 105 150 185 179 153 174 121 142 108 163 157 138 189 171 114 131 165 150 159 131 155 135 165 124 167 107 109 107 149 175 162 108 182 135 181 106 136 183 134 179 188 136 131 189 166 158 159 180 162 104 116 159 111 void main() { int M,N,i,j; double *C; /*存储运价,产量及销量 */ double *X; /*存储运量分配方案 */ float z; FILE *fp; char fn[80]; double sum; void TP(int M,int N,double *C,double *X); printf("please input the data file name: "); scanf("%s",fn);

处理器调度习题

处理器调度 选择题 ?当CPU执行操作系统代码时,则处理机处于( )。 ?A.执行态B.目态C.管态D.就绪态 ?( )是机器指令的扩充,是硬件的首次延伸,是加在硬件上的第一层软件。 ?A.系统调用B.操作系统C.内核D.特权指令 ?操作系统提供给程序员的接口是( )。 ?A.进程B.系统调用C.库函数D.B和C ?用户程序向系统提出使用外设的请求方式是( )。 ?A.作业申请B.原语C.系统调用D.I/O指令 ?当作业正常完成进入完成状态时,操作系统( )。 ?A.将输出该作业的结果并删除内存中的作业 ?B.将收回该作业的所占资源并输出结果 ?C.将收回该作业的所占资源及输出结果,并删除该作业 ?D.将收回该作业的所占资源及输出结果,并将它的控制块从当前的队列中删除 ?下列选项是关于作业和进程关系的描述,其中哪一个是不正确的( )。 ?A.作业的概念主要用在批处理系统中,而进程的概念则用在几乎所有的OS中。 ?B.作业是比进程低一级的概念。 ?C.一个作业至少由一个进程组成。 ?D.作业是用户向计算机提交任务的实体,而进程是完成用户任务的执行实体以及向系统申请分配资源的基本单位。 ?作业从后备作业到被调度程序选中的时间称为( )。 ?周转时间B.响应时间C.等待调度时间D.运行时间 ?设有三个作业J1,J2,J3,它们同时到达,运行时间分别为T1,T2,T3,且T1≤T2≤T3,若它们在一台处理机上按单道运行,采用短作业优先算法,则平均周转时间为( )。 ?A.T1+T2+T3 B.1/3(T1+T2+T3) ?C.T1+2/3T2+1/3T3 D.T1+1/3T2+2/3T3 ?从作业提交给系统到作业完成的时间间隔称为作业的( )。 ?A.中断时间B.等待时间C.周转时间D.响应时间 ?设有四个作业同时到达,每个作业执行时间均为2 h,它们在一台处理机上按单道方式运行,则平均周转时间为( )。 ?A.1 h B.5 h C.2.5 h D.8 h ?FCFS调度算法有利于( )。 ?A.长作业和CPU繁忙型作业B.长作业和I/O繁忙型作业 ?C.短作业和CPU繁忙型作业D.短作业和I/O繁忙型作业 ?下列哪种说法不是SJ(P)F调度算法的缺点( )。 ?A.对于长作业(进程)不利 ?B.未考虑作业(进程)的紧迫程度 ?C.不能有效降低作业(进程)的平均等待时间 ?D.由于根据的是用户提供的估计执行时间,因此不一定真正做到短而优先。 ?选择排队进程中等待时间最长的进程被优先调度,该调度算法是( )。 ?A.先来先服务调度算法B.短进程优先调度算法 ?C.优先权调度算法D.高响应比优先调度算法 ?在采用动态优先权的优先权调度算法中,如果所有进程都具有相同优先权初值,则此时的优先权调度算法实际上和( )相同。 ?A.先来先服务调度算法B.短进程优先调度算法 ?C.时间片轮转调度算法D.长进程优先调度算法

表上作业法的源代码

/* 表上作业法的源代码 */ #include "" #include "" #include "" /* #define debug */ #define a(j) (*(C+(M-1)*N+j)) /*销量数组*/ #define b(i) (*(C+i*N+N-1)) /*产量数组*/ #define c(i,j) (*(C+i*N+j)) /*运价数组*/ #define x(i,j) (*(X+i*(N-1)+j)) /*运量数组 */ /*(<:基本解,>=:运量为0) */ #define s(i,j) (*(S+i*(N-1)+j)) /*检验数数组Sij */ #define u(i) (*(U+i)) /*位势数组Ui*/ #define v(i) (*(V+i)) /*位势数组Vi*/ #define cpi(k) ((CP+k)->i) /*闭回路点i标*/ #define cpj(k) ((CP+k)->j) /*闭回路点i标*/ #define cpf(k) ((CP+k)->f) /*闭回路点i标*/ /* f=0:j++; f=2:j--; f=1;i--; f=3:i++; */ /*void TP(int M,int N,double *C,double *X); */ 10 6 30 0 20 30 40 50 60 12 7 14 16 9 10 9 13 8 14 183 185 119 162 137 102 179 118 114 189 107 169 161 179 169 140 135 112 184 149 128 106 165 178 199 183 194 127 184 173 124 125 151 127 178 160 162 105 150 185 179 153 174 121 142 108 163 157 138 189 171 114 131 165 150 159 131 155 135 165 124 167 107 109 107 149 175 162 108 182 135 181 106 136 183 134 179 188 136 131 189 166 158 159 180 162 104 116 159 111 void main() { int M,N,i,j; double *C; /*存储运价,产量及销量 */ double *X; /*存储运量分配方案 */ float z; FILE *fp; char fn[80]; double sum; void TP(int M,int N,double *C,double *X); printf("please input the data file name: "); scanf("%s",fn); if((fp=fopen(fn,"r"))==NULL) { printf("Cannot open the data file!");

作业调度算法(先来先服务算法-短作业算法)

《操作系统》实验报告 题目:作业调度算法 班级:网络工程 :朱锦涛 学号:E31314037

一、实验目的 用代码实现页面调度算法,即先来先服务(FCFS)调度算法、短作业优先算法、高响应比优先调度算法。通过代码的具体实现,加深对算法的核心的理解。 二、实验原理 1.先来先服务(FCFS)调度算法 FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行的时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入存,为它们分配资源和创建进程。然后把它放入就绪队列。 2.短作业优先算法 SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入存。 3、高响应比优先调度算法

高响应比优先调度算法则是既考虑了作业的等待时间,又考虑了作业的运行时间的算法,因此既照顾了短作业,又不致使长作业等待的时间过长,从而改善了处理机调度的性能。 如果我们引入一个动态优先级,即优先级是可以改变的令它随等待的时间的延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可以描述为: 优先权 = (等待时间 + 要求服务时间)/要求服务时间 三、实验容 源程序: #include #include #include struct work { i nt id; i nt arrive_time;

作业调度算法(先来先服务算法,短作业算法)

题目:作业调度算法 班级:网络工程 姓名:朱锦涛 学号:E 一、实验目的 用代码实现页面调度算法,即先来先服务(FCFS)调度算法

、短作业优先算法、高响应比优先调度算法。通过代码的具体实现,加深对算法的核心的理解。 二、实验原理 1.先来先服务(FCFS)调度算法 FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行的时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列。 2.短作业优先算法 SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存。 3、高响应比优先调度算法 高响应比优先调度算法则是既考虑了作业的等待时间,又考虑了作业的运行时间的算法,因此既照顾了短作业,又不致使长作业等待的时间过长,从而改善了处理机调度的性能。

如果我们引入一个动态优先级,即优先级是可以改变的令它随等待的时间的延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可以描述为: 优先权 = (等待时间 + 要求服务时间)/要求服务时间 三、实验内容 源程序: #include<> #include<> #include<> struct work { i nt id; i nt arrive_time; i nt work_time; i nt wait; f loat priority;

表上作业法解决运输问题演示教学

表上作业法解决运输 问题

表上作业法解决运输问题 谢荣华、林建、岳钱华、叶俊君 【摘要】在物资调运问题中,希望运输费用最少总是人们最为关心的一个目标。在各种设定条件的约束下,如何寻找使得总运输费用最少的最优的运输方案是运输问题的核心。为给社会生产(生活)提供既便捷又经济实惠的物资调运方案,运输问题模型的求解方法可以产生最优的决策方案。因此对运输问题的深入研究具有极其重要的理论意义和实际应用价值。表上作业法是解决运输问题的重要方法本文讨论了产销平衡运输问题的表上作业法,利用伏格尔法求初始方案,位势法求检验数,闭合回路发对可行解进行调整和改进,直至求出最优解。 【关键词】运筹学、运输问题、改善优化、表上作业法 一、理论依据 运输问题的表上作业法步骤 1、制作初始平衡表 用“西北最大运量,然后,每增加角方法”:即在左上角先给予最大运量,然后,每增加一个运量都使一个发量或手里饱。如果所有运量的数字少于 (m+n-1),则补0使之正好(m+n-1)个。 (注:补零时不能使这些书构成圈。) 2、判断初始方案是否最优

(1)求位势表:对运价表加一行一列,圈出运价表中相应于有运量的项,在增加的行列上分别添上数,使这些元素之和等于圈内的元素。这些元素称为位势数。 (2)求检验数,从而得到检验数表。 结论:若对任意检验数小于等于0,则该方案最优,否则进入3进行调整. 3、调整 (1)找回路:在检验数大于0对应的应量表上对应元素为起点,沿横向或纵向前进,如遇到有运量的点即转向,直至起点,可得到一个回路。 (2)找调整量:沿上述找到的回路,从起点开始,在该回路上奇数步数字的最小者作为调整量ε。 (3)调整方式:在该回路上奇数步-ε,偶数步+ε,得到新回路。 重复上述步骤,使所有检验数小于0,即得到最优方案。 二、背景 鉴于市场竞争日益激烈,消费者需求渐趋多样,工厂作为市场消费品的产出源头,唯有对这种趋势深刻理解、深入分析,同事具体的应用于实际中,才能使自身手艺,断发展壮大,不被新新行业所淘汰。对于今天的重点研究对象食品工厂而言,由于在不同产品在原料使用、物料损耗、市场价格等方面均存在各种差异,如何确定各产品的生产配比,以及在最优的生产配比方案之下工厂能够达到最大的产值,都是值得进行探讨研究的现实问题。 三、实例 甲、乙、丙三个城市每年需要煤炭分别为:320、250、350万吨,由A、B 两处煤矿负责供应。已知煤炭年供应量分别为:A—400万吨,B—450万吨。

作业调度算法

XI`AN TECHNOLOGICAL UNIVERSITY 实验报告

西安工业大学实验报告 一、实验目的 进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先级算法的具体实施办法。 二、实验原理 由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。 1.先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 2.最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。 3.优先级作业优先算法:是以进入系统的作业所提出的“优先级”为标准,总是优先选取优先级小的作业。 三、实验步骤、数据记录及处理 实验步骤: 1. 先定义一个结构体,在主函中先调用input()输入函数,在

input()输入函数中,依次按着提示输入数据。三种作业调度算法分别在三个子函数中执行: 分别使用了fcfs(pc,i);short_in(pc,i);psa(pc,i);三个函数分别实现先来先服务算法、短作业优先算法和优先级算法。这里先把段作业优先的思路理一理。 在短作业优先调度算法函数short_in()中,按照短作业优先调度的算法规则,每个作业完成后,在其完成时间前提交的作业中,运行时间最短的作业程序优先计算,在所有的作业都执行执行完后,程序再算出这种算法的平均周转时间和平均带权周转时间,并将所有的作业按其执行的顺序进行排序; 代码实现(c语言): #include #include #define MAX_SIZE 100 typedefstruct_PCB { int pid; //进程号 int serve_time;//服务时间 int com_tim; //到达时间 int pri;//优先级 int finish_time;//完成时间 float zh_tim; //周转时间 float dzhi_time;//带权周转时间 }PCB; void swap(PCB *p,PCB *s) { PCBtmp = *p; *p= *s ; *s = tmp; } void sort_cm(PCB *p,int len) { for(int i = 0;i

表上作业法的源代码

/* 表上作业法的源代码*/ #include "stdio.h" #include "alloc.h" #include "math.h" /* #define debug */ #define a(j) (*(C+(M-1)*N+j)) /*销量数组*/ #define b(i) (*(C+i*N+N-1)) /*产量数组*/ #define c(i,j) (*(C+i*N+j)) /*运价数组*/ #define x(i,j) (*(X+i*(N-1)+j)) /*运量数组*/ /*(<1.0E15:基本解,>=1.0E15:运量为0) */ #define s(i,j) (*(S+i*(N-1)+j)) /*检验数数组Sij */ #define u(i) (*(U+i)) /*位势数组Ui*/ #define v(i) (*(V+i)) /*位势数组Vi*/ #define cpi(k) ((CP+k)->i) /*闭回路点i标*/ #define cpj(k) ((CP+k)->j) /*闭回路点i标*/ #define cpf(k) ((CP+k)->f) /*闭回路点i标*/ /* f=0:j++; f=2:j--; f=1;i--; f=3:i++; */ /*void TP(int M,int N,double *C,double *X); */ 10 6 30 0 20 30 40 50 60 12 7 14 16 9 10 9 13 8 14 183 185 119 162 137 102 179 118 114 189 107 169 161 179 169 140 135 112 184 149 128 106 165 178 199 183 194 127 184 173 124 125 151 127 178 160 162 105 150 185 179 153 174 121 142 108 163 157 138 189 171 114 131 165 150 159 131 155 135 165 124 167 107 109 107 149 175 162 108 182 135 181 106 136 183 134 179 188 136 131 189 166 158 159 180 162 104 116 159 111 void main() { int M,N,i,j; double *C; /*存储运价,产量及销量*/ double *X; /*存储运量分配方案*/ float z; FILE *fp; char fn[80]; double sum; void TP(int M,int N,double *C,double *X); printf("please input the data file name: "); scanf("%s",fn); if((fp=fopen(fn,"r"))==NULL) {

相关文档
最新文档