1问题
最优服务次序问题:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1≤i≤n。共有s处可以提供此服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小平均等待时间是n个顾客等待服务时间的总和除以n。
2问题分析
贪心策略:由于每个顾客i的服务时间为ti,要实现等待服务时间总和最小,应该尽可能安排ti值小的顾客,进行服务。
3问题建模
问题建模:假设原问题的时间为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);
那么,总的等待时间,即为最优解
Tmin=nt(1)+(n-1)t(2)+(n-2)t(3)......+(n+1-i)t(i)+......+2t(n-1)+1t(n)
4算法描述
输入用户等待所需时间列表 将等待时间按从小到大进行排列 利用数学公式Tmin=nt(1)+(n-1)t(2)+(n-2)t(3)......+(n+1-i)t(i)+......+2t(n-1)+1t(n)进行计算得到结果
1.快速排序:a表示待排序数组,l,r表示最左侧/最右侧的索引。x初始化为最左端的元素。
2.计算顾客等待时长:n表示顾客总数,t表示每个顾客的服务时间列表。
代码
def Quick_Sort(a,l,r):
if(l<r):
i = l
j = r
x = a[l]
while i<j:
while i<j and a[j]>=x:
j-=1
if i<j:
a[i] = a[j]
i+=1
while i<j and a[i]<x:
i+=1
if i<j:
a[j] = a[i]
j-=1
a[i] = x
Quick_Sort(a,l,i-1)
Quick_Sort(a,i+1,r)
return a
def Greedy(n,t):
wait_time = 0
wait_stime = 0
for i in range(0,n):
wait_time = wait_time + t[i]
wait_stime = wait_stime + wait_time
print("第{0}个被选择服务的顾客的服务时间为:{1}, 等待时间为:{2}" .format(i,t[i],wait_time))
print("顾客等待的总时间为:{0}".format(wait_stime))
if __name__ == '__main__':
n = eval(input("请输入要服务顾客的总人数:"))
t = list(eval(input("请输入顾客各自所需的服务时间:")))
l=0
r=n-1
t = Quick_Sort(t,l,r)
Greedy(n,t)