質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

3回答

4469閲覧

【求む】待ち時間の計算方法

nobuzoh

総合スコア196

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

2グッド

3クリップ

投稿2016/05/27 07:06

編集2016/05/27 07:32

とあるショップの待ち時間の計算をどうしたものかと悩んでいます。

ショップの開店から閉店までの時間を30分で区切って、
その間に来店した顧客の人数を2年間貯めたものがデータとしてあります。
受付(来店)から支払い(退店)までの時間は一応あるのですが、
退店後しばらく経ってからデータを入力するケースがあるため当てになりません。
(当てになるのならこの件は終了ですね)

ここで、
「ざっくり」と1人が受付て支払いをするまでの時間を7分とし、
一人ずつ処理するため複数人が並列になることはない(キューってやつです)、
待ち時間が60分を越えたら「とても待つ」という表現にする、という条件で
各時間帯の待ち時間というものはどう計算したら良いものでしょうか?

私が考えているところでは、
・30分間、1人辺り7分だから、5人来店があると30分を越えるので次の30分間に繰り越しになる。
・つまり期間中に来店した人全員が要する時間は、a=繰越時間(分)、b=来店社数とすると、
a+7b分ということになる。
・待ち時間と言っても、最短、平均、最長があるはず。
・30分間の来店客の分布の仕方によって待ち時間は変動する。
・分布による待ち時間の変動も、(平均の)最短、平均、最長の3つに絞る。
・上記を踏まえ9通りのデータをプログラミングで算出したい。
といったところです。

ここまでで、質問しようと考えをまとめていたら
私なりに閃いたのでそのアルゴリズムを記述します。

1.30分を1分ごとに区切る 2.そこに来店者数を散りばめるパターンを全パターンつくる 3.各パターンで待ち時間の最短・平均・最長を算出する。 4.算出方法 a.1~30までを繰り返しながら、 b.待ち時間を0を限度にカウントダウン c.来店者がいたらその時点の待ち時間をその来店者の待ち時間とする d.待ち時間に7をカウントアップ e.来店者が他にもいたらc,dを行う f.来店者がいなかったら次の1分に進む g.30分まで終わったら、そのパターンの待ち時間の最短、平均、最長、繰越時間を算出 h.繰越時間は期間中に1人しかいない場合でも6分以内の時間がありえる。 これを考慮すると試行パターンが多くなってしまうので、 単純値(例えば8人だったら8×7-30=26)を次に繰り越す。 (または、最後の人が来た時間とその人の待ち時間から算出した繰越時間の平均値とするか?) i.次のパターンでa~hを行う。 5.各時間・各パターンの最短・平均・最長の平均を尺度に、全パターンの平均の最短・平均・最長の3パターンを取り出す

といった感じです。
スマートではない力技な感はありますが、
これでも一応はできるのかな、と思います。

他に良いアイデアはありませんでしょうか?

ちなみに、PHPで計算してその結果をデータベースに入れ込もうとしています。
ですからPHPの関数を使うことも可能です。

kaputaros, tatsuya6502👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

統計の使い方が分からないので、完全ランダムでやりました。
具体的には、私が書いたアルゴリズムの2番のところを、
・30分を1分毎に区切り、そこにその時間の人数をランダムで割り振る
・その割り振った状態における、待ち時間の、最小、最大、平均、繰越時間を算出する(算出方法へ)
・上記を1000回試行して、平均的な、最小、最大、平均、繰越時間を算出する
という具合で、それらしいデータがだせました。

投稿2016/05/30 04:12

nobuzoh

総合スコア196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

待ち行列の待ち時間は一般的な問題なので、一般解がありそうな気がしてググってみたらあるようです。
サルでも分かる待ち行列毎回忘れる-平均サービス待ち時間の計算式はわかりやすそうです。

投稿2016/05/27 08:10

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2016/05/27 08:19

これは「平均サービス時間」がわかっているとき、じゃないかな...
episteme

2016/05/27 08:24

あ...質問内容からは「平均サービス時間」がわかってるポいですね。 ならばこれでいいのか。
KiyoshiMotoki

2016/05/27 08:48 編集

質問の内容だと、30分おきに「利用率」が変動することになります。 その点を考慮すると、もっと複雑な計算式になりそうですね。 「じゃあどうすれば良いのか」 と聞かれると、今のところ何も思い浮かびませんがorz
nobuzoh

2016/05/27 09:02

