當前位置:編程學習大全網 - 源碼下載 - [算法分析與設計]最優服務次序問題的答案_最優服務次序問題算法

[算法分析與設計]最優服務次序問題的答案_最優服務次序問題算法

最優服務次序問題

設有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

八、收獲及體會

本題將顧客平均等待時間最小,轉化為服務等待時間總和最小。利用局部最優,通過貪心算法來解決該題。

通過本題,也更深入了解貪心算法的本質,今後對於其他類似的局部最優問題、最優子結構問題,都可采用貪心算法解決。

  • 上一篇:同城購(壹站式購物體驗)
  • 下一篇:Android開發權威指南的圖書目錄
  • copyright 2024編程學習大全網