アナログバンクキューシステム

7221 ワード

文章学習自:小プロジェクト分析のC++模擬銀行の行列を実現する
C++を使用して銀行キューシステムを実現
一、問題の定義と分析
問題の定義
•解決すべき問題-銀行の1日以内:
1.総客数
2.顧客総滞在時間
3.顧客平均滞在時間
もんだいぶんせき
•新しく来た人は短い列を探して、列の後ろに立って並び始める
•先頭に並んでいる人は業務を行うことができます
•業務を待つために並んでいるお客様は、分散したランダムな時点で到着します.
•特徴:個別イベント、キューに入れる
•お客様が銀行に到着する時刻と銀行を離れる時刻の両方を把握
•合計顧客数の集計
•お客様が銀行に到着し、お客様が銀行を離れる2つの時点で発生したことを「イベント」と呼びます.
•シミュレーション全体をイベントの前後順に処理
•イベント駆動シミュレーション
•イベントの主な情報は、イベントのタイプとイベントが発生した時点です.
•お客様到着イベントとお客様離脱イベントの2種類
•イベントは、規則化されたテーブルに格納する必要があります
•イベントが発生した時刻順にソートされた順序のテーブル
•キュー内のお客様の主な情報は、お客様が到着した時刻と、お客様が業務を行うのに要する時間です.
•銀行の窓口数と同じキュー数
•キューごとにキューを組むお客様は、業務を行っているお客様です
•各チームのお客様には、発生するお客様がイベントから離れるイベントがあります.
二、クラスとアルゴリズム設計
クラス設計
•整列テーブルは整列チェーンテーブルを選択します.主な操作は挿入と削除です.
•キュー、お客様のキュー
•クラス図:クラスとクラスとクラスの関係を表す論理ビュー
•プログラムのアーキテクチャを構成するクラス図を用いてクラスの構造を記録する
銀行クラス:
•キュー数を表す属性を持つ
•閉店時間のプロパティが必要
•合計顧客数属性を持つ
•顧客合計滞在時間属性を持つ
•1つ以上のキューと1つの順序付きチェーンテーブルを集約
銀行クラスのメソッド:
•営業開始
•お客様の到着イベントの処理
•お客様の離脱イベントの処理
•お客様の最短キューの選択を支援
•イベントが発生した時間順にイベントが処理されていることを確認
アルゴリズムせっけい
3つのクラスイベントクラスEvent、クライアントクラスClient、銀行クラスBankを定義します.
イベントクラスEvent:2つのメンバー、イベントが発生した時間、時間のタイプ、タイプは主にお客様がイベントに到着したか、お客様がイベントを離れたかです.
顧客クラスClient:顧客到着時間と顧客滞在時間の2つのメンバーを含む
銀行類Bank:
メンバー・キューの数(銀行のウィンドウ数)、顧客数、顧客合計滞在時間、閉店時間、およびウィンドウ・キューの配列、イベント・チェーン・テーブルを含む
含める方法:
オープン営業void_open_for_day();
顧客数、総滞在時間をゼロにし、最初の顧客の到着時間をランダムに生成し、イベントチェーンテーブルに追加する.
顧客到着イベントの処理void_handle_arrival_event(Event*event);
1)お客様の滞在時間が発生し、最大30 min
2)次の顧客到着間隔を発生し、最長10 minで、次の顧客到着時間を計算し、時間が閉店時間より小さい場合、新しい顧客到着イベントがイベントチェーンテーブルに挿入され、並べ替えられる
3)ウィンドウキューの中で最も短いキューを選択する
4)顧客メンバーを生成し、最短キューに挿入する
5)キューに顧客が1人しかいない場合、顧客がイベントから離れ、イベントチェーンテーブルに挿入され、チェーンテーブル(ポイント)をソートする
6)総顧客数の増加
顧客離脱時間の処理void_handle_leave_event(Event*event);
1)お客様の総滞在時間を増やす
2)対応するキューから顧客メンバーを取り出す
3)キューに顧客メンバーが残っている場合は、その顧客の離脱イベントがイベントチェーンテーブルに挿入され、ソートされる
最短キューを返すint_find_short_queue();
タイムチェーンテーブルソートvoid_sort_event();
シミュレーション関数void_simulation();
1)オープン営業関数を呼び出し、各データを初期化する
2)イベントチェーンテーブルから順次イベントを取り出し、イベントの種類に応じて対応する関数を呼び出して処理し、イベントチェーンテーブルが空であることを知る
3)該当するデータを返す
ソース:
bank.hファイル
#ifndef BACK_H
#define BACK_H

