1. 程式人生 > >演算法學習系列(貪心演算法)—多處最優服務次序問題

演算法學習系列(貪心演算法)—多處最優服務次序問題

問題描述:
設有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個顧客等待服務時間的總和

常見機器學習演算法學習——KNNK鄰近

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 ZuulFinchley.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