成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

流暢的python:出租車仿真示例

darkbaby123 / 2561人閱讀

摘要:仿真示例出租車進(jìn)程。每次狀態(tài)變化時向仿真程序產(chǎn)出一個事件結(jié)束出租車進(jìn)程出租車仿真程序主程序。

這個簡單的例子讓我們比較淺顯易懂的看到了事件驅(qū)動型框架的運作方式,即在單個線程中使用一個主循環(huán)驅(qū)動協(xié)程執(zhí)行并發(fā)活動。

使用協(xié)程做面向事件編程時,協(xié)程會不斷的把控制權(quán)讓步給主循環(huán),激活并向前運行其他協(xié)程,從而執(zhí)行各個并發(fā)活動。這是一種協(xié)作多任務(wù):協(xié)程顯示的把控制權(quán)讓步給中央調(diào)度程序。

仿真示例

import random
import collections
import queue
import argparse
import time

DEFAULT_NUMBER_OF_TAXIS = 3
DEFAULT_END_TIME = 180
SEARCH_DURATION = 5
TRIP_DURATION = 20
DEPARTURE_INTERVAL = 5

Event = collections.namedtuple("Event", "time proc action")

#出租車進(jìn)程。
def taxi_process(ident, trips, start_time=0):
    """每次狀態(tài)變化時向仿真程序產(chǎn)出一個事件"""
    time = yield Event(start_time, ident, "leave garage")
    for i in range(trips):
        time = yield Event(time, ident, "pick up passenger")
        time = yield Event(time, ident, "drop off passenger")
    yield Event(time, ident, "going home")
    #結(jié)束出租車進(jìn)程

#出租車仿真程序主程序。
class Simulator:

    def __init__(self, procs_map):
        self.events = queue.PriorityQueue()  #優(yōu)先級隊列,put方法放入數(shù)據(jù),一般是一個數(shù)組(3, someting),get()方法數(shù)值小的優(yōu)先出隊
        self.procs = dict(procs_map)  #創(chuàng)建字典的副本

    def run(self, end_time):
        """調(diào)度并顯示事件,直到事件結(jié)束"""
        #調(diào)度各輛出租車的第一個事件
        for _, proc in sorted(self.procs.items()):
            first_event = next(proc)  #第一個事件是所有車離開車庫,也是為了激活子生成器
            self.events.put(first_event)  #所有車的第一個事件放到優(yōu)先隊列中,time小的優(yōu)先出來

        #此次仿真的主循環(huán)
        sim_time = 0
        while sim_time < end_time:
            if self.events.empty():
                print("***事件結(jié)束***")
                break
            current_event = self.events.get() #取出time最小的事件
            sim_time, proc_id, previous_action = current_event  #元組解包
            print("taxi:", proc_id, proc_id * "  ", current_event)
            active_proc = self.procs[proc_id]  #取出當(dāng)前事件對象。是一個子生成器對象,下面要對這個對象send(time)來獲得下一個yield的返回值
            next_time = sim_time + comput_duration(previous_action)  #隨機(jī)計算下一個時間
            try:
                next_event = active_proc.send(next_time)  #下一個事件是子生成器執(zhí)行到下一個yield的返回值
            except StopIteration:  #StopIteration異常說明當(dāng)前子生成器執(zhí)行完畢,從字典中刪除它
                del self.procs[proc_id]
            else:
                self.events.put(next_event) #否則就把下一個事件放入優(yōu)先隊列中
        else: #如果while循環(huán)沒有以break結(jié)束,那么輸出結(jié)束信息
            msg = "*** 仿真結(jié)束。{}個車沒有回家 ***"
            print(msg.format(self.events.qsize()))
        #仿真結(jié)束

def comput_duration(previous_action):
    """使用指數(shù)分布計算操作的耗時"""
    if previous_action in ["leave garage", "drop off passenger"]:
        interval = SEARCH_DURATION
    elif previous_action == "pick up passenger":
        #新狀態(tài)是行程開始
        interval = TRIP_DURATION
    elif previous_action == "going home":
        interval = 1
    else:
        raise ValueError("未知的活動:{}".format(previous_action))
    return int(random.expovariate(1/interval) + 1)