#include
#include
#include 
#include 
#include 

using namespace std;

//   ,                
struct Event{
    int _occur_time; //       
    int _type; //     ,0    ,1-n  1-n      
    bool operator[_queue_number];
        srand((unsigned)time(NULL)); //       ,             
    }

    Bank(int _work_number, int _close_time);
    ~Bank();

    void _simulation();

private:
    int _queue_number; //    ,        
    int _client_number; //     
    int _total_stay_time; //       
    int _snoring_time; //    

    queue *_window_queue; //      ,     
    list _event_list; //         

    void _open_for_day(); //    
    void _handle_arrival_event(Event *event); //        
    void _handle_leave_event(Event *event); //        
    int _find_short_queue(); //      
    void _sort_event(); //      
};

#endif // BACK_H

bank.cppファイル
#include "back.h"
#include 
#include 
#include 
#include 

using namespace std;

Bank::Bank(int _work_number, int _close_time):_queue_number(_work_number),_snoring_time(3600*_close_time),
    _client_number(0),_total_stay_time(0)
{
    _window_queue = new queue[_queue_number];
    srand((unsigned)time(NULL)); //       ,             
}

Bank::~Bank()
{
    delete []_window_queue;
}

void Bank::_open_for_day()
{
    _client_number = 0;
    _total_stay_time = 0;

    int i = rand()%600; //                
    _event_list.push_back({i, 0});
}

/* *  1)        ,   30min
 **   2)              ,   10min,           ,         ,                    ,   
 **   3)            
 **   4)      ,           
 **   5)          ,         ,         ,    (  )
 **   6)       
*************************/
void Bank::_handle_arrival_event(Event *event)
{
    int _stat_time; //    
    int _next_client_time; //           
    _stat_time = rand()%1800 + 1; //        
    _next_client_time = rand()%600 + 1; //             

    //                   ,      ,        
    if(_next_client_time + event->_occur_time < _snoring_time)
    {
        Event _next_client_arrival;  //           
        _next_client_arrival._occur_time = _next_client_time + event->_occur_time;
        _next_client_arrival._type = 0;
        _event_list.push_back(_next_client_arrival);
        _sort_event();

    }


    int i; //      
    i = _find_short_queue();
    _window_queue[i].push({event->_occur_time, _stat_time}); //              

    //           ,                 
    if(_window_queue[i].size() == 1)
    {
        _event_list.push_back({event->_occur_time + _stat_time, i+1});  //     i+1
        _sort_event();
    }

    ++_client_number;
}

/*  1)          
    2)              
    3)           ,                   ,   
************************/
void Bank::_handle_leave_event(Event *event)
{
    Client client = _window_queue[event->_type - 1].front(); //           
    _total_stay_time += client._stay_time;
    _window_queue[event->_type - 1].pop(); //     
    if(!_window_queue[event->_type - 1].empty())
    {
        Client next_client = _window_queue[event->_type - 1].front();
        _event_list.push_back({next_client._arrival_time + next_client._stay_time, event->_type}); //               
        _sort_event(); //    
    }
}

int Bank::_find_short_queue()
{
    int minSize = 0xFFFF;
    int index = -1;
    for(int i = 0; i < _queue_number; ++i){
        if(_window_queue[i].size() < minSize){
            minSize = _window_queue[i].size();
            index = i;
        }
    }
    return index;
}

void Bank::_sort_event()
{
    _event_list.sort([](const Event &event1, const Event &event2){return event1._occur_time < event2._occur_time;});
    _event_list.sort();
}

/* 1)        ,       
     2)            ,                    ,        
     3)       
     ***********************/
void Bank::_simulation()
{
    _open_for_day(); //    
    Event event;
    while(!_event_list.empty())
    {
        event = _event_list.front(); //           
        _event_list.pop_front();  //           
        if(event._type == 0)
            _handle_arrival_event(&event);
        else
            _handle_leave_event(&event);
    }

    cout << "   :" << _client_number << endl
         << "       :" << (double)_total_stay_time/3600 << "  " << endl
         << "      :" << (double)_total_stay_time/(double)(_client_number * 60) << "  "
         << endl;
}


mainファイル
#include 
#include "back.h"

using namespace std;

int main(int argc, char *argv[])
{
    Bank bank;
    bank._simulation();
    return 0;
}