Computer >> Máy Tính >  >> Lập trình >> Python

Kiến thức cơ bản về mô phỏng sự kiện rời rạc bằng SimPy trong Python

Kiến thức cơ bản về mô phỏng sự kiện rời rạc bằng SimPy trong Python

SimPy (vần với “Blimpie”) là một gói python để mô phỏng sự kiện rời rạc theo hướng quy trình.

Cài đặt

Cách dễ nhất để cài đặt SimPy là qua pip:

pip install simpy

Và đầu ra bạn có thể nhận được sẽ giống như,

Kiến thức cơ bản về mô phỏng sự kiện rời rạc bằng SimPy trong Python

Tại thời điểm viết bài, simpy-3.0.11 là phiên bản mới nhất của SimPy và chúng tôi sẽ sử dụng nó cho tất cả các ví dụ bên dưới.

Trong trường hợp SimPy đã được cài đặt, hãy sử dụng tùy chọn –U cho pip để nâng cấp.

pip install –U simpy

Lưu ý :Bạn cần có phiên bản python 2.7 trở lên và đối với Linux / Unix / MacOS, bạn có thể cần đặc quyền root để cài đặt SimPy.

Để kiểm tra xem SimPy đã được cài đặt thành công hay chưa, hãy mở một trình bao python và nhập đơn giản.

Các khái niệm cơ bản

SimPy, là một thư viện mô phỏng sự kiện rời rạc. Các thành phần hoạt động của đơn giản (như tin nhắn, phương tiện hoặc khách hàng) được mô hình hóa bằng các quy trình. Trong SimPy, các thực thể đang hoạt động được gọi là các quy trình. Quy trình là một trình tạo Python tạo ra các sự kiện rời rạc. Xin lưu ý, tôi không trả về bất kỳ thứ gì nhưng tôi là lợi nhuận (ing), đó là sự khác biệt giữa hàm bình thường và bộ tạo. Điều này cho phép chúng tôi tạo các sự kiện và mang lại chúng để đợi chúng được kích hoạt.

Khi một quá trình tạo ra một sự kiện, thì quá trình đó sẽ bị tạm dừng. SimPy cho phép chúng tôi tiếp tục quá trình bị tạm ngưng bất cứ khi nào sự kiện được kích hoạt. Trong trường hợp, nhiều quy trình chờ cùng một sự kiện, SimPy sẽ tiếp tục chúng theo thứ tự mà chúng mang lại sự kiện đó.

def gen(x):
y = yield x+1
return y


>>> g = gen(1)
>>> next(g)
2
>>> next(g)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
next(g)
StopIteration

Lặp lại trên dừng sau biến x lợi nhuận đầu tiên.

Sự kiện thuộc loại Thời gian chờ được kích hoạt sau một khoảng thời gian (mô phỏng) nhất định đã trôi qua. Sự kiện thời gian chờ cho phép một quá trình giữ hoặc ngủ trong một khoảng thời gian nhất định. Tất cả các sự kiện bao gồm cả Thời gian chờ có thể được tạo bằng cách gọi phương thức thích hợp của Môi trường mà quá trình sống trong đó.

#Import important library
from random import randint
import simpy
#Config
TALKS_PER_SESSION = 3
TALK_LENGTH = 30
BREAK_LENGTH = 15
ATTENDEES = 1
def attendee(env, name, knowledge=0, hunger=0):
   talks =0
   breaks =0
   #Repeat sessions
   while True:
      # Visit talks
      for i in range(TALKS_PER_SESSION):
      print('Talk {0} begins at {1}'.format(talks+1, 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}')
   print('Attendee %s finished talks with knowledge %.2f and hunger ' '%.2f' %( name, knowledge, hunger))
   #Take a break, Go to buffet
   food = randint(3, 12)
   hunger -= min(food, hunger)
   yield env.timeout(BREAK_LENGTH)
   print('Attendee %s finished eating with hunger %.2f ' %(name, hunger))
# Run Simulation
env = simpy.Environment()
for i in range(ATTENDEES):
   env.process(attendee(env, i))
env.run(until=250)

Nếu chúng ta chạy chương trình trên, chúng ta sẽ thấy kết quả như sau,

Kiến thức cơ bản về mô phỏng sự kiện rời rạc bằng SimPy trong Python

Ở trên, chúng tôi cố gắng mô phỏng lại kịch bản hội trường, trong đó có một số lượng ngẫu nhiên người phát biểu có bài nói chuyện mỗi phiên là 4 người với thời lượng cuộc nói chuyện là 40 phút và ngắt quãng là 30 phút.

Quy trình dành cho người tham dự của chúng tôi yêu cầu tham chiếu đến Môi trường (env), tên, kiến ​​thức và đói để tạo các sự kiện mới. Các phiên sẽ đi theo một vòng lặp vô hạn cho đến khi nó trở thành Sai. Hàm tham dự () là một trình tạo sẽ không kết thúc nhưng sẽ chuyển luồng điều khiển trở lại mô phỏng sau khi đạt được câu lệnh lợi nhuận.

Cuối cùng, chúng tôi chạy mô phỏng demo "người tham dự hội nghị" cho đến khi không đạt được giá trị đã đặt là 250 (bao gồm- 3 cuộc nói chuyện, 1 lần nghỉ giải lao, 3 cuộc nói chuyện, 1 lần nghỉ giải lao, 1 cuộc nói chuyện).