[算法分析与设计]最优服务次序问题的答案

最优服务次序问题

设有n个顾客同时等待同一项服务。顾客i需要的服务时间为ti,1

参考答案

一、最优服务次序问题

二、运行环境(软、硬件环境)

运行软件:Window7 64位

硬件:华硕PC机

编写程序:C++语言

编译环境:VC++6.0

三、算法设计的思想

首先,要使n个顾客平均等待时间最小,即为:让n个顾客等待服务时间总和最小。因为,平均等待时间=等待服务时间总和/n。

接着,由于每个顾客i的服务时间为ti,要实现等待服务时间总和最小,应该尽可能安排ti值小的顾客,进行服务。

因此,本题属于局部最优的设计问题,即为贪心算法。

四、算法的流程图

五、算法设计分析

假设原问题的时间为T,已经知道了某个最优服务系列,最优解为min={t(1),t(2),......,t(n)}(其中t(i)为第i个客户需要的服务时间),那么每个客户需要的等待是时间为:

T(1)=t(1);

T(2)=t(1)+t(2);

......

T(n)=t(1)+t(2)+......+t(n);

那么,总的等待时间,即为最优解

T min=n*t(1)+(n-1)*t(2)+(n-2)*t(3)......+(n+1-i)*t(i)+......+2*t(n-1)+1*t(n);

由于,平均等待时间是n个顾客等待时间总和除以n,则本题转化为求使得顾客等待时间总和最小的服务次序问题。

六、源代码

#include

#include

#include

#include

long n=-1; //顾客数为n

long *wait; //顾客各自等待时间wait

void inputData ()

