2017-02-22 1 views
1

저는 SymPy (3.0.8)를 처음 사용하고 주어진 값 (250)까지 데모 시뮬레이션 '컨퍼런스 참석자'를 실행하고 싶습니다. 즉, 토크 7 (3 회) , 1 회 휴식, 3 회, 1 회 휴식, 1 회).Simpy 시뮬레이션을 주어진 값까지 실행하십시오.

3 * 30 + 15 + 30 + 3 * 15 + 1 * 30 = 240

그러나 시뮬레이션 3 개 회담 1 브레이크, 3 개 협상 1 브레이크 (210) 후에 종료한다.

왜 '시뮬레이션'이 '토크 7'이 될 때까지 실행되지 않는지와이 문제를 해결하는 방법을 알고 싶습니다.

# import 
import simpy 
from random import randint 

# config 
TALKS_PER_SESSION = 3 
TALK_LENGTH = 30 
BREAK_LENGTH = 15 
ATTENDEES = 3 

# process function 
def attendee(env, name, knowledge=0, hunger=0): 
    talks = 0 
    breaks = 0 
    while True: 
     # Visit talks 
     for i in range(TALKS_PER_SESSION): 
      knowledge += randint(0, 3)/(1 + hunger) 
      hunger += randint(1, 4) 
      talks += 1 
      yield env.timeout(TALK_LENGTH) 

     print('Attendee %s finished %d talks with knowledge %.2f and hunger %.2f.' % (name, talks, knowledge, hunger)) 

     # Go to buffet 
     food = randint(3, 12) 
     hunger -= min(food, hunger) 
     breaks += 1 

     yield env.timeout(BREAK_LENGTH) 

     print('Attendee %s has finished break %d with hunger %.2f' % (name, breaks, hunger)) 

# setup environment and run simulation 
env = simpy.Environment() 
for i in range(ATTENDEES): 
    env.process(attendee(env, i)) 
env.run(until=250) 

이 시뮬레이션의 출력은 다음과 같습니다

Attendee 0 finished 3 talks with knowledge 2.33 and hunger 7.00. 
Attendee 1 finished 3 talks with knowledge 0.60 and hunger 8.00. 
Attendee 2 finished 3 talks with knowledge 3.81 and hunger 7.00. 
Attendee 0 has finished break 1 with hunger 0.00 
Attendee 1 has finished break 1 with hunger 0.00 
Attendee 2 has finished break 1 with hunger 0.00 
Attendee 0 finished 6 talks with knowledge 5.53 and hunger 6.00. 
Attendee 1 finished 6 talks with knowledge 1.89 and hunger 9.00. 
Attendee 2 finished 6 talks with knowledge 4.31 and hunger 5.00. 
Attendee 0 has finished break 2 with hunger 0.00 
Attendee 1 has finished break 2 with hunger 0.00 
Attendee 2 has finished break 2 with hunger 0.00 

그러나 나는 그것이 될 것으로 예상 :

Attendee 0 finished 3 talks with knowledge 2.33 and hunger 7.00. 
Attendee 1 finished 3 talks with knowledge 0.60 and hunger 8.00. 
Attendee 2 finished 3 talks with knowledge 3.81 and hunger 7.00. 
Attendee 0 has finished break 1 with hunger 0.00 
Attendee 1 has finished break 1 with hunger 0.00 
Attendee 2 has finished break 1 with hunger 0.00 
Attendee 0 finished 6 talks with knowledge 5.53 and hunger 6.00. 
Attendee 1 finished 6 talks with knowledge 1.89 and hunger 9.00. 
Attendee 2 finished 6 talks with knowledge 4.31 and hunger 5.00. 
Attendee 0 has finished break 2 with hunger 0.00 
Attendee 1 has finished break 2 with hunger 0.00 
Attendee 2 has finished break 2 with hunger 0.00 
Attendee 0 finished 7 talks with knowledge <...> and hunger <...>. 
Attendee 1 finished 7 talks with knowledge <...> and hunger <...>. 
Attendee 2 finished 7 talks with knowledge <...> and hunger <...>. 

답변

0

ATTENDEES = 1을 설정하고 내부 for 루프를 변경하십시오

for i in range(TALKS_PER_SESSION): 
     print(f'Talk {talks+1} begins at {env.now}') 
     knowledge += randint(0, 3)/(1 + hunger) 
     hunger += randint(1, 4) 
     talks += 1 
     yield env.timeout(TALK_LENGTH) 
     print(f'Talk {talks} ends at {env.now}') 

시뮬레이션을 다시 실행하고 어떤 일이 발생하는지 생각할 때 얻는 결과가 올바른지 이해해야합니다. :)

+0

고마워요! Python (3.5.3) 버전에서 작업하는 코드가 print 명령을''print { '{1}'에서 시작합니다. ''format (talks + 1, env.now))''print ' – Rene

관련 문제