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

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

新規登録して質問してみよう
ただいま回答率
85.35%
import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2873閲覧

待ち行列(M/M/1)で、うまく到着時間が動かない

matomato357159

総合スコア1

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2グッド

2クリップ

投稿2020/07/14 19:39

編集2020/07/15 02:10

前提・実現したいこと

(M/M/1)待ち時間行列のプログラムをPythonで作っています。その途中で、arriveがうまく作動していないことに気づき、arriveをきちんと動かせるようにしたいです。

発生している問題・エラーメッセージ

これを実行すると、arriveが0のときに新しい値に置き換わるはずなのですが、-1,-2…と動いてしまうことがあり、うまく実行できません。
(if文のarrive == 0 と service <= 0 が同時に起こると上記のことが起こります。)

該当のソースコード

Python

1import numpy as np 2 3def q2(num):  4 service = np.random.exponential(3) #平均サービス時間は3分間隔の指数分布 5 arrive = np.random.poisson(5) #客の到着時間は5分間隔のポアソン分布 6 queue = 0 #並んでいる行列長 7 8 for i in range(num): 9 service = service - 1 #時間を1進める 10 arrive = arrive - 1 #時間を1進める 11 12 if arrive == 0: #到着が0分になったとき 13 queue = queue + 1 #行列長+1 14 arrive = np.random.poisson(5) #新しい到着時間を出す 15 16 if service <= 0: #サービス時間が負になったとき 17 if queue >= 1: #行列長があるとき 18 queue = queue - 1 #行列長ー1 19 service = np.random.exponential(3) #新しいサービス時間 20 else: #行列長がないとき 21 service = 0 #サービス時間は0 22 23 print(arrive)

Python

1q2(10000)

試したこと

補足情報(FW/ツールのバージョンなど)

Pigu, DrqYuto👍を押しています

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

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

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

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

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

aokikenichi

2020/07/14 22:13

Pythonなのでインデントがないとわからないです 特にif文が連続してますので。質問フォームのルールにのっとってインデント付きのコードとしてください 変数numが定義されてないまま使われています。これでは動かないはずです
matomato357159

2020/07/15 02:01

インデントとコメントをつけました。
guest

回答1

0

ベストアンサー

arrive = np.random.poisson(5)0を返す場合があります。
この場合、後続するarrive = arrive - 1にて負の値になってしまいます。
提示コードではarriveが負のケースを想定していないようなので意図しない動作になっているようです。
とりあえずarrive = np.random.poisson(5)+1とするか0なら再取得するようなループを組めば解消すると思います。

ちなみに私なら問題を完全に理解できていませんが、以下のように書きます。

Python

1def run(num): 2 3 arrive = np.random.poisson(5) # 次の客が並ぶまでの時間 4 serve = 0 # 現在の処理に必要な残時間 5 queue = 0 # 行列に並んでいる人数 6 7 for i in range(num): 8 9 # 客が到着 10 if arrive <= 0: 11 queue += 1 12 arrive = np.random.poisson(5) 13 print(f'arrive={arrive}') 14 else: 15 arrive -= 1 16 17 # 窓口は空で人待ち→次の客を処理 18 if serve <= 0 and queue > 0: 19 serve = np.random.exponential(3) 20 print(f'serve={serve}') 21 queue -= 1 22 23 # 窓口で処理中 24 if serve > 0: 25 serve -= 1 26 27 if queue > 0: 28 print(f'{i:6} {queue:3}') 29 30run(100000)

投稿2020/07/15 03:00

can110

総合スコア38341

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

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

matomato357159

2020/07/15 03:26

ありがとうございます。なぜ、うまくいかないのか理解できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問