{ //输入数据n,等待时间wait

ifstream fin;

fin.open(*input.txt’,los::nocreate);

if(!fin){

cout

return;

}

fin>>n;

wait==new long[n];

for(1ong i=0;i

{

fin>>wait[i];

)

fin.close0;

}

void ShellSort(long *x)

( //Shell排序,实现数据从小到大排序 long i,j,temp.gap=n/2;

while(gap>0){

for(i=gap;i

j=i-gap;

while(j>=0){

if(x[j]>x[j+gap])

{

temp=x[j];x[j]=x[j+gap];x[j+gap]=temp; //实现大小交换

j=j-gap;

}

else{j=-1;}

}

}

gap=gap/2;

}

}

/**

函数名:AveWait0

描述:计算平均等待时问

参数:各顾客等待时间

**/

double AveWait(long *x)

{

double ave=0.0;

ShellSort(x);

for(long i=0;i

{

ave+=1.0*(n-i)*x[i];

}

ave/=n; //求平均等待时间

return ave;

)

void outputData(double out)

( //输出结果

ofstream fout;

fout.open("output.txt");

fout

fout.close0;

)

void main0

{ //主调函数

inputData();

if(n!=-1)(

double avewait=AveWait(wait);

outputData(avewait):

}

}

七、运行结果分析

试验结果:

input.txt:

12 56 22 l9 90 1002 234 33 45 97 810

output.txt:

532.00

八、收获及体会

本题将顾客平均等待时间最小,转化为服务等待时间总和最小。利用局部最优,通过贪心算法来解决该题。

通过本题,也更深入了解贪心算法的本质,今后对于其他类似的局部最优问题、最优子结构问题,都可采用贪心算法解决。

最优服务次序问题

设有n个顾客同时等待同一项服务。顾客i需要的服务时间为ti,1

参考答案

一、最优服务次序问题

二、运行环境(软、硬件环境)

运行软件:Window7 64位

硬件:华硕PC机

编写程序:C++语言

编译环境:VC++6.0

三、算法设计的思想

首先,要使n个顾客平均等待时间最小,即为:让n个顾客等待服务时间总和最小。因为,平均等待时间=等待服务时间总和/n。

接着,由于每个顾客i的服务时间为ti,要实现等待服务时间总和最小,应该尽可能安排ti值小的顾客,进行服务。

因此,本题属于局部最优的设计问题,即为贪心算法。

四、算法的流程图

五、算法设计分析

假设原问题的时间为T,已经知道了某个最优服务系列,最优解为min={t(1),t(2),......,t(n)}(其中t(i)为第i个客户需要的服务时间),那么每个客户需要的等待是时间为:

T(1)=t(1);

T(2)=t(1)+t(2);

......

T(n)=t(1)+t(2)+......+t(n);

那么,总的等待时间,即为最优解

T min=n*t(1)+(n-1)*t(2)+(n-2)*t(3)......+(n+1-i)*t(i)+......+2*t(n-1)+1*t(n);

由于,平均等待时间是n个顾客等待时间总和除以n,则本题转化为求使得顾客等待时间总和最小的服务次序问题。

六、源代码

#include

#include

#include

#include

long n=-1; //顾客数为n

long *wait; //顾客各自等待时间wait

void inputData ()

{ //输入数据n,等待时间wait

ifstream fin;

fin.open(*input.txt’,los::nocreate);

if(!fin){

cout

return;

}

fin>>n;

wait==new long[n];

for(1ong i=0;i

{

fin>>wait[i];

)

fin.close0;

}

void ShellSort(long *x)

( //Shell排序,实现数据从小到大排序 long i,j,temp.gap=n/2;

while(gap>0){

for(i=gap;i

j=i-gap;

while(j>=0){

if(x[j]>x[j+gap])

{

temp=x[j];x[j]=x[j+gap];x[j+gap]=temp; //实现大小交换

j=j-gap;

}

else{j=-1;}

}

}

gap=gap/2;

}

}

/**

函数名:AveWait0

描述:计算平均等待时问

参数:各顾客等待时间

**/

double AveWait(long *x)

{

double ave=0.0;

ShellSort(x);

for(long i=0;i

{

ave+=1.0*(n-i)*x[i];

}

ave/=n; //求平均等待时间

return ave;

)

void outputData(double out)

( //输出结果

ofstream fout;

fout.open("output.txt");

fout

fout.close0;

)

void main0

{ //主调函数

inputData();

if(n!=-1)(

double avewait=AveWait(wait);

outputData(avewait):

}

}

七、运行结果分析

试验结果:

input.txt:

12 56 22 l9 90 1002 234 33 45 97 810

output.txt:

532.00

八、收获及体会

本题将顾客平均等待时间最小,转化为服务等待时间总和最小。利用局部最优,通过贪心算法来解决该题。

通过本题,也更深入了解贪心算法的本质,今后对于其他类似的局部最优问题、最优子结构问题,都可采用贪心算法解决。


相关内容

  • 对哈夫曼树唯一性的探讨
  • 开发研究与设计技术 本栏目责任编辑:谢媛媛 对哈夫曼树唯一性的探讨 沈音乐 (杭州职业技术学院,浙江杭州310018) 摘要:在我们的日常教学中,我们经常会对哈夫曼树的建立给出不同答案,那么是否有唯一标准答案?通过相关程序流程及代码实验,分析了导致认为创建哈夫曼树不唯一的原因,说明了在一种既定的算法 ...

  • 2016培训计划书范文
  • 2016培训计划书范文 第1篇:设计年度员工培训计划书 员工培训计划书最基本的内容是∶为什么要培训?谁接受培训?培训些什么?谁实施培训?如何培训?把全年的培训项目完整地计划好后,培训工作便可开始实施. 首先要确定员工培训计划书所要达到的目标. 培训目标的作用有以下几点∶ 可以结合受训者.管理者等方面 ...

  • 操作系统磁盘调度算法实验报告及代码
  • 华南农业大学信息(软件)学院 <操作系统分析与设计实习>成绩单 开设时间:2014学年第一学期 一.需求分析: (1)输入的形式和输入值的范围: 在文本框输入序列长度,输入值为int类型 (2)输出的形式: 输出每种磁盘调度算法的服务序列 (3)程序所能达到的功能: 模拟实现FCFS.S ...

  • 121员工培训计划书范文
  • 员工培训计划书范文 培训成功与否的秘诀是∶决定培训的基础是什么?如果培训计划的制定完全是以管理者所认为的职工"应当"感兴趣的东西为基础那么基本上可以有把握地预言参加学习者的态度一定颇为冷淡.相反如果培训计划是在经常了解培训对象的需要和兴趣基础上制定的那么一定是个繁荣成功 ...

  • 软件工程-名词解释
  • 全国2010年10月 三.名词解释题(本大题共5小题,每小题3分,共15分) 1. 软件生存周期模型 答案:软件生存周期模型是描述软件开发过程中各种活动如何执行的模型.(1分) 软件生存周期模型确立了软件开发和演绎中各阶段的次序限制以及各阶段活动的准则,(1分) 确立开发过程所 遵守的规定和限制,便 ...

  • 员工培训计划书范文
  • 员工培训计划书范文 培训成功与否的秘诀是∶决定培训的基础是什么?如果员工培训计划书的制定,完全是以管理者所认为的职工"应当"感兴趣的东西为基础,那么基本上可以有把握地预言,参加学习者的态度一定颇为冷淡. 培训成功与否的秘诀是∶决定培训的基础是什么?如果员工培训计划书的制定,完全是 ...

  • 年度培训计划的制定[推荐阅读]
  • 随着新年度的开始,每个单位有关人力资源方面工作的准备与筹划将陆续展开,其中很重要的一项就是年度培训计划。年度培训计划一般应从四个主要方面来综合考虑,即对培训需求的界定和确认、设计年度培训计划、辅助资料采购计划和预算控制。如果单位内从未开展过培训活动,则计划工作会相对复杂一些,尚需增添说服与争取的环节 ...

  • 2012计算机考研真题及答案
  • 2012 年全国硕士研究生入学统一考试 计算机科学与技术学科联考 计算机学科专业基础综合试题 (科目代码 408) 1 一.单项选择题:第 1-40 小题,每小题 2 分,共 80 分.下列每题给出的四个选项中,只有一个选项最符合试题 要求. 1.求整数 n(n≥0)阶乘的算法如下,其时间复杂度是 ...

  • 子集和问题的完全多项式近似方案算法
  • 子集和问题的完全多项式近似方案 2012年 2月 一. 作业背景: 1. 子集和问题简介 子集和问题的一个实例是一个对(S,t),其中S 是一个正整数的集合{x 1, x 2, x 3,..., x n },t 为一个正整数.这个判定问题是判定是否存在S 的一个子集,使得其中的数加起来恰为目标值t ...