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

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

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

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

Q&A

解決済

1回答

1011閲覧

simpyのシミュレーションをfor文で回しながら結果を格納する方法

tarouyamadaaaaa

総合スコア2

Python

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

0グッド

0クリップ

投稿2020/08/12 12:43

前提・実現したいこと

Pythonのsimpyでシミュレーションをしています。for文を使ってシミュレーション条件を変えながら実行しているのですが、条件毎に結果を格納することができません。

該当のソースコード

Python

1import simpy 2import numpy as np 3import random 4 5p = [] #結果を格納する配列 6arrive_time = [] #客が到着したときの時刻 7stay_time = 0 #滞在時間 8service = True #def queue()を重複して行わないための変数 9 10#客の到着率、サービス率は指数分布に従う 11env = simpy.Environment() 12 13for i in range(1, 10, 1): 14 # 到着 15 def arrive(): 16 global arrive_time, servive 17 while True: 18 yield env.timeout(random.expovariate(i)) #平均到着率 19 arrive_time.append(env.now) 20 if(service): #serviceがTrueの時実行 21 env.process(queue()) 22 23 # 待ち行列に並ぶ 24 def queue(): 25 global stay_time, arrive_time, service 26 service = False #実行している時はFalse 27 while len(arrive_time) > 0: #客が一人でもいる 28 yield env.timeout(random.expovariate(1.0)) #平均サービス率 29 stay_time += (env.now - arrive_time[0]) #客一人あたりの滞在時間を積算 30 arrive_time = arrive_time[1:] 31 32 service = True #実行していない時はTrue 33 34# 実行 35env.process(arrive()) 36env.run(until = 1000000) #単位時間1000000で実行

試したこと

Python

1 2 3for i in range(1, 10, 1): 4 # 到着 5 def arrive(): 6 global arrive_time, servive 7 while True: 8 yield env.timeout(random.expovariate(i)) #平均到着率 9 arrive_time.append(env.now) 10 if(service): #serviceがTrueの時実行 11 env.process(queue()) 12 13 # 待ち行列に並ぶ 14 def queue(): 15 global stay_time, arrive_time, service 16 service = False #実行している時はFalse 17 while len(arrive_time) > 0: #客が一人でもいる 18 yield env.timeout(random.expovariate(1.0)) #平均サービス率 19 stay_time += (env.now - arrive_time[0]) #客一人あたりの滞在時間を積算 20 arrive_time = arrive_time[1:] 21 22 service = True #実行していない時はTrue 23 24#実行 25env.process(arrive()) 26env.run(until = 1000000) #単位時間1000000で実行 27p.append(stay_time/1000000)
結果 p = [9.178673084289517]

p.appendをfor文の外に書くとi=9、つまり最後の条件での結果しか格納することができませんでした。

Python

1for i in range(1, 10, 1): 2 # 到着 3 def arrive(): 4 global arrive_time, servive 5 while True: 6 yield env.timeout(random.expovariate(i)) #平均到着率 7 arrive_time.append(env.now) 8 if(service): #serviceがTrueの時実行 9 env.process(queue()) 10 11 # 待ち行列に並ぶ 12 def queue(): 13 global stay_time, arrive_time, service 14 service = False #実行している時はFalse 15 while len(arrive_time) > 0: #客が一人でもいる 16 yield env.timeout(random.expovariate(1.0)) #平均サービス率 17 stay_time += (env.now - arrive_time[0]) #客一人あたりの滞在時間を積算 18 arrive_time = arrive_time[1:] 19 20 service = True #実行していない時はTrue 21 p.append(stay_time/1000000) 22 23# 実行 24env.process(arrive()) 25env.run(until = 1000000) #単位時間1000000で実行
結果 p = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

ですが、p.appendをfor文の中に入れると0.0と格納されました。i = 1, 2, 3, ... , 9の時の結果を逐一
配列pに保存したいのですが、ご存知の方がいらっしゃったらよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1import simpy 2import numpy as np 3import random 4 5 6# 到着 7def arrive(): 8 global arrive_time, servive 9 while True: 10 yield env.timeout(random.expovariate(i)) #平均到着率 11 arrive_time.append(env.now) 12 if(service): #serviceがTrueの時実行 13 env.process(queue()) 14 15# 待ち行列に並ぶ 16def queue(): 17 global stay_time, arrive_time, service 18 service = False #実行している時はFalse 19 while len(arrive_time) > 0: #客が一人でもいる 20 yield env.timeout(random.expovariate(1.0)) #平均サービス率 21 stay_time += (env.now - arrive_time[0]) #客一人あたりの滞在時間を積算 22 arrive_time = arrive_time[1:] 23 24 service = True #実行していない時はTrue 25 26p = [] #結果を格納する配列 27# 実行 28for i in range(1, 10, 1): 29 arrive_time = [] #客が到着したときの時刻 30 stay_time = 0 #滞在時間 31 service = True #def queue()を重複して行わないための変数 32 33 #客の到着率、サービス率は指数分布に従う 34 env = simpy.Environment() 35 env.process(arrive()) 36 env.run(until = 1000) #単位時間1000000で実行 37 p.append(stay_time/1000) 38print(p)

text

1[18.63256876324071, 261.2170322774334, 347.5949458226635, 371.1431817372992, 412.663863435399, 397.24041962617264, 406.76534792336884, 430.4625321844608, 420.18530177986213]

投稿2020/08/13 17:56

Penpen7

総合スコア698

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問