30分毎に利用率は簡単にだせるので回すだけで良いとは思います。 ただ、リンク先の計算式で、30分間に平均利用時間7分で3人来たとすると、 利用率は0.7(これは数字の意味も理解できます)なのですが、 平均サービス待ち時間=0.7/0.3*7=16.333 となってしまいました。 3人同時にきても14分が最高だと思うので、何かうっかりミスな気がしますが・・・。
Chironian

2016/05/27 09:21

nobuzohさん。 30分に3人と考えると変な感じですが、1時間に6人ならあり得る話です。私も良くはわかってないのですが、確率的に処理するとそのようになるということでは? KiyoshiMotokiさん。 確かにそうですね。もう少し探してみました。すっごい難しそうなのが見つかりました。 http://www.heisei-u.ac.jp/ba/fukui/pdf/mscience2.pdf ↑の「5.6 時間とともに変化する待ち行列【第3回】」をみるとシミュレーションで解けそうです。 ↓の「3章 待ち行列シミュレーション」に、そのシミュレーション方法が記載されているようです。(同じ研究室の資料です。) http://www.heisei-u.ac.jp/ba/fukui/pdf/analysis3.pdf 超頑張れば理解できるかも?
nobuzoh

2016/05/27 09:27

ただ、平均値だけではデータとして弱く、 質問の考察にもあるように平均的な最小値、最大値も欲しいと考えています。 そうして大体これからこれくらいというのを知りたいです。 平均値って往々にして実感とは異なるものだと思うんですよ。
nobuzoh

2016/05/27 10:07

30分間にランダムに3人を割当て待ち時間を計算するプログラムを作ってみて、 1000回試行、10000回試行などして試してみたのですが、 最大待ち時間=14分(3人が同時に来たらそうですね) 最大値の平均=4分 平均値の平均=2分 という結果になりました。 この結果の妥当性なんですよねぇ・・・。
Chironian

2016/05/27 12:43 編集

稼働率が100%でない限り、最短の待ち時間は0と思います。 最長の待ち時間は確率的に発生するので、標準偏差のような値で表現することになると思います。 σを計算できれば+2σの範囲に入る確率は97.5%(40人に1人はこれ以上待つ)だそうですので、最大待ち時間の期待値として採用するのもありかも? でも、99.87%(1,000人に1人強はこれ以上待つ)程度まで確実な値とするなら+3σ取る必要が有ります。 しかし、すいません。σの計算方法を見つけることはできませんでした。 【追記】 コメントが前後しちゃいました。 > この結果の妥当性なんですよねぇ・・・。 統計理論は前提が正しければ答えも正しいです。同じ前提から出発して結果が異なる場合、恐らく、統計の方がより現実に近いだろうと思います。 【更に追記】 分かりました。 30分に3人というのは上限ではなく平均ですよね? であれば、30分間に4人、5人くることもあるので待ち時間は伸びます。 1人や2人しか来ない時もありますが、待ち時間は0以下にならないので打ち消されないです。
guest

0

2.そこに来店者数を散りばめるパターンを全パターンつくる

ここにちょっと引っかかります。ポアソン分布に従うんじゃないかしら。

投稿2016/05/27 07:16

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobuzoh

2016/05/27 07:20 編集

それであればそれで良いのでご教授願います。 多分「確率」ということになって大分アルゴリズムが違ってくるのではないかと推測します。
episteme

2016/05/27 07:30

C++なら簡単にポアソン分布を生成することができます。 std::mt19937 gen; // メルセンヌ・ツイスタ std::poisson_distribution<> dist(0.1); // 平均1分間に0.1人が来客するなら for ( int i =0; i < 10; ++i ) { // 10分間の 1分ごとの来客数は... std::cout << dist(gen) << std::endl; }
nobuzoh

2016/05/27 07:50

ちょっとC++はわかりません・・・。 PHPまたはJavascriptあたりでできれば、と思います。 それと、ポアソン分布って山がある分布って感じなのですが、 30分間の来客者というのは基本的にはランダムに近く山はないと思うのですが、 (例えば店が僻地にあって10分毎にバスが来る、とかであれば山があるのもありえない話ではないとは思います) それでもポアソン分布は使えるのでしょうか?
episteme

2016/05/27 08:04

え? ポアソン分布に山なんかないよ? たとえば1分間に平均5人くるとして、1分ごとに0人きた回数,1人きた回数,.... を積み上げると5人きた回数のとこに山ができます。この山は確率分布の山であり、30分の時間経過の中に山ができるわけじゃありません。
nobuzoh

2016/05/27 08:49

すみません、イメージがつかめないので、 たとえば30分間に10人来るとした場合に、 各分にはどのように分布するものなのでしょうか?
episteme

2016/05/27 10:45

1分あたり平均0.333人となる分布ですけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問