永发信息网

5. 设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1<=i<=n。应如何安排n个顾客的服务次序才能

答案:2  悬赏:10  手机版
解决时间 2021-02-21 15:42
能使总的等待时间达到最小?总的等待时间是每个顾客等待服务时间的总和。这是有关算法设计的题目,我现在急需详细一些的求解过程和分析过程,要用c++来编写程序。急需 谢谢啊!
最佳答案
上面的 思路不错

最优服务次序问题
一、问题描述:
设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1≦i ≦n 。共有s处可以提供此服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服务时间的总和除以n。
二、贪心选择策略
假设原问题为T,而我们已经知道了某个最优服务系列,即最优解为A={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(3)+……t(n);
那么总等待时问,即最优值为:
TA=n*t(1)+(n-1)*t(2)+…+(n+1-j)*t(i)+…2*t(n-1)+t(n);
由于平均等待时间是n个顾客等待时间的总和除以n,故本题实际上就是求使顾客等待时间的总和最小的服务次序。
本问题采用贪心算法求解,贪心策略如下:对服务时间最短的顾客先服务的贪心选择策略。首先对需要服务时间最短的顾客进行服务,即做完第一次选择后,原问题T变成了需对n-1个顾客服务的新问题T’。新问题和原问题相同,只是问题规模由n减小为n-1。基于此种选择策略,对新问题T’,选择n-1顾客中选择服务时间最短的先进行服务,如此进行下去,直至所有服务都完成为止 。
三、问题的贪心选择性质
先来证明该问题具有贪心选择性质,即最优服务A中t(1)满足条件:t(1)<=t(i)(2<i<n)。
用反证法来证明:假设t(1)不是最小的,不妨设t(1)>t(i)(i>1)。
设另一服务序列B=(t(i),t(2),…,t(1)…,t(n))
那么TA-TB=n*[t(1)-t(i)]+(n+1-i)[t(i)-t(1)]=(1-i)*[t(i)-t(1)]>0
即TA>TB,这与A是最优服务相矛盾。
故最优服务次序问题满足贪心选择性质。
四、问题的最优子结构性质
在进行了贪心选择后,原问题T就变成了如何安排剩余的n-1个顾客的服务次序的问题T’,是原问题的子问题。
若A是原问题T的最优解,则A’={t(2),…t(i)…t(n))是服务次序问题子问题T’的最优解。
证明:假设A’不是子问题T’的最优解,其子问题的最优解为B’,则有TB’<TA’,而根据TA的定义知,TA’十t(1)=TA。因此TB’+t(1)<TA’+t(1)=TA,即存在一个比最优值TA更短的总等待时间,而这与TA为问题T的最优值相矛盾。因此,A’是子问题T’的最优值。
从以上贪心选择及最优子结构性质的证明,可知对最优服务次序问题用贪心算法可求得最优解。
根据以上证明,最优服务次序问题可以用最短服务时间优先的贪心选择可以达到最优解。故只需对所有服务先按服务时间从小到大进行排序,然后按照排序结果依次进行服务即可。平均等待时间即为TA/n。
五、算法实现
由多处最优服务次序问题具有贪心选择性质和最优子结构性质,容易证明算法greedy的正确性。本算法采用最短服务时间优先的贪心策略。首先将每个顾客所需要的服务时间从小到大排序。然后申请2个数组:st[]是服务数组,st[j]为第j个队列上的某一个顾客的等待时间;su[]是求和数组,su[j]的值为第j个队列上所有顾客的等待时间;
double greedy(vector<int>x,int s)
{
vector<int>st(s+1,0);
vector<int>su(s+1,0);
int n=x.size();
sort(x.begin(),x.end());
int i=0,j=0;
while(i<n){
st[j]+=x[i];
su[j]+=st[j];
i++;
j++;
if(j==s)j=0;//循环分配顾客到每一个服务点上
}
double t=0;
for(i=0;i<s;i++) t+=su[i];
t/=n;
return t;
}
六、算法测试结果

七、算法复杂性分析
程序主要是花费在对各顾客所需服务时间的排序和贪心算法,即计算平均服务时间上面。其中,贪心算法部分只有一重循环影响时间复杂度,其时间复杂度为O(n):而排序算法的时间复杂度为O(nlogn)。因此,综合来看算法的时间复杂度为O(nlogn)。
八、参考文献
[1] 王晓东.计算机算法设计与分析(第3版)[M].北京:电子工业出版社,2007.
[2] 陈媛.《算法与数据结构》[M],清华大学出版社, 第1版,2005.4.
[3] 王晓东.算法设计与实验题解 [M].北京:电子工业出版社,2008.

附录(程序代码)
#include<iostream>
#include <vector>
#include<algorithm>
using namespace std;
using std::vector;
double greedy(vector<int>x,int s)
{
vector<int>st(s+1,0);
vector<int>su(s+1,0);
int n=x.size();
sort(x.begin(),x.end());
int i=0,j=0;
while(i<n){
st[j]+=x[i];
su[j]+=st[j];
i++;
j++;
if(j==s)j=0;
}
double t=0;
for(i=0;i<s;i++) t+=su[i];
t/=n;
return t;
}
void main()
{int n;//等待服务的顾客人数
int s;//服务点的个数
int i;
int a;
int t;//平均服务时间
vector<int>x;
cout<<"please input the num of the customer:"<<endl;
cin>>n;
cout<<"please input the num of the server:"<<endl;
cin>>s;
cout<<"please input the need service time of each customer:"<<endl;
for(i=1;i<=n;i++){
cout<<"No."<<i<<endl;
cin>>a;
x.push_back(a);
}
t=greedy(x, s);
cout<<"the least average waiting time is:"<<t<<endl;
}
全部回答
从统筹学讲,按照时间从小到大的方式排队,总时间是最少的。 因为当处理第i个人的时候,所有顾客等待时间增加的和E={time(i) x (10-i+1)}的。 所以应该先写个排序,然后实现上面提到的E计算,每进行一个顾客时候,运行一次函数E,然后加到总时间里面。 【伪代码】 int funcE(int[] custList, int start, int maxCount) { int total += custList[start]*(maxCount-start); start++; if (start < maxCount) { total += funcE(custList, start, maxCount); } return total; } int maxCount = n; // 顾客数 int[maxCount] custList = xxxxxxxx; //数组里面就是每个顾客所需的服务时间 Collection.sort(custList); // C++里面估计不会有这个,你实现排序吧。 int total = funcE(custList, 0, maxCount); printf("%d", total) // 打印总时间total 要完整源码的话,就看谁有现成写好的,想给你分享了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
南京市民族老年公寓在什么地方啊,我要过去处
两个人对视是否是双方都有意思?
假如 你去沙漠旅行,事先准备的水喝光了,你
k165次在西安什么战上车?
淘宝集市新品,为什么在“搜索结果页面”和“
成都五桂桥92路公交车至潮音大道中华锦绣那一
“劳动者提前三十日以书面形式通知用人单位,
天友服务中心NO.1279怎么去啊,有知道地址的
岩河地址在什么地方,想过去办事
oppor9s打游戏老是碰到home键,有什么方法解
左手背和左腿上长斑代表那个部位不健康
以下关于犯罪预备的说法正确的是
驾驶员近视眼配灰色好还是茶色好
怎么鉴别装纯的人??
美颜新生活美容院我想知道这个在什么地方
推荐资讯
大连市沙河口区文化市场综合执法大队这个地址
惠家惠超市江南店地址在哪,我要去那里办事
一口酥怎么去啊,有知道地址的么
如何修改屏保密码
【迁组词】迁组词有哪些词语
中了病毒!换硬盘!全盘格式化都没有用!为什
没有不能在一起的两个人,只有靠不到一起的两
NBA2K17 Viper 名单都正确流程 怎么游戏里没
预防医学道德价值的社会性,常与下列因素相联
小林教子到底何许人也?他是负责动画的什么部
城镇化是我国现代化建设的历史任务,要积极引
梦幻西游方寸山哪个技能既能封物理又能封法术
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?