SimPy:用 Python 模擬真實世界的進程(SimPy用來做什么)

      網友投稿 2028 2025-03-31

      目錄

      什么是模擬

      模擬的工作原理

      如何開始使用 simpy

      如何使用 simpy 包進行模擬

      頭腦風暴模擬算法

      設置環境

      創建環境:類定義

      在環境中穿行:功能定義

      讓事情發生:功能定義

      計算等待時間:函數定義

      選擇參數:用戶輸入函數定義

      完成設置:主要功能定義

      如何運行模擬

      何時改變現狀

      結論

      現實世界充滿了機場和高速公路等經常出現擁堵和延誤的系統。當這些系統沒有優化時,它們的低效率會導致無數不滿意的客戶和時間的浪費。在本教程中,您將學習如何使用 Python 的simpy框架來創建虛擬模擬,以幫助您解決此類問題。

      在本教程中,您將學習如何:

      使用模擬來模擬真實世界的過程

      創建逐步算法來逼近復雜系統

      使用 Python設計和運行真實世界的模擬simpy

      什么是模擬

      一個模擬的真實世界系統的表示。人們可以使用這個系統的數學或計算模型來研究它是如何工作的,或者當它的一部分發生變化時會發生什么。模擬用于機場、餐廳、機械師、政府機構和許多其他系統,在這些系統中,資源分配不當會導致擁堵、客戶不滿和嚴重的運輸延誤。

      一個系統可以在那里的事情發生在任何環境。實際系統的示例包括洗車、銀行、制造工廠、機場、郵局、呼叫中心等。這些系統具有在其中進行過程的代理。例如:

      洗車將讓汽車經過洗滌過程。

      機場將讓乘客通過安全檢查程序。

      呼叫中心將讓客戶完成與電話推銷員交談的過程。

      這種關系總結在下表中:

      了解代理在系統內經歷的流程是物流規劃的重要組成部分,尤其是對于大型組織而言。例如,如果當天沒有足夠的工作人員,機場可以看到乘客在安全檢查站的等待時間猛增。類似地,如果路由不正確,對時間敏感的郵件可能會延遲數天(甚至數周)。

      這些擁塞實例可能會對時間和金錢產生現實影響,因此能夠預先對這些過程進行建模非常重要。這讓您了解系統可能在哪里遇到問題,以及應如何提前分配資源以盡可能最有效地解決這些問題。

      模擬的工作原理

      在 Python 中,您可以使用該simpy框架進行事件模擬。首先,快速了解一下模擬過程如何在 Python 中運行。下面是模擬安全檢查點系統的代碼片段。以下三行代碼設置環境,傳遞所有必要的功能,并運行模擬:

      # 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)

      上面的第一行代碼建立了環境。您將通過分配simpy.Environment()給所需的變量來完成此操作。在這里,它被簡單地命名為env。這告訴simpy創建一個名為的環境對象env,該對象將管理模擬時間并在每個后續時間步長中移動模擬。

      建立環境后,您將傳入所有將作為參數的變量。這些是您可以更改的內容,以查看系統將如何對更改做出反應。對于此安全檢查點系統,您使用以下參數:

      env:調度和處理事件的環境對象

      SimPy:用 Python 模擬真實世界的進程(simpy用來做什么)

      num_booths:身份證檢查站的數量

      check_time:?檢查乘客身份證所需的時間

      passenger_arrival:乘客到達隊列的速度

      然后,是時候運行模擬了!您可以通過調用env.run()并指定您希望模擬運行多長時間來完成此操作。模擬在幾分鐘內運行,因此此示例代碼將實時運行模擬 10 分鐘。

      注意:別擔心!您無需等待 10 分鐘即可完成模擬。因為模擬使您可以虛擬查看實時過程,所以這 10 分鐘在計算機上只需幾秒鐘。

      回顧一下,以下是在 Python 中運行模擬的三個步驟:

      建立環境。

      傳入參數。

      運行模擬。

      但在引擎蓋下還有很多事情要做!您需要了解如何選擇這些參數,并且必須定義在運行模擬時將調用的所有函數。

      讓我們開始吧!

      如何開始?simpy

      在 Python 中創建模擬之前,您應該核對一些待辦事項。您需要做的第一件事是確保您對Python 基礎知識有充分的了解。特別是,您需要很好地掌握類和生成器。

      注意:如果你需要梳洗就這些話題,然后檢查了介紹Python中的面向對象編程(OOP)和Python簡介發電機。這些是模擬過程的關鍵部分,因此您需要在繼續之前了解它們。

      您要做的下一件事是安裝所需的軟件包。您將使用的主要框架是simpy.?這是將創建、管理和運行模擬的核心包。您可以使用以下命令安裝它pip:

      $ python3 -m pip install simpy

      您還需要一些內置的 Python 模塊。您將使用該statistics模塊計算平均等待時間并使用該random模塊生成隨機數。這些是 Python 標準庫的一部分,因此您無需安裝任何新東西。

      最后,您需要選擇運行模擬的方式。通常,您可以選擇以下兩個選項之一:

      以交互方式運行它:使用Jupyter Notebook,其中每個代碼塊將包含自己的類或函數定義。輸出將顯示在筆記本的底部。

      在 shell 中運行它:將您的模擬保存為一個.py文件并告訴 Python 在您的終端中運行它。輸出將直接打印到控制臺。

      選擇您最滿意的方法!結果應該是一樣的。

      在本教程中,您將看到對名為simulate.py.?在您學習本教程時,將參考代碼塊simulate.py以幫助您跟蹤所有部分如何組合在一起。供您參考,您可以通過simulate.py以下鏈接訪問完整代碼:

      隨意保存文件simulate.py并在您最喜歡的編輯器中繼續操作!

      如何使用simpy包進行仿真

      運行模擬的第一步simpy是選擇要建模的過程。模擬就是創建一個虛擬環境來反映現實世界的系統。本著同樣的精神,您將為您的模擬“模擬”一種情況!

      想象一下,您受雇幫助當地一家小型電影院的經理。由于等待時間過長,劇院一直收到差評。既關心成本又關心客戶滿意度的經理只能留住這么多員工。

      經理特別擔心,一旦那些大片上映,會發生什么混亂:劇院周圍排起了長隊,員工被拉到了極限,憤怒的觀眾錯過了開場戲……這絕對是一種需要避免的情況!

      在檢查評論后,經理能夠確定去他們劇院的特定電影觀眾愿意從他們到達到他們坐在座位上的時間最多 10 分鐘。換句話說,在劇院過夜的平均等待時間需要為 10 分鐘或更短。經理已請求您幫助找出解決方案,使客戶的等待時間低于 10 分鐘的要求。

      頭腦風暴模擬算法

      在編寫一行代碼之前,重要的是首先要弄清楚您的流程在現實生活中的運行方式。這是為了確保當您將其傳遞給機器時,該過程準確反映了客戶將真正體驗到的內容。以下是您可能會如何思考電影觀眾可能會采取的步驟來編寫您的算法:

      到達劇院,排隊,等待購票。

      購買從票房一票。

      排隊等候檢票。

      獲取門票由一個招待員檢查。

      選擇是否在特許攤位排隊:

      如果他們排隊,那么他們就會購買食物。

      如果他們沒有排隊,那么他們會跳到最后一步。

      去找到自己的座位。

      對于在劇院售票處購買門票的電影觀眾來說,這是一個循序漸進的過程。您已經可以看到該流程的哪些部分是可以控制的。您可以通過在售票處增加更多的收銀員來影響客戶等待的時間。

      過程中也有一些部分是無法控制的,比如第一步。您無法控制有多少客戶到達,或者他們到達的速度有多快。您可以進行猜測,但您不能簡單地選擇一個數字,因為這不能很好地反映現實。對于此參數,您可以做的最好的事情是使用可用數據來確定合適的到達時間。

      注意:使用歷史數據可確保您找到的解決方案將準確反映您在現實生活中可能看到的情況。

      考慮到這些因素,是時候構建您的模擬了!

      設置環境

      在開始構建模擬之前,您需要確保正確配置了開發環境。您要做的第一件事就是導入必要的包。您可以通過import在文件頂部聲明語句來做到這一點:

      import simpy import random import statistics

      這些是您將用于為劇院經理構建腳本的主要庫。請記住,目標是找到平均等待時間少于 10 分鐘的最佳員工人數。要做到這一點,您需要收集每個電影觀眾到達他們的座位所需的時間長度。下一步是聲明一個列表來保存這些時間:

      wait_times = []

      該列表將包含每個電影觀眾從到達到坐在座位上花費在電影院中的總時間。您可以在文件的最頂部聲明 此列表,以便您可以在稍后定義的任何函數中使用它。

      創建環境:類定義

      您要構建的模擬的第一部分是系統的藍圖。這將是事情發生的整體環境,人或物體從一個地方移動到另一個地方。請記住,環境可以是許多不同系統之一,例如銀行、洗車場或安全檢查站。在這種情況下,環境是電影院,因此這將是您的類的名稱:

      class Theater(object): def __init__(self): # More to come!

      現在是時候考慮一 下電影院的各個部分了。當然,還有劇院本身,這就是您所說的環境。稍后,您將environment使用其中一個simpy函數明確地將劇院聲明為實際劇院?,F在,env簡稱它并將其添加到類定義中:

      class Theater(object): def __init__(self, env): self.env = env

      好吧,劇院里還有什么?您可以通過仔細考慮您之前計劃的模擬算法來解決這個問題。當電影觀眾到達時,他們需要在售票處排隊,收銀員將在那里等待幫助他們。現在您已經發現了有關劇院環境的兩件事:

      有收銀員。

      電影觀眾可以從他們那里購買門票。

      收銀員是劇院向顧客提供的一種資源,他們在購票過程中幫助電影觀眾?,F在,您不知道模擬劇院中有多少收銀員可用。事實上,這正是您要解決的問題。等待時間如何變化,具體取決于特定晚上工作的收銀員數量?

      您可以繼續調用這個未知變量num_cashiers。此變量將采用的確切值可以稍后整理出來?,F在,只要知道它是劇院環境中不可或缺的一部分。將其添加到類定義中:

      class Theater(object): def __init__(self, env, num_cashiers): self.env = env self.cashier = simpy.Resource(env, num_cashiers)

      在這里,您將新參數添加num_cashiers到您的__init__()定義中。然后,您創建一個資源self.cashier并使用它simpy.Resource()來聲明在任何給定時間此環境中可以有多少資源。

      注意:在 中simpy,資源是環境env中數量有限的部分 (?)。使用其中之一需要時間,并且一次只能使用這么多 (?num_cashiers) 項。

      您還需要執行一個步驟。收銀員不會自己買票吧?他們要幫助電影觀眾!同樣,您知道購買機票的過程需要一定的時間。但時間是多少?

      假設您向經理詢問了劇院的歷史數據,例如員工績效評估或購票收據。根據此數據,您了解到在售票處出票平均需要 1 到 2 分鐘。你如何simpy模仿這種行為?它只需要一行代碼:

      yield self.env.timeout(random.randint(1, 3))

      env.timeout()告訴simpy在經過一定時間后觸發事件。在這種情況下,事件是購買了票。

      這需要的時間可能是一分鐘、兩分鐘或三分鐘。您希望每個電影觀眾在收銀臺上花費不同的時間。為此,您可以random.randint()在給定的低值和高值之間選擇一個隨機數。然后,對于每個電影觀眾,模擬將等待選定的時間量。

      讓我們把它包裝在一個 tidy 函數中,并將它添加到類定義中:

      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))

      在 中啟動事件的purchase_ticket()是moviegoer,因此它們必須作為必需的參數傳遞。

      注意:您將在下一部分看到電影觀眾如何實際購買門票!

      而已!您已經選擇了一個有時限的資源,定義了它的相關流程,并將其編入了您的類定義中。對于本教程,您還需要聲明兩個資源:

      引導員查票

      服務器賣食品

      檢查經理發送過來的數據后,您確定服務器需要 1 到 5 分鐘的時間來完成訂單。此外,引座員查票速度非???,平均3秒!

      您需要將這些資源添加到您的類中并定義相應的函數check_ticket()和sell_food().?你能弄清楚代碼應該是什么樣子嗎?當你有了一個想法時,你可以展開下面的代碼塊來檢查你的理解:

      simulate.py顯示隱藏

      仔細看看新的資源和功能。請注意它們如何遵循與上述相同的格式。sell_food()用于random.randint()生成 1 到 5 分鐘之間的隨機數,表示電影觀眾下訂單和收到食物所需的時間。

      的時間延遲check_ticket()有點不同,因為引導員只需要 3 秒。由于simpy以分鐘為單位工作,因此需要將此值作為一分鐘的一小部分或3 / 60.

      在環境中穿行:功能定義

      好的,您已經通過定義一個類來設置環境。您擁有資源和流程?,F在你需要一個moviegoer來使用它們。當 amoviegoer到達劇院時,他們將請求資源,等待其過程完成,然后離開。您將創建一個名為 的函數go_to_movies()來跟蹤此情況:

      def go_to_movies(env, moviegoer, theater): # Moviegoer arrives at the theater arrival_time = env.now

      有三個參數傳遞給這個函數:

      env:該moviegoer會受到環境的控制,你會經過這個作為第一個參數。

      moviegoer:當每個人在系統中移動時,此變量會對其進行跟蹤。

      theater:此參數使您可以訪問您在整個類定義中定義的進程。

      您還聲明了一個變量arrival_time來保存每個人moviegoer到達劇院的時間。您可以使用對 的simpy調用獲得此時間env.now。

      你會希望每個從你的過程中theater有相應的要求在go_to_movies()。例如,類中的第一個進程是purchase_ticket(),它使用cashier資源。他們moviegoer需要向cashier資源發出請求以幫助他們完成整個purchase_ticket()過程。這是一個總結這個的表格:

      收銀員是一個共享資源,這意味著許多電影觀眾將使用同一個收銀員。但是,收銀員一次只能幫助一名電影觀眾,因此您需要在代碼中包含一些等待行為。這是它的工作原理:

      def go_to_movies(env, moviegoer, theater): # Moviegoer arrives at the theater arrival_time = env.now with theater.cashier.request() as request: yield request yield env.process(theater.purchase_ticket(moviegoer))

      下面是這段代碼的工作原理:

      theater.cashier.request():?moviegoer生成使用cashier.

      yield request:?如果所有當前都在使用中,則moviegoer等待 acashier變為可用。要了解有關該yield關鍵字的更多信息,請查看如何在 Python 中使用生成器和產量。

      yield env.process():?moviegoer使用可用cashier來完成給定的過程。在這種情況下,即通過調用 購買機票theater.purchase_ticket()。

      使用資源后,必須將其釋放以供下一個代理使用。您可以使用 顯式執行此操作release(),但在上面的代碼中,您使用的是with語句。此快捷方式告訴模擬在過程完成后自動釋放資源。換句話說,一旦買好票,moviegoer就會離開,收銀員會自動準備好迎接下一位顧客。

      當收銀員騰出時間時,他們moviegoer會花一些時間買票。env.process()告訴模擬轉到Theater實例并purchase_ticket()在此moviegoer.?該moviegoer會重復這一要求,使用,發布周期有自己的票檢查:

      def go_to_movies(env, moviegoer, theater): # Moviegoer arrives at the theater arrival_time = env.now with theater.cashier.request() as request: yield request yield env.process(theater.purchase_ticket(moviegoer)) with theater.usher.request() as request: yield request yield env.process(theater.check_ticket(moviegoer))

      這里,代碼的結構是相同的。

      然后,還有從特許攤位購買食物的可選步驟。您無法知道電影觀眾是否愿意購買零食和飲料。處理這種不確定性的一種方法是在函數中引入一些隨機性。

      每個人moviegoer都愿意或不愿意購買食物,您可以將其存儲為布爾值?True或False.?然后,使用random模塊讓模擬隨機決定這個特定的人moviegoer是否要去特許攤位:

      def go_to_movies(env, moviegoer, theater): # Moviegoer arrives at the theater arrival_time = env.now with theater.cashier.request() as request: yield request yield env.process(theater.purchase_ticket(moviegoer)) with theater.usher.request() as request: yield request yield env.process(theater.check_ticket(moviegoer)) if random.choice([True, False]): with theater.server.request() as request: yield request yield env.process(theater.sell_food(moviegoer))

      此條件語句將返回以下兩種結果之一:

      True:在moviegoer將請求服務器和秩序的食物。

      False:該moviegoer會,而不是去尋找自己的座位上,而無需購買任何零食。

      現在,請記住此模擬的目標是確定應在員工中的收銀員、引座員和服務員的數量,以將等待時間保持在 10 分鐘以內。要做到這一點,您需要知道任何人moviegoer到達他們的座位需要多長時間。您env.now在函數的開頭使用跟蹤arrival_time,并在每個moviegoer完成所有過程并進入劇院時再次使用:

      def go_to_movies(env, moviegoer, theater): # Moviegoer arrives at the theater arrival_time = env.now with theater.cashier.request() as request: yield request yield env.process(theater.purchase_ticket(moviegoer)) with theater.usher.request() as request: yield request yield env.process(theater.check_ticket(moviegoer)) if random.choice([True, False]): with theater.server.request() as request: yield request yield env.process(theater.sell_food(moviegoer)) # Moviegoer heads into the theater wait_times.append(env.now - arrival_time)

      您env.now用來獲取moviegoer完成所有流程并到達座位的時間。您arrival_time從該出發時間中減去觀影者的時間,并將由此產生的時間差附加到您的等候名單中wait_times。

      注意:您可以將出發時間存儲在一個單獨的變量中,例如departure_time,但這會使您的代碼非常重復,這違反了DRY 原則。

      這moviegoer是準備觀看一些預覽!

      讓事情發生:功能定義

      現在您需要定義一個函數來運行模擬。run_theater()將負責創建劇院的實例并生成電影觀眾,直到模擬停止。這個函數應該做的第一件事是創建一個劇院的實例:

      def run_theater(env, num_cashiers, num_servers, num_ushers): theater = Theater(env, num_cashiers, num_servers, num_ushers)

      由于這是主要過程,因此您需要傳遞迄今為止聲明的所有未知數:

      num_cashiers

      num_servers

      num_ushers

      這些都是模擬創建和控制環境所需的變量,因此將它們全部傳遞是絕對重要的。然后,您定義一個變量theater并告訴模擬設置具有一定數量的收銀員、服務員和招待員的劇院。

      您可能還想以一些在劇院等候的電影觀眾來開始您的模擬。估計一開門就有幾個人準備走了!經理說,預計票房一開放,大約有 3 名觀眾排隊準備買票。您可以告訴模擬繼續并通過這個初始組,如下所示:

      def run_theater(env, num_cashiers, num_servers, num_ushers): theater = Theater(env, num_cashiers, num_servers, num_ushers) for moviegoer in range(3): env.process(go_to_movies(env, moviegoer, theater))

      您range()過去常常讓 3 位電影觀眾在劇院里演出。然后,您使用env.process()告訴模擬準備移動它們穿過劇院。其余的電影觀眾將在他們自己的時間進入劇院。因此,只要模擬正在運行,該功能就應該不斷地將新客戶送入影院。

      您不知道新觀眾需要多長時間才能進入影院,因此您決定查看過去的數據。使用帶有時間戳的票房收據,您可以了解到電影觀眾平均每 12 秒就會到達劇院一次。現在你要做的就是告訴函數在生成一個新人之前等待這么長時間:

      def run_theater(env, num_cashiers, num_servers, num_ushers): theater = Theater(env, num_cashiers, num_servers, num_ushers) for moviegoer in range(3): env.process(go_to_movies(env, moviegoer, theater)) while True: yield env.timeout(0.20) # Wait a bit before generating a new person # Almost done!...

      請注意,您使用十進制數0.20來表示 12 秒。要獲得這個數字,您只需將 12 秒除以 60 秒,即一分鐘的秒數。

      等待后,該函數應遞增moviegoer1 并生成下一個人。該發電機的功能是您用來初始化第3名影迷同一個:

      def run_theater(env, num_cashiers, num_servers, num_ushers): theater = Theater(env, num_cashiers, num_servers, num_ushers) for moviegoer in range(3): env.process(go_to_movies(env, moviegoer, theater)) while True: yield env.timeout(0.20) # Wait a bit before generating a new person moviegoer += 1 env.process(go_to_movies(env, moviegoer, theater))

      而已!當您調用此函數時,模擬將生成 3 個電影觀眾開始并使用 開始在影院中移動他們go_to_movies()。之后,新的電影觀眾將以12秒的間隔到達劇院,并在他們自己的時間穿過劇院。

      計算等待時間:函數定義

      此時,您應該有一個列表wait_times,其中包含每個電影觀眾到達他們的座位所花費的總時間。現在您需要定義一個函數來幫助計算moviegoer從他們到達到他們完成檢查他們的票所花費的平均時間。get_average_wait_time()只是這樣做:

      def get_average_wait_time(wait_times): average_wait = statistics.mean(wait_times)

      此函數將您的wait_times列表作為參數并用于statistics.mean()計算平均等待時間。

      由于您正在創建將由電影院經理使用的腳本,因此您需要確保用戶可以輕松讀取輸出。您可以添加一個調用函數calculate_wait_time()來執行此操作:

      def calculate_wait_time(arrival_times, departure_times): average_wait = statistics.mean(wait_times) # Pretty print the results minutes, frac_minutes = divmod(average_wait, 1) seconds = frac_minutes * 60 return round(minutes), round(seconds)

      函數的最后一部分用于divmod()以分鐘和秒為單位返回結果,因此管理人員可以輕松了解程序的輸出。

      選擇參數:用戶輸入函數定義

      在構建這些函數時,您遇到了一些尚未明確定義的變量:

      num_cashiers

      num_servers

      num_ushers

      這些變量是您可以更改以查看模擬如何變化的參數。如果一部大片有顧客在街區周圍排隊,那么應該有多少收銀員在工作?如果人們在票房上飛馳而過卻陷入讓步怎么辦?什么值num_servers將有助于緩解流程?

      注意:這就是模擬的美妙之處。它允許您嘗試這些事情,以便您可以確定現實生活中的最佳決策。

      使用您的模擬的任何人都需要能夠更改這些參數的值以嘗試不同的場景。為此,您將創建一個輔助函數來從用戶那里獲取這些值:

      def get_user_input(): num_cashiers = input("Input # of cashiers working: ") num_servers = input("Input # of servers working: ") num_ushers = input("Input # of ushers working: ") params = [num_cashiers, num_servers, num_ushers] if all(str(i).isdigit() for i in params): # Check input is valid params = [int(x) for x in params] else: print( "Could not parse input. The simulation will use default values:", "\n1 cashier, 1 server, 1 usher.", ) params = [1, 1, 1] return params

      這個函數只是調用 Python 的input()函數來檢索用戶的數據。由于用戶輸入存在混亂的風險,您可以包含一個if/else子句來捕獲任何無效的內容。如果用戶輸入錯誤數據,則模擬將以默認值運行。

      完成設置:主要功能定義

      您要創建的最后一個函數是main().?這將確保您的腳本在命令行上執行時以正確的順序運行。您可以閱讀在 Pythonmain()中定義主要函數中的更多信息。這是你main()應該是什么樣子:

      def main(): # Setup random.seed(42) num_cashiers, num_servers, num_ushers = get_user_input() # Run the simulation env = simpy.Environment() env.process(run_theater(env, num_cashiers, num_servers, num_ushers)) env.run(until=90) # View the results mins, secs = get_average_wait_time(wait_times) print( "Running simulation...", f"\nThe average wait time is {mins} minutes and {secs} seconds.", )

      以下是main()工作原理:

      通過聲明一個隨機種子來設置您的環境。這可確保您的輸出看起來像您在本教程中看到的那樣。

      向程序的用戶查詢一些輸入。

      創建環境并將其保存為變量env,這將在每個時間步長中移動模擬。

      告訴?simpy運行進程run_theater(),它創建劇院環境并生成電影觀眾來通過它。

      確定您希望模擬運行多長時間。作為默認值,模擬設置為運行 90 分鐘。

      將 的輸出存儲get_average_wait_time()在兩個變量中,mins和secs。

      用于?print()向用戶顯示結果。

      至此,設置完成!

      如何運行模擬

      只需再多寫幾行代碼,您就可以親眼目睹您的模擬變得栩栩如生。但首先,這里是您迄今為止定義的函數和類的概述:

      Theater:這個類定義用作您要模擬的環境的藍圖。它確定有關該環境的一些信息,例如可用的資源類型以及與它們相關聯的進程。

      go_to_movies():該函數明確請求使用資源,經過關聯的過程,然后將其釋放給下一個電影觀眾。

      run_theater():此功能控制模擬。它使用Theater類藍圖創建劇院的實例,然后調用go_to_movies()生成并移動人們穿過劇院。

      get_average_wait_time():此功能可計算出moviegoer通過劇院所需的平均時間。

      calculate_wait_time():此功能可確保最終輸出易于用戶閱讀。

      get_user_input():這個函數允許用戶定義一些參數,比如有多少可用的收銀員。

      main():此功能可確保您的腳本在命令行中正常運行。

      現在,您只需要另外兩行代碼來調用您的 main 函數:

      if __name__ == '__main__': main()

      這樣,您的腳本就可以運行了!打開您的終端,導航到您存儲的位置simulate.py,然后運行以下命令:

      $ python simulate.py Input # of cashiers working:

      系統將提示您選擇仿真所需的參數。以下是使用默認參數的輸出:

      $ python simulate.py Input # of cashiers working: 1 Input # of servers working: 1 Input # of ushers working: 1 Running simulation... The average wait time is 42 minutes and 53 seconds.

      哇!等了好久?。?/p>

      何時改變現狀

      請記住,您的目標是向經理提供解決方案,了解他需要多少員工才能將等待時間保持在 10 分鐘以內。為此,您需要調整參數以查看哪些數字提供了最佳解決方案。

      首先,嘗試一些完全瘋狂的事情并最大限度地利用資源!假設有 100 個收銀員、100 個服務器和 100 個引導員在這個劇院工作。當然,這是不可能的,但是使用高得離譜的數字會很快告訴您系統的限制是多少。現在就試試:

      $ python simulate.py Input # of cashiers working: 100 Input # of servers working: 100 Input # of ushers working: 100 Running simulation... The average wait time is 3 minutes and 29 seconds.

      即使您最大限度地利用了資源,您的等待時間也只能縮短到 3 分半鐘?,F在嘗試更改數字,看看是否可以像經理要求的那樣將等待時間縮短到 10 分鐘。你想出了什么解決方案?您可以展開下面的代碼塊以查看一種可能的解決方案:

      simulate.py顯示隱藏

      此時,您將向經理展示您的結果并提出建議以幫助改進劇院。例如,為了降低成本,他可能希望在劇院前面安裝 10 個售票亭,而不是每晚都安排 10 個收銀員。

      結論

      在本教程中,您學習了如何使用該框架在 Python 中構建和運行模擬simpy。您已經了解系統如何讓代理進行處理,以及如何創建這些系統的虛擬表示以加強它們免受擁塞和延遲的影響。雖然模擬的類型可能會有所不同,但整體執行是相同的!您將能夠將在這里學到的知識應用到各種不同的場景中。

      現在你可以:

      逐步頭腦風暴模擬算法

      在 Python 中創建一個虛擬環境simpy

      定義代表代理和進程的函數

      更改模擬參數以找到最佳解決方案

      你可以用它做很多事情simpy,所以不要讓你的探索就此停止。將您學到的知識應用到新的場景中。您的解決方案可以幫助人們節省寶貴的時間和金錢,所以深入了解您可以優化的其他流程!您可以通過單擊下面的鏈接下載您在本教程中構建的腳本的源代碼:

      Python 任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表格內容變字母的解決方法(excel表格里面數字變成字母)
      下一篇:C 語言編程 — 管道(Pipe)
      相關文章
      亚洲精品福利你懂| 亚洲视频精品在线| 久久精品国产亚洲AV无码麻豆| 中国亚洲女人69内射少妇| 亚洲阿v天堂在线2017免费| 亚洲乱理伦片在线观看中字 | ASS亚洲熟妇毛茸茸PICS| 亚洲男女性高爱潮网站| 亚洲自偷精品视频自拍| 亚洲avav天堂av在线不卡| 亚洲av日韩av高潮潮喷无码| 精品亚洲永久免费精品| 久久精品国产亚洲香蕉| 亚洲专区在线视频| 亚洲成人福利网站| 亚洲人妖女同在线播放| 亚洲AV无码乱码麻豆精品国产| 亚洲国产精品成人久久久| 亚洲第一成人在线| 亚洲熟妇无码一区二区三区| 亚洲日韩国产欧美一区二区三区 | 亚洲日日做天天做日日谢| 亚洲日日做天天做日日谢| 亚洲欧洲av综合色无码| 亚洲AV无码资源在线观看| 在线观看亚洲电影| 亚洲性在线看高清h片| 亚洲色成人WWW永久网站| 亚洲日本乱码在线观看| 亚洲AV无码国产精品麻豆天美 | 亚洲av永久中文无码精品| 天天综合亚洲色在线精品| 亚洲日韩中文在线精品第一| 亚洲熟妇无码乱子AV电影| 亚洲精品人成在线观看| 亚洲毛片一级带毛片基地| 国产精品亚洲自在线播放页码 | 久久久久无码精品亚洲日韩 | 亚洲精品美女在线观看播放| 日本亚洲精品色婷婷在线影院| 亚洲欧洲免费无码|