Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Mô phỏng các quy trình trong thế giới thực bằng Python với Simpy This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Simulating Real-World Processes in Python With SimPy
Thế giới thực có đầy đủ các hệ thống, như sân bay và đường cao tốc, thường xuyên bị tắc nghẽn và chậm trễ. Khi các hệ thống này không được tối ưu hóa, sự kém hiệu quả của chúng có thể dẫn đến vô số khách hàng không hài lòng và thời gian lãng phí. Trong hướng dẫn này, bạn sẽ học cách sử dụng khung Python từ ____27 để tạo các mô phỏng ảo sẽ giúp bạn giải quyết các vấn đề như thế này.
7 framework to create virtual simulations that will help you solve problems like these.import simpy
import random
import statistics
Trong hướng dẫn này, bạn sẽ học cách:
- Sử dụng mô phỏng để mô hình hóa quy trình thực tế a simulation to model a real-world process
- Tạo thuật toán từng bước để gần đúng một hệ thống phức tạp a step-by-step algorithm to approximate a complex system
- Thiết kế và điều hành mô phỏng trong thế giới thực bằng Python với
7 and run a real-world simulation in Python withimport simpy import random import statistics
7import simpy import random import statistics
Trong hướng dẫn này, bạn sẽ tạo ra một mô phỏng cho một rạp chiếu phim địa phương. Mục tiêu của bạn là cung cấp cho người quản lý một kịch bản để giúp tìm số lượng nhân viên tối ưu để có nhân viên. Bạn có thể tải xuống mã nguồn cho tập lệnh này bằng cách nhấp vào liên kết bên dưới:
Mô phỏng là gì
Một mô phỏng là một đại diện của một hệ thống trong thế giới thực. Người ta có thể sử dụng các mô hình toán học hoặc tính toán của hệ thống này để nghiên cứu cách thức hoạt động của nó hoặc những gì xảy ra khi các phần của nó được thay đổi. Mô phỏng được sử dụng trong các sân bay, nhà hàng, cơ học, cơ quan chính phủ và nhiều hệ thống khác nơi phân bổ nguồn lực kém có thể dẫn đến tắc nghẽn, không hài lòng của khách hàng và sự chậm trễ vận chuyển quan trọng.simulation is a representation of a real-world system. One can use mathematical or computational models of this system to study how it works, or what happens when parts of it are changed. Simulations are used in airports, restaurants, mechanics, government agencies, and many other systems where poor resource allocation can lead to congestion, customer dissatisfaction, and critical transportation delays.
Một hệ thống có thể là bất kỳ môi trường nơi mọi thứ xảy ra. Ví dụ về các hệ thống trong thế giới thực bao gồm rửa xe, ngân hàng, nhà máy sản xuất, sân bay, bưu điện, trung tâm cuộc gọi, v.v. Các hệ thống này có các tác nhân trải qua các quá trình trong đó. Ví dụ:system can be any environment where things happen. Examples of real-world systems include car washes, banks, manufacturing plants, airports, post offices, call centers, and more. These systems have agents that undergo processes within them. For instance:
- Rửa xe sẽ có xe trải qua quá trình giặt. will have cars go through the washing process.
- Một sân bay sẽ có hành khách trải qua quá trình kiểm tra an ninh. will have passengers go through the security check process.
- Một trung tâm cuộc gọi sẽ có khách hàng trải qua quá trình nói chuyện với một công cụ tiếp thị qua điện thoại. will have customers go through the process of speaking with a telemarketer.
Mối quan hệ này được tóm tắt trong bảng dưới đây:
Rửa xe | Xe hơi | Rửa sạch |
Phi trường | Hành khách | Kiểm tra an ninh |
Trung tâm cuộc gọi | khách hàng | Nói chuyện với một người tiếp thị qua điện thoại |
Hiểu các quá trình mà các tác nhân trải qua trong một hệ thống là một thành phần quan trọng của lập kế hoạch hậu cần, đặc biệt là đối với các tổ chức quy mô lớn. Ví dụ, một sân bay có thể thấy thời gian chờ đợi của hành khách tại một điểm kiểm tra an ninh tăng vọt nếu có đủ công nhân ngày hôm đó. Tương tự, thư nhạy cảm với thời gian có thể bị trì hoãn theo ngày [hoặc thậm chí vài tuần] nếu nó được định tuyến đúng cách.
Những trường hợp tắc nghẽn này có thể gây ra hậu quả thực tế về thời gian và tiền bạc, vì vậy, điều quan trọng là có thể mô hình hóa các quy trình này trước đó. Điều này cung cấp cho bạn một ý tưởng về nơi hệ thống có thể gặp vấn đề và cách phân bổ tài nguyên trước để giải quyết những vấn đề đó theo cách hiệu quả nhất có thể.real-life consequences on time and money, so it’s important to be able to model these processes beforehand. This gives you an idea of where the system might run into problems and how resources should be allocated ahead of time to solve those problems in the most efficient way possible.
Cách mô phỏng hoạt động
Trong Python, bạn có thể sử dụng khung
import simpy
import random
import statistics
7 để mô phỏng sự kiện. Đầu tiên, hãy xem nhanh cách một quá trình mô phỏng sẽ chạy trong Python. Dưới đây là đoạn mã từ mô phỏng hệ thống điểm kiểm tra bảo mật. Ba dòng mã sau đây thiết lập môi trường, vượt qua tất cả các chức năng cần thiết và chạy mô phỏng:# Set up the environment
env = simpy.Environment[]
# Assume you've defined checkpoint_run[] beforehand
env.process[checkpoint_run[env, num_booths, check_time, passenger_arrival]]
# Let's go!
env.run[until=10]
Dòng mã đầu tiên ở trên thiết lập môi trường. Bạn sẽ làm điều này bằng cách gán
class Theater[object]:
def __init__[self]:
# More to come!
0 cho biến mong muốn. Ở đây, nó có tên đơn giản là class Theater[object]:
def __init__[self]:
# More to come!
1. Điều này nói với import simpy
import random
import statistics
7 để tạo một đối tượng môi trường có tên class Theater[object]:
def __init__[self]:
# More to come!
1 sẽ quản lý thời gian mô phỏng và di chuyển mô phỏng qua từng bước thời gian tiếp theo.environment. You’ll
do this by assigning class Theater[object]:
def __init__[self]:
# More to come!
0 to the desired variable. Here, it’s simply named class Theater[object]:
def __init__[self]:
# More to come!
1. This tells import simpy
import random
import statistics
7 to create an environment object named class Theater[object]:
def __init__[self]:
# More to come!
1 that will manage the simulation time and move the simulation through each subsequent time step.Khi bạn đã thiết lập môi trường của mình, bạn sẽ vượt qua tất cả các biến sẽ hoạt động như các tham số của bạn. Đây là những điều bạn có thể thay đổi để xem hệ thống sẽ phản ứng như thế nào với các thay đổi. Đối với hệ thống điểm kiểm tra bảo mật này, bạn đã sử dụng các tham số sau:parameters. These are the things you can vary to see how the system will react to changes. For this security checkpoint system, you’re using the following parameters:
1: Đối tượng môi trường để lên lịch và xử lý các sự kiện the environment object to schedule and process eventsclass Theater[object]: def __init__[self]: # More to come!
5: Số lượng gian hàng kiểm tra ID the number of ID check boothsclass Theater[object]: def __init__[self]: # More to come!
6 thời gian cần thiết để kiểm tra ID hành khách the length of time it takes to check a passenger’s IDclass Theater[object]: def __init__[self]: # More to come!
7: Tỷ lệ hành khách đến hàng đợi the rate at which passengers arrive at the queueclass Theater[object]: def __init__[self]: # More to come!
Sau đó, nó thời gian để chạy mô phỏng! Bạn có thể làm điều này bằng cách gọi
class Theater[object]:
def __init__[self]:
# More to come!
8 và chỉ định thời gian bạn muốn mô phỏng chạy. Mô phỏng chạy trong vài phút, vì vậy mã mẫu này sẽ chạy mô phỏng trong 10 phút thời gian thực.Tóm lại, đây là ba bước để chạy mô phỏng trong Python:
- Thiết lập môi trường. the environment.
- Vượt qua các tham số. in the parameters.
- Chạy mô phỏng. the simulation.
Nhưng có rất nhiều thứ đang diễn ra bên dưới mui xe! Bạn cần phải hiểu cách chọn các tham số đó và bạn sẽ phải xác định tất cả các chức năng sẽ được gọi khi mô phỏng được chạy.
Bắt đầu nào!
Làm thế nào để bắt đầu với import simpy
import random
import statistics
7
import simpy
import random
import statistics
Có một vài việc cần làm bạn nên kiểm tra danh sách của mình trước khi tạo các mô phỏng trong Python. Điều đầu tiên bạn cần làm là đảm bảo bạn có một sự hiểu biết vững chắc về những điều cơ bản của Python. Cụ thể, bạn sẽ cần phải nắm bắt tốt các lớp học và máy phát điện.
Điều tiếp theo bạn sẽ muốn làm là cài đặt gói yêu cầu. Khung chính mà bạn sẽ sử dụng là
import simpy
import random
import statistics
7. Đây là gói cốt lõi sẽ tạo, quản lý và chạy mô phỏng của bạn. Bạn có thể cài đặt nó bằng class Theater[object]:
def __init__[self, env]:
self.env = env
1:$ python3 -m pip install simpy
Bạn cũng sẽ cần một vài mô-đun Python tích hợp. Bạn sẽ sử dụng mô -đun
class Theater[object]:
def __init__[self, env]:
self.env = env
2 để tính thời gian chờ trung bình và mô -đun class Theater[object]:
def __init__[self, env]:
self.env = env
3 để tạo số ngẫu nhiên. Chúng đến như một phần của thư viện tiêu chuẩn Python, vì vậy bạn không cần phải cài đặt bất cứ điều gì mới.Cuối cùng, bạn sẽ cần chọn cách bạn muốn chạy mô phỏng của mình. Nói chung, bạn có thể chọn một trong hai tùy chọn:
- Chạy nó một cách tương tác: Sử dụng sổ ghi chép Jupyter, trong đó mỗi khối mã sẽ chứa định nghĩa lớp hoặc chức năng của riêng nó. Đầu ra sẽ được hiển thị ở dưới cùng của máy tính xách tay. Use a Jupyter Notebook, where each code block will contain its own class or function definition. The output will be displayed at the bottom of the notebook.
- Chạy nó trong shell: Lưu mô phỏng của bạn dưới dạng tệp
4 và bảo Python chạy nó trong thiết bị đầu cuối của bạn. Đầu ra sẽ được in trực tiếp vào bảng điều khiển. Save your simulation as aclass Theater[object]: def __init__[self, env]: self.env = env
4 file and tell Python to run it in your terminal. The output will be printed directly to the console.class Theater[object]: def __init__[self, env]: self.env = env
Chọn bất kỳ phương pháp nào bạn thoải mái nhất! Kết quả nên giống nhau.
Trong suốt hướng dẫn này, bạn sẽ thấy các tài liệu tham khảo về một tệp độc lập có tên
class Theater[object]:
def __init__[self, env]:
self.env = env
5. Khi bạn di chuyển qua hướng dẫn này, các khối mã sẽ tham chiếu class Theater[object]:
def __init__[self, env]:
self.env = env
5 để giúp bạn theo dõi cách tất cả các phần khớp với nhau. Để tham khảo của bạn, bạn có thể truy cập toàn bộ mã cho class Theater[object]:
def __init__[self, env]:
self.env = env
5 tại liên kết bên dưới:Vui lòng lưu tệp
class Theater[object]:
def __init__[self, env]:
self.env = env
5 và theo dõi trong trình soạn thảo yêu thích của bạn!Cách mô phỏng với gói import simpy
import random
import statistics
7
import simpy
import random
import statistics
Bước đầu tiên để chạy mô phỏng trong
import simpy
import random
import statistics
7 là chọn một quy trình để mô hình hóa. Mô phỏng là tất cả về việc tạo ra một môi trường ảo để phản ánh một hệ thống trong thế giới thực. Trong cùng tinh thần đó, bạn sẽ mô phỏng một tình huống cho mô phỏng của bạn!Hãy tưởng tượng bạn đã được thuê để giúp người quản lý cho một rạp chiếu phim nhỏ, địa phương. Nhà hát đã nhận được đánh giá kém do thời gian chờ đợi lâu. Người quản lý, người cũng quan tâm đến chi phí như anh ta về sự hài lòng của khách hàng, chỉ có thể đủ khả năng để giữ rất nhiều nhân viên trong đội ngũ nhân viên.long wait times. The manager, who is just as concerned about cost as he is about customer satisfaction, can only afford to keep so many employees on staff.
Người quản lý đặc biệt lo lắng về những gì sự hỗn loạn có thể mở ra khi những bộ phim bom tấn đó bắt đầu ra mắt: các dòng quấn quanh nhà hát, các nhân viên kéo dài đến giới hạn của họ, những người xem phim tức giận bỏ lỡ những cảnh mở đầu, đây chắc chắn là một tình huống cần tránh!
Sau khi kiểm tra các đánh giá, người quản lý đã có thể xác định rằng một người xem phim nhất định đến nhà hát của họ sẵn sàng dành nhiều nhất 10 phút kể từ khi họ đến cho đến khi họ đặt mông của họ vào một chỗ ngồi. Nói cách khác, thời gian chờ đợi trung bình cho một đêm tại nhà hát cần phải là 10 phút hoặc ít hơn. Người quản lý đã yêu cầu sự giúp đỡ của bạn để tìm ra một giải pháp để có được thời gian chờ đợi của khách hàng theo yêu cầu 10 phút này.average wait time for a night at the theater needs to be 10 minutes or less. The manager has asked for your help to figure out a solution to getting customer wait times under this 10 minute requirement.
Động não một thuật toán mô phỏng
Trước khi bạn viết ra một dòng mã duy nhất, điều quan trọng là trước tiên bạn phải tìm ra quá trình của bạn sẽ chạy trong cuộc sống thực như thế nào. Điều này là để đảm bảo rằng, khi bạn chuyển nó cho máy, quá trình này là một sự phản ánh chính xác về những gì khách hàng sẽ thực sự trải nghiệm. Tại đây, cách bạn có thể nghĩ qua các bước mà người xem phim có thể thực hiện để viết ra thuật toán của bạn:
- Đến nhà hát, xếp hàng và chờ đợi để mua vé. at the theater, get in line, and wait to purchase a ticket.
- Mua một vé từ phòng vé. a ticket from the box office.
- Chờ xếp hàng để kiểm tra vé. in line to have the ticket checked.
- Nhận vé được kiểm tra bởi một người mở. the ticket checked by an usher.
- Chọn có hay không để xếp hàng cho giá đỡ nhượng bộ:
whether or not to get in line for the concession stand:
- Nếu họ xếp hàng, thì họ mua thực phẩm. then they purchase food.
- Nếu họ không xếp hàng, thì họ bỏ qua bước cuối cùng. then they skip to the last step.
- Đi tìm chỗ ngồi của họ. find their seat.
Đây là một lần lặp từng bước cho một người xem phim mua vé của họ tại phòng vé nhà hát. Bạn đã có thể thấy phần nào của quá trình này có thể được kiểm soát. Bạn có thể ảnh hưởng đến thời gian khách hàng chờ đợi bằng cách có nhiều nhân viên thu ngân hơn tại phòng vé.
Ngoài ra còn có những phần của quá trình có thể được kiểm soát, giống như bước đầu tiên. Bạn có thể kiểm soát số lượng khách hàng sẽ đến, hoặc họ sẽ làm như thế nào. Bạn có thể đoán, nhưng bạn có thể chỉ cần chọn một số, bởi vì đó sẽ là một sự phản ánh kém của thực tế. Đối với tham số này, điều tốt nhất bạn có thể làm là sử dụng dữ liệu có sẵn để xác định thời gian đến thích hợp.use available data to determine an appropriate arrival time.
Với những điều này trong tâm trí, đó là thời gian để xây dựng mô phỏng của bạn!
Thiết lập môi trường
Trước khi bạn bắt đầu xây dựng mô phỏng của mình, bạn cần đảm bảo rằng môi trường phát triển của bạn được cấu hình đúng. Điều đầu tiên bạn muốn làm là nhập các gói cần thiết. Bạn có thể làm điều này bằng cách khai báo các câu lệnh
class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
1 ở đầu tệp của bạn:import simpy
import random
import statistics
Đây là những thư viện chính mà bạn sẽ sử dụng để xây dựng một kịch bản cho người quản lý nhà hát. Hãy nhớ rằng, mục tiêu là tìm số lượng nhân viên tối ưu cho thời gian chờ trung bình dưới 10 phút. Để làm điều này, bạn sẽ cần phải thu thập khoảng thời gian mà mỗi người xem phim phải đến chỗ ngồi của họ. Bước tiếp theo là khai báo một danh sách để giữ những lần sau:
Danh sách này sẽ chứa tổng thời gian mỗi người xem phim dành cho việc di chuyển qua nhà hát, từ khi đến ngồi trên ghế của họ. Bạn khai báo danh sách này ở đầu tệp để bạn có thể sử dụng nó bên trong bất kỳ chức năng nào bạn xác định sau này.
Tạo môi trường: Định nghĩa lớp
Phần đầu tiên của mô phỏng mà bạn muốn xây dựng là bản thiết kế cho hệ thống. Đây sẽ là môi trường tổng thể bên trong mà mọi thứ xảy ra, và con người hoặc đối tượng di chuyển từ nơi này sang nơi khác. Hãy nhớ rằng, một môi trường có thể là một trong nhiều hệ thống khác nhau, như ngân hàng, rửa xe hoặc trạm kiểm soát bảo mật. Trong trường hợp này, môi trường là một rạp chiếu phim, vì vậy đó sẽ là tên của lớp của bạn:environment can be one of many different systems, like a bank, a car wash, or a security checkpoint. In this case, the environment is a movie theater, so that will be the name of your class:
class Theater[object]:
def __init__[self]:
# More to come!
Bây giờ, thời gian để suy nghĩ thông qua các phần của rạp chiếu phim. Tất nhiên, có chính nhà hát, đó là những gì bạn đã gọi là môi trường của bạn. Sau đó, bạn sẽ tuyên bố rõ ràng nhà hát là một
class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
2 thực tế bằng cách sử dụng một trong các chức năng ____27. Ngay bây giờ, hãy gọi nó là class Theater[object]:
def __init__[self]:
# More to come!
1 và thêm nó vào định nghĩa lớp:movie theater. Of course, there’s the theater itself, which is what you’ve called your environment. Later, you’ll explicitly declare the theater as an actual class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
2 using one of the import simpy
import random
import statistics
7 functions. For now, call it class Theater[object]:
def __init__[self]:
# More to come!
1 for short and add it to the class
definition:class Theater[object]:
def __init__[self, env]:
self.env = env
Được rồi, những gì khác có thể có trong một nhà hát? Bạn có thể tìm ra điều này bằng cách suy nghĩ thông qua thuật toán mô phỏng mà bạn đã lên kế hoạch trước đó. Khi một người xem phim đến, họ sẽ cần phải xếp hàng tại phòng vé, nơi một nhân viên thu ngân sẽ chờ đợi để giúp đỡ họ. Bây giờ bạn đã phát hiện ra hai điều về môi trường nhà hát:
- Có nhân viên thu ngân.cashiers.
- Người xem phim có thể mua vé từ họ.purchase tickets from them.
Nhân viên thu ngân là một nguồn tài nguyên mà nhà hát cung cấp cho khách hàng của mình và họ giúp những người xem phim thông qua quá trình mua vé. Ngay bây giờ, bạn không biết có bao nhiêu nhân viên thu ngân trong nhà hát mô phỏng. Trên thực tế, đó là vấn đề chính mà bạn đang cố gắng giải quyết. Làm thế nào để thời gian chờ thay đổi, tùy thuộc vào số lượng nhân viên thu ngân làm việc trong một đêm nhất định?resource that the theater makes available to its customers, and they help moviegoers through the process of purchasing a ticket. Right now, you don’t know how many cashiers are available in the simulated theater. In fact, that’s the very problem you’re trying to solve. How do wait times change, depending on the number of cashiers working on a given night?
Bạn có thể đi trước và gọi đây là biến không xác định
class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
5. Giá trị chính xác mà biến này sẽ có thể được sắp xếp sau. Hiện tại, chỉ cần biết rằng nó là một phần không thể thiếu của môi trường nhà hát. Thêm nó vào định nghĩa lớp:class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
Tại đây, bạn thêm tham số mới
class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
5 vào định nghĩa class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
7 của bạn. Sau đó, bạn tạo một tài nguyên class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
8 và sử dụng class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
9 để khai báo số lượng có thể có trong môi trường này tại bất kỳ thời điểm nào.Có một bước nữa mà bạn sẽ cần phải thực hiện. Một nhân viên thu ngân sẽ không mua vé cho mình, phải không? Họ sẽ giúp người xem phim! Một lần nữa, bạn biết rằng quá trình mua vé này sẽ mất một khoảng thời gian nhất định. Nhưng chỉ là bao nhiêu thời gian?
Giả sử bạn đã yêu cầu người quản lý dữ liệu lịch sử về nhà hát, như đánh giá hiệu suất của nhân viên hoặc biên lai mua vé. Dựa trên dữ liệu này, bạn đã biết rằng trung bình, trung bình, từ 1 đến 2 phút để cấp vé tại phòng vé. Làm thế nào để bạn có được
import simpy
import random
import statistics
7 để bắt chước hành vi này? Nó chỉ mất một dòng mã:yield self.env.timeout[random.randint[1, 3]]
yield self.env.timeout[random.randint[1, 3]]
1 bảo import simpy
import random
import statistics
7 kích hoạt một sự kiện sau một khoảng thời gian nhất định đã trôi qua. Trong trường hợp này, sự kiện là một vé đã được mua.Thời gian này mất một phút, hai phút hoặc ba phút. Bạn muốn mỗi người xem phim dành một lượng thời gian khác nhau tại nhân viên thu ngân. Để làm điều này, bạn sử dụng
yield self.env.timeout[random.randint[1, 3]]
3 để chọn một số ngẫu nhiên giữa các giá trị thấp và cao đã cho. Sau đó, đối với mỗi người xem phim, mô phỏng sẽ chờ đợi khoảng thời gian được chọn.Hãy cùng loại bỏ điều này trong một hàm gọn gàng và thêm nó vào định nghĩa lớp:
class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
Một trong những sự kiện bắt đầu sự kiện trong
yield self.env.timeout[random.randint[1, 3]]
4 là yield self.env.timeout[random.randint[1, 3]]
5, vì vậy chúng phải được thông qua như một đối số bắt buộc.Đó là nó! Bạn đã chọn một tài nguyên giới hạn thời gian, xác định quy trình liên quan của nó và được mã hóa điều này trong định nghĩa lớp của bạn. Đối với hướng dẫn này, có thêm hai tài nguyên mà bạn cần phải khai báo:
- Ushers để kiểm tra vé to check tickets
- Máy chủ bán thực phẩm to sell food
Sau khi kiểm tra dữ liệu mà người quản lý đã gửi qua, bạn xác định rằng các máy chủ mất từ 1 đến 5 phút để hoàn thành đơn đặt hàng. Ngoài ra, những người sử dụng rất nhanh trong việc kiểm tra vé, với tốc độ trung bình là 3 giây!
Bạn cần phải thêm các tài nguyên này vào lớp của mình và xác định các chức năng tương ứng
yield self.env.timeout[random.randint[1, 3]]
6 và yield self.env.timeout[random.randint[1, 3]]
7. Bạn có thể tìm ra mã sẽ trông như thế nào không? Khi bạn có một ý tưởng, bạn có thể mở rộng khối mã bên dưới để kiểm tra sự hiểu biết của bạn:class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
Hãy xem xét kỹ các tài nguyên và chức năng mới. Lưu ý cách họ tuân theo định dạng giống như mô tả ở trên.
yield self.env.timeout[random.randint[1, 3]]
7 sử dụng yield self.env.timeout[random.randint[1, 3]]
3 để tạo số ngẫu nhiên trong khoảng từ 1 đến 5 phút, đại diện cho thời gian cần một người xem phim để đặt hàng và nhận thức ăn của họ.Thời gian trễ đối với
yield self.env.timeout[random.randint[1, 3]]
6 hơi khác một chút vì việc sử dụng chỉ mất 3 giây. Vì import simpy
import random
import statistics
7 hoạt động trong vài phút, giá trị này cần được thông qua dưới dạng một phần của một phút, hoặc class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
2.Di chuyển qua môi trường: Định nghĩa chức năng
Được rồi, bạn đã thiết lập môi trường bằng cách xác định một lớp. Bạn có tài nguyên và quy trình. Bây giờ bạn cần một
yield self.env.timeout[random.randint[1, 3]]
5 để sử dụng chúng. Khi một yield self.env.timeout[random.randint[1, 3]]
5 đến nhà hát, họ sẽ yêu cầu một tài nguyên, chờ quá trình của nó hoàn thành, sau đó rời đi. Bạn sẽ tạo một chức năng, được gọi là class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
5, để theo dõi điều này:yield self.env.timeout[random.randint[1, 3]]
5 to use them. When
a yield self.env.timeout[random.randint[1, 3]]
5 arrives at the theater, they’ll request a resource, wait for its process to complete, and then leave. You’ll create a function, called class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
5, to keep track of this:def go_to_movies[env, moviegoer, theater]:
# Moviegoer arrives at the theater
arrival_time = env.now
Có ba đối số được truyền cho chức năng này:
1:class Theater[object]: def __init__[self]: # More to come!
5 sẽ được điều khiển bởi môi trường, do đó, bạn sẽ vượt qua đây là đối số đầu tiên. Theyield self.env.timeout[random.randint[1, 3]]
5 will be controlled by the environment, so you’ll pass this as the first argument.yield self.env.timeout[random.randint[1, 3]]
5: Biến này theo dõi mỗi người khi họ di chuyển qua hệ thống. This variable tracks each person as they move through the system.yield self.env.timeout[random.randint[1, 3]]
9: Tham số này cho phép bạn truy cập vào các quy trình bạn đã xác định trong định nghĩa lớp tổng thể. This parameter gives you access to the processes you defined in the overall class definition.class Theater[object]: def __init__[self, env, num_cashiers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]]
Bạn cũng tuyên bố một biến
class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
0 để giữ thời gian mà mỗi yield self.env.timeout[random.randint[1, 3]]
5 đến nhà hát. Bạn có thể nhận được thời gian này bằng cách sử dụng cuộc gọi import simpy
import random
import statistics
7 tới class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
3.Bạn sẽ muốn mỗi quy trình từ
class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
9 của bạn có các yêu cầu tương ứng trong class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
5. Ví dụ: quy trình đầu tiên trong lớp là yield self.env.timeout[random.randint[1, 3]]
4, sử dụng tài nguyên class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
7. yield self.env.timeout[random.randint[1, 3]]
5 sẽ cần đưa ra yêu cầu đối với tài nguyên class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
7 để giúp họ thông qua quy trình yield self.env.timeout[random.randint[1, 3]]
4. Ở đây, một bảng để tóm tắt điều này:requests in class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
5. For example, the first process in the class is yield self.env.timeout[random.randint[1, 3]]
4, which uses a class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
7 resource. The yield self.env.timeout[random.randint[1, 3]]
5 will need to
make a request to the class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
7 resource to help them through the yield self.env.timeout[random.randint[1, 3]]
4 process. Here’s a table to summarize this:
4 | Yêu cầu một 7 |
6 | Yêu cầu một 6 |
7 | Yêu cầu một 8 |
Nhân viên thu ngân là một tài nguyên được chia sẻ, có nghĩa là nhiều người xem phim sẽ sử dụng cùng một nhân viên thu ngân. Tuy nhiên, một nhân viên thu ngân chỉ có thể giúp một người xem phim tại một thời điểm, vì vậy bạn sẽ cần phải đưa một số hành vi chờ đợi vào mã của bạn. Ở đây, cách thức hoạt động của nó:
$ python3 -m pip install simpy
0Ở đây, cách thức hoạt động của mã này:
9:def go_to_movies[env, moviegoer, theater]: # Moviegoer arrives at the theater arrival_time = env.now
5 tạo yêu cầu sử dụngyield self.env.timeout[random.randint[1, 3]]
7.class Theater[object]: def __init__[self, env, num_cashiers, num_servers, num_ushers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] self.server = simpy.Resource[env, num_servers] self.usher = simpy.Resource[env, num_ushers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]] def check_ticket[self, moviegoer]: yield self.env.timeout[3 / 60] def sell_food[self, moviegoer]: yield self.env.timeout[random.randint[1, 5]]
5 generates a request to use ayield self.env.timeout[random.randint[1, 3]]
7.class Theater[object]: def __init__[self, env, num_cashiers, num_servers, num_ushers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] self.server = simpy.Resource[env, num_servers] self.usher = simpy.Resource[env, num_ushers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]] def check_ticket[self, moviegoer]: yield self.env.timeout[3 / 60] def sell_food[self, moviegoer]: yield self.env.timeout[random.randint[1, 5]]
02:$ python3 -m pip install simpy
5 chờyield self.env.timeout[random.randint[1, 3]]
7 có sẵn nếu tất cả hiện đang được sử dụng. Để tìm hiểu thêm về từ khóaclass Theater[object]: def __init__[self, env, num_cashiers, num_servers, num_ushers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] self.server = simpy.Resource[env, num_servers] self.usher = simpy.Resource[env, num_ushers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]] def check_ticket[self, moviegoer]: yield self.env.timeout[3 / 60] def sell_food[self, moviegoer]: yield self.env.timeout[random.randint[1, 5]]
05, hãy xem cách sử dụng máy phát điện và mang lại trong Python.$ python3 -m pip install simpy
5 waits for ayield self.env.timeout[random.randint[1, 3]]
7 to become available if all are currently in use. To learn more about theclass Theater[object]: def __init__[self, env, num_cashiers, num_servers, num_ushers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] self.server = simpy.Resource[env, num_servers] self.usher = simpy.Resource[env, num_ushers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]] def check_ticket[self, moviegoer]: yield self.env.timeout[3 / 60] def sell_food[self, moviegoer]: yield self.env.timeout[random.randint[1, 5]]
05 keyword, check out How to Use Generators and yield in Python.$ python3 -m pip install simpy
06:$ python3 -m pip install simpy
5 sử dụngyield self.env.timeout[random.randint[1, 3]]
7 có sẵn để hoàn thành quy trình đã cho. Trong trường hợp này, đó là để mua một vé với một cuộc gọi đếnclass Theater[object]: def __init__[self, env, num_cashiers, num_servers, num_ushers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] self.server = simpy.Resource[env, num_servers] self.usher = simpy.Resource[env, num_ushers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]] def check_ticket[self, moviegoer]: yield self.env.timeout[3 / 60] def sell_food[self, moviegoer]: yield self.env.timeout[random.randint[1, 5]]
09.$ python3 -m pip install simpy
5 uses an availableyield self.env.timeout[random.randint[1, 3]]
7 to complete the given process. In this case, that’s to purchase a ticket with a call toclass Theater[object]: def __init__[self, env, num_cashiers, num_servers, num_ushers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] self.server = simpy.Resource[env, num_servers] self.usher = simpy.Resource[env, num_ushers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]] def check_ticket[self, moviegoer]: yield self.env.timeout[3 / 60] def sell_food[self, moviegoer]: yield self.env.timeout[random.randint[1, 5]]
09.$ python3 -m pip install simpy
Sau khi một tài nguyên được sử dụng, nó phải được giải phóng cho tác nhân tiếp theo sử dụng. Bạn có thể làm điều này một cách rõ ràng với
$ python3 -m pip install simpy
10, nhưng trong mã trên, bạn sử dụng câu lệnh $ python3 -m pip install simpy
11 thay thế. Phím tắt này cho biết mô phỏng tự động giải phóng tài nguyên sau khi quá trình hoàn tất. Nói cách khác, một khi vé được mua, yield self.env.timeout[random.randint[1, 3]]
5 sẽ rời đi và nhân viên thu ngân sẽ tự động sẵn sàng lấy khách hàng tiếp theo.Khi một nhân viên thu ngân được giải phóng,
yield self.env.timeout[random.randint[1, 3]]
5 sẽ dành thời gian mua vé của họ. $ python3 -m pip install simpy
14 bảo mô phỏng đi đến ví dụ $ python3 -m pip install simpy
15 và chạy quy trình yield self.env.timeout[random.randint[1, 3]]
4 trên yield self.env.timeout[random.randint[1, 3]]
5 này. yield self.env.timeout[random.randint[1, 3]]
5 sẽ lặp lại yêu cầu này, sử dụng, chu kỳ phát hành để kiểm tra vé của họ:request, use, release cycle to have their ticket checked:$ python3 -m pip install simpy
1Ở đây, cấu trúc cho mã là như nhau.
Sau đó, có một bước tùy chọn để mua thực phẩm từ giá đỡ. Bạn có thể biết liệu một người xem phim có muốn mua đồ ăn nhẹ và đồ uống hay không. Một cách để đối phó với sự không chắc chắn này là giới thiệu một chút ngẫu nhiên cho chức năng.randomness to the function.
Mỗi
yield self.env.timeout[random.randint[1, 3]]
5 hoặc sẽ không muốn mua thực phẩm, mà bạn có thể lưu trữ dưới dạng giá trị boolean $ python3 -m pip install simpy
20 hoặc $ python3 -m pip install simpy
21. Sau đó, sử dụng mô -đun class Theater[object]:
def __init__[self, env]:
self.env = env
3 để mô phỏng ngẫu nhiên quyết định xem yield self.env.timeout[random.randint[1, 3]]
5 cụ thể này có tiến hành đứng trên giá đỡ hay không:$ python3 -m pip install simpy
2Tuyên bố có điều kiện này sẽ trả về một trong hai kết quả:
20:$ python3 -m pip install simpy
5 sẽ yêu cầu một máy chủ và đặt hàng thực phẩm. Theyield self.env.timeout[random.randint[1, 3]]
5 will request a server and order food.yield self.env.timeout[random.randint[1, 3]]
21: Thay vào đó,$ python3 -m pip install simpy
5 sẽ đi tìm chỗ ngồi của họ mà không mua bất kỳ đồ ăn nhẹ nào. Theyield self.env.timeout[random.randint[1, 3]]
5 will instead go to find their seats without purchasing any snacks.yield self.env.timeout[random.randint[1, 3]]
Bây giờ, hãy nhớ mục tiêu của mô phỏng này là xác định số lượng nhân viên thu ngân, sử dụng và máy chủ nên có trong đội ngũ nhân viên để giữ thời gian chờ đợi dưới 10 phút. Để làm điều này, bạn sẽ cần phải biết mất bao lâu
yield self.env.timeout[random.randint[1, 3]]
5 để đưa nó lên chỗ ngồi của họ. Bạn sử dụng class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
3 khi bắt đầu chức năng để theo dõi class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
0 và một lần nữa ở cuối khi mỗi yield self.env.timeout[random.randint[1, 3]]
5 được kết thúc với tất cả các quy trình và hướng vào nhà hát:$ python3 -m pip install simpy
3Bạn sử dụng
class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
3 để có thời gian mà yield self.env.timeout[random.randint[1, 3]]
5 đã hoàn thành tất cả các quy trình và đưa nó lên ghế của họ. Bạn trừ đi bộ phim phim ảnh class Theater[object]:
def __init__[self, env, num_cashiers, num_servers, num_ushers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
self.server = simpy.Resource[env, num_servers]
self.usher = simpy.Resource[env, num_ushers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
def check_ticket[self, moviegoer]:
yield self.env.timeout[3 / 60]
def sell_food[self, moviegoer]:
yield self.env.timeout[random.randint[1, 5]]
0 từ thời gian khởi hành này và thêm sự khác biệt về thời gian kết quả vào danh sách chờ của bạn, $ python3 -m pip install simpy
35.yield self.env.timeout[random.randint[1, 3]]
5 này đã sẵn sàng để xem một số bản xem trước!Làm cho mọi thứ xảy ra: Định nghĩa chức năng
Bây giờ bạn sẽ cần xác định một chức năng để chạy mô phỏng.
$ python3 -m pip install simpy
37 sẽ chịu trách nhiệm tạo ra một ví dụ của một nhà hát và tạo ra những người xem phim cho đến khi mô phỏng dừng lại. Điều đầu tiên chức năng này nên làm là tạo một thể hiện của một nhà hát:$ python3 -m pip install simpy
4Vì đây là quá trình chính, bạn sẽ cần phải vượt qua tất cả những điều chưa biết mà bạn đã tuyên bố cho đến nay:
5class Theater[object]: def __init__[self, env, num_cashiers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers]
39$ python3 -m pip install simpy
40$ python3 -m pip install simpy
Đây là tất cả các biến mà mô phỏng cần tạo ra và kiểm soát môi trường, vì vậy, nó rất quan trọng để vượt qua tất cả. Sau đó, bạn xác định một biến
class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
9 và nói với mô phỏng để thiết lập nhà hát với một số lượng nhân viên thu ngân, máy chủ và sử dụng nhất định.Bạn cũng có thể muốn bắt đầu mô phỏng của mình với một vài người xem phim đang chờ tại nhà hát. Có lẽ sẽ có một vài người sẵn sàng để đi ngay khi cánh cửa mở ra! Người quản lý nói rằng sẽ mong đợi khoảng 3 người xem phim phù hợp để mua vé ngay khi phòng vé mở cửa. Bạn có thể bảo mô phỏng đi trước và di chuyển qua nhóm ban đầu này như vậy:
$ python3 -m pip install simpy
5Bạn sử dụng
$ python3 -m pip install simpy
42 để điền vào nhà hát với 3 người xem phim. Sau đó, bạn sử dụng $ python3 -m pip install simpy
14 để nói với mô phỏng để chuẩn bị di chuyển chúng qua nhà hát. Phần còn lại của những người xem phim sẽ đến nhà hát trong thời gian riêng của họ. Vì vậy, chức năng nên tiếp tục gửi khách hàng mới vào nhà hát miễn là mô phỏng đang chạy.Bạn không biết rằng những người xem phim mới sẽ mất bao lâu để đến nhà hát, vì vậy bạn quyết định xem dữ liệu trong quá khứ. Sử dụng biên lai thời gian từ phòng vé, bạn biết rằng những người xem phim có xu hướng đến nhà hát, trung bình, cứ sau 12 giây. Bây giờ tất cả những gì bạn phải làm là nói với chức năng chờ đợi điều này từ lâu trước khi tạo ra một người mới:
$ python3 -m pip install simpy
6Lưu ý rằng bạn sử dụng số thập phân
$ python3 -m pip install simpy
44 để biểu thị 12 giây. Để có được số này, bạn chỉ cần chia 12 giây cho 60 giây, đó là số giây trong một phút.Sau khi chờ đợi, chức năng sẽ tăng
yield self.env.timeout[random.randint[1, 3]]
5 thêm 1 và tạo người tiếp theo. Chức năng của Trình tạo là cùng một chức năng bạn đã sử dụng để khởi tạo 3 người xem phim đầu tiên:$ python3 -m pip install simpy
7Đó là nó! Khi bạn gọi chức năng này, mô phỏng sẽ tạo ra 3 người xem phim để bắt đầu và bắt đầu di chuyển chúng qua nhà hát với
class Theater[object]:
def __init__[self, env, num_cashiers]:
self.env = env
self.cashier = simpy.Resource[env, num_cashiers]
def purchase_ticket[self, moviegoer]:
yield self.env.timeout[random.randint[1, 3]]
5. Sau đó, những người xem phim mới sẽ đến nhà hát với khoảng 12 giây và di chuyển qua nhà hát trong thời gian riêng của họ.Tính thời gian chờ: Định nghĩa chức năng
Tại thời điểm này, bạn nên có một danh sách
$ python3 -m pip install simpy
35 chứa tổng số lượng thời gian mà mỗi người xem phim phải đưa nó vào chỗ ngồi của họ. Bây giờ, bạn sẽ muốn xác định một chức năng để giúp tính toán thời gian trung bình mà yield self.env.timeout[random.randint[1, 3]]
5 dành từ khi họ đến khi họ hoàn thành việc kiểm tra vé của họ. $ python3 -m pip install simpy
49 không chỉ điều này:$ python3 -m pip install simpy
8Hàm này lấy danh sách
$ python3 -m pip install simpy
35 của bạn làm đối số và sử dụng $ python3 -m pip install simpy
51 để tính thời gian chờ trung bình.Vì bạn tạo ra một tập lệnh sẽ được người quản lý rạp chiếu phim sử dụng, bạn sẽ muốn đảm bảo rằng đầu ra có thể được người dùng đọc dễ dàng. Bạn có thể thêm một chức năng gọi là
$ python3 -m pip install simpy
52 để làm điều này:$ python3 -m pip install simpy
9Phần cuối cùng của chức năng sử dụng
$ python3 -m pip install simpy
53 để trả về kết quả trong vài phút và giây, do đó, người quản lý có thể dễ dàng hiểu được đầu ra của chương trình.Chọn tham số: Định nghĩa chức năng đầu vào của người dùng
Khi bạn đã xây dựng các chức năng này, bạn đã chạy thành một vài biến chưa được xác định rõ ràng:
5class Theater[object]: def __init__[self, env, num_cashiers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers]
39$ python3 -m pip install simpy
40$ python3 -m pip install simpy
Các biến này là các tham số mà bạn có thể thay đổi để xem cách mô phỏng thay đổi. Nếu một bộ phim bom tấn có khách hàng xếp hàng xung quanh khối, có bao nhiêu nhân viên thu ngân? Điều gì sẽ xảy ra nếu mọi người đang bay qua phòng vé nhưng bị mắc kẹt trong nhượng bộ? Giá trị nào của
$ python3 -m pip install simpy
39 sẽ giúp giảm bớt dòng chảy?change to see how the simulation changes. If a blockbuster movie has customers lining up around the block, how many cashiers should be working? What if people are flying through the box office but getting stuck at concessions? What value of $ python3 -m pip install simpy
39 will help ease the flow?Bất cứ ai đang sử dụng mô phỏng của bạn cần có khả năng thay đổi các giá trị của các tham số này để thử các kịch bản khác nhau. Để kết thúc này, bạn sẽ tạo một hàm trợ giúp để lấy các giá trị này từ người dùng:
import simpy
import random
import statistics
0Chức năng này chỉ đơn giản gọi chức năng Python từ
$ python3 -m pip install simpy
58 để truy xuất dữ liệu từ người dùng. Bởi vì đầu vào của người dùng có nguy cơ bị lộn xộn, bạn có thể bao gồm một điều khoản $ python3 -m pip install simpy
59 để bắt bất cứ điều gì không hợp lệ. Nếu người dùng nhập dữ liệu xấu, thì mô phỏng sẽ chạy với các giá trị mặc định.
Hoàn thiện thiết lập: Định nghĩa chức năng chính
Chức năng cuối cùng mà bạn sẽ muốn tạo là
$ python3 -m pip install simpy
60. Điều này sẽ đảm bảo tập lệnh của bạn chạy theo thứ tự thích hợp khi bạn thực thi nó trên dòng lệnh. Bạn có thể đọc thêm về $ python3 -m pip install simpy
60 trong việc xác định các chức năng chính trong Python. Ở đây, những gì $ python3 -m pip install simpy
60 của bạn sẽ trông như thế nào:import simpy
import random
import statistics
1Ở đây, cách thức hoạt động của
$ python3 -m pip install simpy
60:- Thiết lập môi trường của bạn bằng cách tuyên bố một hạt giống ngẫu nhiên. Điều này đảm bảo đầu ra của bạn sẽ trông giống như những gì bạn thấy trong hướng dẫn này. your environment by declaring a random seed. This ensures your output will look like what you see in this tutorial.
- Truy vấn người dùng chương trình của bạn cho một số đầu vào. the user of your program for some input.
- Tạo môi trường và lưu nó dưới dạng biến
1, sẽ di chuyển mô phỏng qua mỗi bước thời gian. the environment and save it as the variableclass Theater[object]: def __init__[self]: # More to come!
1, which will move the simulation through each time step.class Theater[object]: def __init__[self]: # More to come!
- Nói với
7 để chạy quá trìnhimport simpy import random import statistics
37, tạo ra môi trường nhà hát và tạo ra những người xem phim để di chuyển qua nó.$ python3 -m pip install simpy
7 to run the processimport simpy import random import statistics
37, which creates the theater environment and generates moviegoers to move through it.$ python3 -m pip install simpy
- Xác định thời gian bạn muốn mô phỏng chạy. Là một giá trị mặc định, mô phỏng được đặt để chạy trong 90 phút. how long you want the simulation to run. As a default value, the simulation is set to run for 90 minutes.
- Lưu trữ đầu ra của
49 trong hai biến,$ python3 -m pip install simpy
68 và$ python3 -m pip install simpy
69. the output of$ python3 -m pip install simpy
49 in two variables,$ python3 -m pip install simpy
68 and$ python3 -m pip install simpy
69.$ python3 -m pip install simpy
- Sử dụng
70 để hiển thị kết quả cho người dùng.$ python3 -m pip install simpy
70 to show the results to the user.$ python3 -m pip install simpy
Với điều này, thiết lập đã hoàn tất!
Cách chạy mô phỏng
Chỉ với một vài dòng mã nữa, bạn sẽ có thể xem mô phỏng của mình trở nên sống động. Nhưng trước tiên, ở đây, một cái nhìn tổng quan về các chức năng và các lớp mà bạn đã xác định cho đến nay:
15: Định nghĩa lớp này đóng vai trò là bản thiết kế cho môi trường bạn muốn mô phỏng. Nó xác định một số thông tin về môi trường đó, giống như loại tài nguyên nào có sẵn và quy trình nào được liên kết với chúng. This class definition serves as a blueprint for the environment you want to simulate. It determines some information about that environment, like what kinds of resources are available, and what processes are associated with them.$ python3 -m pip install simpy
5: Hàm này đưa ra các yêu cầu rõ ràng để sử dụng tài nguyên, trải qua quá trình liên quan và sau đó phát hành nó cho người xem phim tiếp theo. This function makes explicit requests to use a resource, goes through the associated process, and then releases it to the next moviegoer.class Theater[object]: def __init__[self, env, num_cashiers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]]
37: Hàm này kiểm soát mô phỏng. Nó sử dụng bản thiết kế lớp$ python3 -m pip install simpy
15 để tạo ra một ví dụ của một nhà hát, và sau đó gọi$ python3 -m pip install simpy
5 để tạo và di chuyển mọi người qua nhà hát. This function controls the simulation. It uses theclass Theater[object]: def __init__[self, env, num_cashiers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]]
15 class blueprint to create an instance of a theater, and then calls on$ python3 -m pip install simpy
5 to generate and move people through the theater.class Theater[object]: def __init__[self, env, num_cashiers]: self.env = env self.cashier = simpy.Resource[env, num_cashiers] def purchase_ticket[self, moviegoer]: yield self.env.timeout[random.randint[1, 3]]
49: Chức năng này tìm thấy thời gian trung bình cần$ python3 -m pip install simpy
5 để đi qua nhà hát. This function finds the average time it takes ayield self.env.timeout[random.randint[1, 3]]
5 to make it through the theater.yield self.env.timeout[random.randint[1, 3]]
52: Hàm này đảm bảo đầu ra cuối cùng dễ dàng cho người dùng đọc. This function ensures the final output is easy for the user to read.$ python3 -m pip install simpy
79: Hàm này cho phép người dùng xác định một số tham số, như có bao nhiêu nhân viên thu ngân. This function allows the user to define some parameters, like how many cashiers are available.$ python3 -m pip install simpy
60: Hàm này đảm bảo rằng tập lệnh của bạn chạy đúng trong dòng lệnh. This function ensures that your script runs properly in the command line.$ python3 -m pip install simpy
Bây giờ, bạn chỉ cần thêm hai dòng mã để gọi chức năng chính của mình:
import simpy
import random
import statistics
2Với điều đó, kịch bản của bạn đã sẵn sàng để chạy! Mở thiết bị đầu cuối của bạn, điều hướng đến nơi bạn đã lưu trữ
class Theater[object]:
def __init__[self, env]:
self.env = env
5 và chạy lệnh sau:import simpy
import random
import statistics
3Bạn sẽ được nhắc chọn các tham số bạn muốn cho mô phỏng của mình. Tại đây, đầu ra trông như thế nào với các tham số mặc định:
import simpy
import random
import statistics
4Ái chà! Đó là một thời gian dài để chờ đợi xung quanh!
Khi nào thay đổi mọi thứ
Hãy nhớ rằng, mục tiêu của bạn là tiếp cận người quản lý với một giải pháp cho bao nhiêu nhân viên mà anh ấy sẽ cần cho nhân viên để giữ thời gian chờ đợi dưới 10 phút. Để kết thúc này, bạn sẽ muốn chơi xung quanh với các tham số của mình để xem số nào cung cấp một giải pháp tối ưu.
Đầu tiên, hãy thử một cái gì đó hoàn toàn điên rồ và tối đa hóa các tài nguyên! Giả sử có 100 nhân viên thu ngân, 100 máy chủ và 100 người sử dụng trong nhà hát này. Tất nhiên, điều này là không thể, nhưng sử dụng số cực kỳ cao sẽ nhanh chóng cho bạn biết giới hạn của hệ thống là gì. Thử ngay bây giờ:
import simpy
import random
import statistics
5Ngay cả khi bạn tối đa hóa các tài nguyên, bạn sẽ chỉ nhận được thời gian chờ xuống 3 phút rưỡi. Bây giờ hãy thử và thay đổi các số để xem liệu bạn có thể giảm thời gian chờ đến 10 phút, như người quản lý được yêu cầu. Bạn đã đưa ra giải pháp nào? Bạn có thể mở rộng khối mã bên dưới để xem một giải pháp khả thi:
import simpy
import random
import statistics
6Tại thời điểm này, bạn sẽ trình bày kết quả của mình cho người quản lý và đưa ra gợi ý để giúp cải thiện nhà hát. Chẳng hạn, để cắt giảm chi phí, anh ta có thể muốn cài đặt 10 ki -ốt vé ở phía trước nhà hát thay vì giữ 10 nhân viên thu ngân mỗi đêm.
Sự kết luận
Trong hướng dẫn này, bạn đã học được cách xây dựng và chạy một mô phỏng trong Python bằng cách sử dụng khung công tác
import simpy
import random
import statistics
7. Bạn đã hiểu làm thế nào các hệ thống có các tác nhân trải qua các quá trình và cách bạn có thể tạo các biểu diễn ảo của các hệ thống đó để củng cố chúng chống lại sự tắc nghẽn và chậm trễ. Trong khi loại mô phỏng có thể khác nhau, nhưng thực thi tổng thể là như nhau! Bạn có thể áp dụng những gì bạn đã học được ở đây vào một loạt các kịch bản khác nhau.build and run a simulation in Python using the import simpy
import random
import statistics
7 framework. You’ve come to understand how systems have agents undergo processes, and how you can create virtual representations of those systems to
fortify them against congestion and delay. While the type of simulation can vary, the overall execution is the same! You’ll be able to apply what you’ve learned here to a variety of different scenarios.Bây giờ bạn có thể:
- Động não một thuật toán mô phỏng từng bước a simulation algorithm step by step
- Tạo một môi trường ảo trong Python với
7 a virtual environment in Python withimport simpy import random import statistics
7import simpy import random import statistics
- Xác định các chức năng đại diện cho các tác nhân và quy trình functions that represent agents and processes
- Thay đổi các tham số của mô phỏng của bạn để tìm giải pháp tối ưu parameters of your simulation to find the optimal solution
Có rất nhiều bạn có thể làm với
import simpy
import random
import statistics
7, vì vậy, hãy để cho việc khám phá của bạn dừng lại ở đây. Lấy những gì bạn đã học và áp dụng nó vào các kịch bản mới. Các giải pháp của bạn có thể giúp tiết kiệm thời gian và tiền bạc quý giá của mọi người, vì vậy hãy đi sâu vào và xem những quy trình khác bạn có thể tối ưu hóa! Bạn có thể tải xuống mã nguồn cho tập lệnh bạn đã xây dựng trong hướng dẫn này bằng cách nhấp vào liên kết bên dưới:Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Mô phỏng các quy trình trong thế giới thực bằng Python với Simpy This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Simulating Real-World Processes in Python With SimPy