def main(end_time=DEFAULT_END_TIME, num_taxis=DEFAULT_NUMBER_OF_TAXIS, seed=None):
    #構(gòu)建隨機(jī)生成器,構(gòu)建過程,運行仿真程序
    if seed is not None:
        random.seed(seed)  #指定seed的值時,用這個seed可以使隨機(jī)數(shù)隨機(jī)出來的相等
    taxis = {i: taxi_process(i, (i+1*2), i*DEPARTURE_INTERVAL) for i in range(num_taxis)} #字典生成式,生成指定數(shù)量的子生成器對象
    sim = Simulator(taxis) #實例化仿真主循環(huán)
    sim.run(end_time)  #run it!

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="出租車運行仿真")  #創(chuàng)建參數(shù)解析對象,添加描述
    parser.add_argument("-e", "--end_time", type=int, default=DEFAULT_END_TIME) #添加-e參數(shù),默認(rèn)值為180
    parser.add_argument("-t", "--taxis", type=int, default=DEFAULT_NUMBER_OF_TAXIS, help="出租車出行數(shù)量, default=%s" %DEFAULT_NUMBE
R_OF_TAXIS)  #添加-t參數(shù),用來指定出租車數(shù)量,默認(rèn)值為3
    parser.add_argument("-s", "--seed", type=int, default=None, help="隨機(jī)生成seed")  #添加-s參數(shù),用來設(shè)置seed值,如果seed值一樣那
么隨機(jī)出來的結(jié)果也會一樣,默認(rèn)值為None
    args = parser.parse_args()  #這個函數(shù)用來獲取參數(shù)
    main(args.end_time, args.taxis, args.seed) #通過上面函數(shù)的屬性的到輸入的參數(shù),屬性可以是雙橫線后的字符串也可以是添加參數(shù)函數(shù)的第一個不加橫線的字符串


文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43773.html

相關(guān)文章

  • python協(xié)程3:用仿真實驗學(xué)習(xí)協(xié)程

    摘要:徘徊和行程所用的時間使用指數(shù)分布生成,我們將時間設(shè)為分鐘數(shù),以便顯示清楚。迭代表示各輛出租車的進(jìn)程在各輛出租車上調(diào)用函數(shù),預(yù)激協(xié)程。 前兩篇我們已經(jīng)介紹了python 協(xié)程的使用和yield from 的原理,這一篇,我們用一個例子來揭示如何使用協(xié)程在單線程中管理并發(fā)活動。。 什么是離散事件仿真 Wiki上的定義是: 離散事件仿真將系統(tǒng)隨時間的變化抽象成一系列的離散時間點上的事件,通過...

    banana_pi 評論0 收藏0
  • “駕駛腦”上云,同濟(jì)大學(xué)智能無人車實現(xiàn)L4高自動駕駛

    摘要:年來,途靈智能無人車實驗室一直致力于研發(fā)級全自動駕駛系統(tǒng)。目前,同濟(jì)大學(xué)途靈智能無人車實驗室正在攻克的課題就是提高級自動駕駛技術(shù)突破環(huán)境局限的能力,這種突破需要將駕駛腦放置在仿真模擬場景下進(jìn)行大量的極限訓(xùn)練。車水馬龍的道路上,各種車輛交錯匯聚,各種道路狀況頻出。從行駛緩慢的環(huán)衛(wèi)車到疾駛搶道的出租車、因施工臨時封閉的道路、突發(fā)的交通事故現(xiàn)場。作為路面上的車輛,是互不相讓,還是借道通過,又或者是...

    Tecode 評論0 收藏0
  • 華為云推出三款基于鯤鵬芯片ARM云服務(wù)

    摘要:近日,華為宣布推出業(yè)界最高性能處理器鯤鵬,以及基于鯤鵬的服務(wù)器。彈性云服務(wù)器靈活彈性,性能領(lǐng)先倍華為云將推出基于的彈性云服務(wù)器,相較于業(yè)界同類規(guī)格云服務(wù)器性能領(lǐng)先倍。近日,華為宣布推出業(yè)界最高性能ARM-based處理器-鯤鵬920(Kunpeng 920),以及基于鯤鵬 920 的TaiShan服務(wù)器。TaiShan服務(wù)器目前已經(jīng)率先應(yīng)用在華為云上,以服務(wù)的形式提供彈性云服務(wù)器、裸金屬服務(wù)...

    z2xy 評論0 收藏0
  • python大數(shù)據(jù)可視化pygal仿真模擬搖篩子完成實例

      本文關(guān)鍵為大家分享了python大數(shù)據(jù)可視化pygal仿真模擬搖篩子完成實例,感興趣的小伙伴可以參考借鑒一下,希望可以有一定的幫助,祝愿大家多多的不斷進(jìn)步,盡早漲薪  數(shù)據(jù)可視化包Pygal形成可放大矢量圖格式文檔  還可以在規(guī)格不同類型的屏上全自動放大,表明數(shù)據(jù)圖表  #安裝pygal   pipinstallpygal   '''   想要了解Pygal可生成什么樣...

    89542767 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<