演算法學習系列(貪心演算法)—多處最優服務次序問題
問題描述:
設有n(1≤n≤100)個顧客同時等待一項服務。顧客i需要的服務時間為ti,1≤i≤n,共有s處提供此服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小。平均等待時間是n個顧客的等待時間(含服務時間)總和除以n。編寫一個貪心演算法,計算n個顧客的最小平均等待時間及各處的顧客服務次序。
提示:
談心策略:最短服務時間優先。
輸入資料:
第一行,顧客數n及服務處數s,用空格分隔;
第二行開始的n行,每行描述一個顧客,每行兩個數,分別是顧客號及他需要的服務時間,用空格分隔。
輸出資料
第一行,平均等待時間;
第二行開始的s行,每行描述1處,第1個數為服務處編號,其後為按服務次序先後給出的顧客號,由空格分隔;
演算法思想:
演算法思想:
該演算法使用貪心思想,貪心策略是客戶按服務時間長短決定被服務次序,服務時間短的優先被服務,且前往下一個最快能結束服務的服務點
接受服務。
1、定義一個time陣列記錄每個服務點目前的時間,每服務一個客戶time[服務點號]加上該客戶的服務時間。
2、隨後對每個服務點的目前時間進行比較,數值最小的服務點即為最快能接受服務的服務點,該服務點進行服務,
該客戶的等待時間waited_time即為該服務點的目前時間time[服務點號],並記錄好該客戶接受服務的服務點號served_point
3、將每個使用者的等待時間相加,再除以客戶的總數,即得到平均服務時間
標頭檔案程式碼:
定義了一個類、聲明瞭用到的各個成員變數,公有的service函式是呼叫貪心演算法的入口
MultiService.h:
#ifndef MULTISERVICE_H_INCLUDED
#define MULTISERVICE_H_INCLUDED
#include<iostream>
#include<fstream>
#include<malloc.h>
using namespace std;
class MultiService
{
typedef struct Custom
{
int number;
float service_time; //該客戶需要的服務時間
float waited_time; //該客戶已經等待的時間
int served_point; //記錄該客戶被服務的服務處的編號
}Custom ,*Customs; //定義結構體陣列,記錄一個顧客的編號以及服務時間
Customs customs;
int custom_number; //顧客的數量,從檔案中讀取
int service_number; //服務處的數量,從檔案處讀取
ofstream fout;
void readFile(char *);
public:
MultiService(char *in ,char *out);
~MultiService()
{
if(customs)
{
free(customs);
}
if(fout)
{
free(fout);
}
}
void service();
};
#endif // MULTISERVICE_H_INCLUDED
cpp檔案:
程式中所有的資料都從檔案中讀取、大家呼叫的時候請自己在同一目錄下建立input.txt,其中輸入資料為:
輸入:
10 2
201 56
128 12
32 1
45 99
109 1000
88 234
69 33
120 55
50 99
48 812
MultiService.cpp:
#include "MultiService.h"
void MultiService::readFile(char *in)
{
ifstream fin(in);
if(!fin)
{
cout<<"File open error!"<<endl;
}
fin>>custom_number>>service_number; //從檔案中讀取服務點數量以及客戶數量
customs = (Customs)malloc(sizeof(Custom) * custom_number); //申請客戶數量個客戶的空間
if(!customs)
{
cout<<"Memory malloc fail!"<<endl;
}
for(int i = 0 ;i<custom_number ;i++)
{
fin>>customs[i].number>>customs[i].service_time; //從檔案中讀入使用者的編號以及服務時間
}
fin.close(); //關閉檔案
}
MultiService::MultiService(char *in ,char *out):fout(out)
{
readFile(in);
}
void MultiService::service()
{
for(int i = 0 ;i<custom_number ;i++) //使用選擇排序法按每個客戶的service_time的大小次序進行排序
{
float min = customs[i].service_time;
for(int j = i ;j<custom_number ;j++)
{
if(customs[j].service_time < min)
{
min = customs[j].service_time;
Custom temp = customs[j];
customs[j] = customs[i];
customs[i] = temp;
}
}
}
float *time = (float *)malloc(sizeof(int ) * service_number); //申請一個float型別的陣列,記錄該服務點的當前時間
for(int i = 0 ;i<service_number ;i++)
{
time[i] = 0; //初始化每個服務點的當前時間
}
int left_custom = custom_number; //定義整型left_custom為客戶目前的數目
for(int i = 0 ;i<service_number ;i++) //每個服務點開始服務第一個客戶
{
customs[i].served_point = i; //記錄該客戶被服務的服務點
time[i] += customs[custom_number - (left_custom--)].service_time; //該服務點的時間++
customs[custom_number - left_custom - 1].waited_time = time[i]; //該使用者的等待時間即為該服務點此時的時間
//cout<<"time:"<<time[i]<<endl;
}
while(left_custom > 0)
{
int min = time[0]; //找到一個目前時間最短的,即是下一個能夠接待客戶的服務處
int flag = 0; //記錄第幾個服務處是下一個最快能接待客戶的
for(int i = 1 ;i<service_number ;i++)
{
if(time[i] < min )
{
min = time[i];
flag = i;
}
}
customs[custom_number - left_custom].served_point = flag; //下一個最快能接待客戶的服務點接待客戶
//並記錄客戶的服務點
time[flag] += customs[custom_number - (left_custom--)].service_time; //該服務點時間++
customs[custom_number - left_custom -1].waited_time = time[flag]; //該使用者的等待時間即為該服務點此時的時間
// cout<<"time["<<flag<<"]:"<<time[flag]<<endl;
}
float time_sum = 0;
for(int i = 0 ;i<service_number ;i++) //輸出每個服務點服務的客戶編號
{
fout<<i + 1<<' ';
for(int j = 0 ;j<custom_number ;j++)
{
if(customs[j].served_point == i)
{
fout<<customs[j].number<<' '; //把每名顧客的編號輸出到檔案
}
}
fout<<endl;
}
for(int i = 0 ;i<custom_number ;i++) //將總服務時間相加
{
//cout<<customs[i].waited_time<<' ';
time_sum += customs[i].waited_time;
}
fout<<time_sum/custom_number; //得到平均服務時間
}
最後是主函式的呼叫入口
#include "MultiService.h"
int main()
{
char *in = "input.txt";
char *out = "output.txt";
MultiService multi_service(in ,out);
multi_service.service();
}
輸出到檔案中的最後結果為:
1 32 69 201 50 48
2 128 120 45 88 109
340
相關推薦
演算法學習系列(貪心演算法)—多處最優服務次序問題
問題描述: 設有n(1≤n≤100)個顧客同時等待一項服務。顧客i需要的服務時間為ti,1≤i≤n,共有s處提供此服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小。平均等待時間是n個顧客的等待時間(含服務時間)總和除以n。編寫一個貪心演算法,計算n
演算法分析與設計之多處最優服務次序問題
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int main() { int i,n,j,k
演算法分析與設計之多處最優服務次序問題2
¢ 設有n個顧客同時等待一項服務,顧客i需要的服務時間為ti,1≤i≤n,共有s處可以提供此項服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和除以n。 ¢ 給定的n個顧客需要的服務時間和s的值,程式設計計算最優服務次序。 ¢ 輸入 第一行
算法分析與設計之多處最優服務次序問題2
循環 sin bsp 一行 print include 對比 進行 ios ¢ 設有n個顧客同時等待一項服務,顧客i需要的服務時間為ti,1≤i≤n,共有s處可以提供此項服務。應如何安排n個顧客的服務次序才能使平均等待時間達到最小?平均等待時間是n個顧客等待服務時間的總和
常見機器學習演算法學習——KNN(K鄰近)
1、 演算法簡述 文章中描述性內容,多來自維基百科KNN。 KNN( k-nearest neighbors algorithm)是一種非引數、有監督演算法,由T. M. COVER, P. E. HART, Hart PE 
動態規劃演算法學習總結(帶案例)
【動規演算法學習總結】 首先,遇到動態規劃問題要找到三個重要元素: 1.最優子結構 2.邊界 3.狀態轉移方程 【最優子結構】 通俗來說,就是具有規律性的結果的獲取方式。 如上樓梯問題
Python學習系列 (第一章):Python 的簡介
python 學習一: Python 的簡介: python的創始人為吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·範羅蘇姆為了在阿姆斯特丹打發時間,決心開發一個新的腳本解釋程序,作為ABC語言的一種繼承。二:Python的應用領域: web 開發: Djang
Android學習筆記(二四) 多頁顯示-SlidingDrawer的使用
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Python實現遺傳演算法(二進位制編碼)求函式最優值
目標函式 maxf(x1,x2)=21.5+x1sin(4πx1)+x2sin(20πx2) max f({x_1},{x_2}) = 21.5 + {x_1}\sin (4\pi {x_1}) + {x_2}\sin (20\pi {x_2})
mybatis學習筆記(十一)多對多關聯查詢/級聯操作
package com.mybatis.test; import java.io.Reader; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessi
模式識別(Pattern Recognition)學習筆記(十九)--多層感知器模型(MLP)
早前已經學習了感知器學習演算法,主要通過對那些錯分類的樣本進行求和來表示對錯分樣本的懲罰,但明顯的它是一個線性的判別函式;而且上節學到了感知器神經元(閾值邏輯單元),對於單個的感知器神經元來說,儘管它能夠實現線性可分資料的分類問題(如與、或問題),但是卻無法解
Vue.js學習系列(三十)-- Vue.js樣式繫結(一)
class 與 style 是 HTML 元素的屬性,用於設定元素的樣式,我們可以用v-bind來設定樣式屬性。Vue.js v-bind 在處理 class 和 style 時,專門增強了它。表示式的結果型別除了字串之外, 1. Vue.js class 1.1 繫結
Spring Cloud系列(二十三) API閘道器服務Spring Cloud Zuul(Finchley.RC2版本)
為什麼使用Spring Cloud Zuul? 通過前幾章的介紹,我們對於Spring Cloud Netflix 下的核心元件已經瞭解了大半,利用這些元件我們已經可以構建一個簡單的微服務架構系統,比如通過使用Spring Cloud Eureka實現高可用的服務註冊中
演算法筆記 //09_最優服務次序問題
問題描述 設有 n 個顧客同時等待一項服務。顧客 i 需要的服務時間為 ni,1≤ti≤n。應如何安排 n 個顧客的服務次序才能使平均等待時間達到最小? 平均等待時間是 n 個顧客等待服務時
貪心之最優服務次序
i++ str algo vector CI urn () span namespace 代碼: 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream>
迴歸演算法(python code)----------機器學習系列(一)
前面一篇把迴歸演算法的理論部分都大致講過了,這一篇主要就python程式碼部分做一些解釋,也就是怎麼用python寫回歸演算法,因為LZ也是剛剛入門,有一些理解不對的地方,歡迎大家指正,LZ也矯枉過正。 首先是python模組----numpy (設計用到的數學
opencv學習系列(七)--- 細化演算法
演算法思想: 公式: y = p0*2^0 + p1*2^1+ p2*2^2 + p3*2^3 + p4*2^4 + p5*2^5 + p6*2^6 +p7*2^7 前輩們對此作出了總結,得出每個點周圍8領域的256種情況,放在一個char da
強化學習系列(六):時間差分演算法(Temporal-Difference Learning)
一、前言 在強化學習系列(五):蒙特卡羅方法(Monte Carlo)中,我們提到了求解環境模型未知MDP的方法——Monte Carlo,但該方法是每個episode 更新一次(episode-by-episode)。本章介紹一種單步更新的求解環境模型未知M
學習筆記(十一):使用K-Means演算法檢測DGA域名
1.資料收集與清洗:同(十) 2.特徵化:同(十) 3.訓練樣本 model = KMeans(n_clusters = 2, random_state=random_state) y_pred = model.fit_predict(x) 4.效果驗證:使用TSNE將
C++ 泛型演算法學習筆記(equal, accumulate, back_iterator, pair)
equal equal是區間比較演算法 原型為: template <class _InputIterator1, class _InputIterator2> inline _LIBCPP_INLINE_VISIBILITY bool equal(_InputIt