手把手教你使用Python構(gòu)建一種預(yù)約式電梯調(diào)控系統(tǒng)
回復(fù)“書籍”即可獲贈Python從入門到進(jìn)階共10本電子書
大家好,我是【??(這是月亮的背面)】。
今天給大家介紹使用Python構(gòu)建一種預(yù)約式電梯調(diào)控系統(tǒng),目錄如下:
設(shè)計平臺
獨立控制電梯系統(tǒng)設(shè)計
人物模型類
隨機(jī)樓層生成類
電梯類
樓宇類
群控電梯系統(tǒng)設(shè)計
總結(jié)
最近在通勤過程中發(fā)現(xiàn)電梯系統(tǒng)也是一個有趣的項目,獨控電梯也許沒有那么大的吸引力,但在群控電梯中的系統(tǒng)設(shè)計似乎有趣了起來,如何有效的利用電梯系統(tǒng)內(nèi)所有電梯將樓宇候梯層的所有乘客準(zhǔn)確、省時、舒適的接送至目標(biāo)層成為了一個可供思考的方向。
設(shè)計平臺
windows 10 python 3.8
獨立控制電梯系統(tǒng)設(shè)計
群控電梯各電梯間的運(yùn)行本質(zhì)來講就是單個電梯獨立運(yùn)行,從而先設(shè)計出獨立電梯運(yùn)行系統(tǒng),簡單來畫下流程圖:
通過程序掃描樓宇的所有樓層的上下樓請求,并驅(qū)動電梯抵達(dá),完成乘客從請求層到目標(biāo)層的需求。主要代碼貼圖:
def take_elevator(self, elevator_data):
"""進(jìn)電梯"""
if not elevator_data:
return elevator_data
elevator_data = pd.DataFrame(elevator_data, dtype='int')
data = elevator_data[elevator_data['up'] == self.up].copy()
data2 = elevator_data[elevator_data['up'] != self.up].copy()
while data['weight'].sum() > self.weight and not data.empty: # 超重
weight_max = data[data['weight'] == data['weight'].max()].index
data2 = data2.append(data.loc[weight_max, :])
data.drop(weight_max, inplace=True)
while len(data) > self.persons and not data.empty: # 超載
weight_min = data[data['weight'] == data['weight'].min()].index
data2 = data2.append(data.loc[weight_min, :])
data.drop(weight_min, inplace=True)
self.person_data = self.person_data.append(data)
self.update_person_data(data, 'sub')
return data2.to_dict(orient='records')
為了更好的模擬現(xiàn)實電梯的請求受理狀態(tài),構(gòu)造樓宇類、人物模型類、電梯類、隨機(jī)生成人物類。
當(dāng)電梯內(nèi)的乘客數(shù)大于指定數(shù)或者載重大于限定數(shù)時,電梯不乘載當(dāng)前層的乘客。
人物模型類
傳入所在樓層,去往樓層范圍,返回乘坐電梯的人物屬性。
class PeopleRandom:
"""
構(gòu)造隨機(jī)人物模型
返回各人物屬性值,包含:所在樓層,體重,是否上樓,去往樓層
"""
def __init__(self, floor: int, floors: tuple = (1, 30), people: int = 1):
self.floor = floor
self.floor_min, self.floor_max = floors
self.people = people
self.weight = self.set_weight()
self.up = random.randint(0, 1)
self.floor_go = self.go()
隨機(jī)樓層生成類
傳入樓層范圍及該層最大生成人數(shù),返回樓宇所有樓層乘客情況。
class FloorsRandom:
"""
隨機(jī)樓層生成,樓層隨機(jī)人數(shù)生成。
"""
def __init__(self, floor_min: int, floor_max: int, people: int = 6):
"""
輸入的樓層是不存在0層,故而在floor_min進(jìn)行加1后進(jìn)行隨機(jī)取數(shù),如果小于等于0則減去1還原最低樓層。
:param floor_min: 最低樓層
:param floor_max: 最高樓層
"""
電梯類
電梯往返樓層的范圍、限重限載、運(yùn)行方向、電梯內(nèi)乘客狀況。
class Elevator:
"""
電梯模型:
能夠運(yùn)行到的最低樓層,最高樓層及當(dāng)前樓層
"""
def __init__(self, floor_min, floor_max, floor: int = 1):
self.floor = floor
self.go_max = self.floor
self.floor_min = floor_min
self.floor_max = floor_max
self.up = 1 # 1: 電梯上行,0:電梯下行
self.weight = 1000 # 電梯限重
self.persons = 12 # 電梯限制人員數(shù)量
self.person_data = pd.DataFrame(columns=['floor', 'weight', 'up', 'floor_go'])
樓宇類
樓宇間電梯運(yùn)行的樓層范圍及候梯乘客情況。
class BuildingList:
"""
樓宇模型:
最低樓層,最高樓層
"""
def __init__(self, floor_min: int = -1, floor_max: int = 30):
self.floor_min = floor_min
self.floor_max = floor_max
self.data = pd.DataFrame(columns=['floor', 'weight', 'up', 'floor_go'])
self.set_data_all('simple')
為了簡化運(yùn)算,簡化了部分模型的設(shè)計,通過隨機(jī)生成人物模型,電梯在樓宇最高層至最低層往返能夠?qū)⑺泻蛱莩丝瓦\(yùn)送至各個指定層。
設(shè)計模型代碼已開源:
https://github.com/lk20200413/FunnyCodeRepository/tree/main/預(yù)約式電梯任務(wù)系統(tǒng)
群控電梯系統(tǒng)設(shè)計
群控電梯系統(tǒng)的設(shè)計可以有效的緩解各層樓乘客的等待時間及提高電梯內(nèi)乘客的舒適度。
就以我自己為例,小區(qū)的電梯是獨立控制電梯,為了自身能夠更早的乘坐電梯,會按下每個電梯的請求按鍵,就造成了電梯內(nèi)不同程度的擁擠或延長了其他乘客的等候時間。
在此次設(shè)計前沒有查閱相關(guān)資料,在整體設(shè)計上肯定不如現(xiàn)有的成熟的算法設(shè)計,我把這個系統(tǒng)稱之為任務(wù)系統(tǒng),應(yīng)該是有與之對應(yīng)的更專業(yè)的算法。簡單來講,把樓層間請求當(dāng)做任務(wù),系統(tǒng)整理任務(wù)并分發(fā)給各個電梯,每過一段時間,系統(tǒng)再次掃描樓宇中的請求,直至沒有請求,將每個電梯轉(zhuǎn)換為獨立電梯模式,完成電梯內(nèi)乘客的目的層請求。
任務(wù)系統(tǒng)設(shè)計流程圖:
各個電梯執(zhí)行流程圖:
流程圖畫得比較粗糙,煩請各位將就著看。任務(wù)系統(tǒng)采用距離優(yōu)先進(jìn)行代碼設(shè)計,限于文章篇幅設(shè)計不方便展示有關(guān)代碼部分,可移步至
https://github.com/lk20200413/FunnyCodeRepository/tree/main/預(yù)約式電梯任務(wù)系統(tǒng)
此處或聯(lián)系作者索取代碼,TaskSystem.py為任務(wù)系統(tǒng)設(shè)計模塊,相關(guān)類的調(diào)用均沿用獨立電梯設(shè)計。
總結(jié)
大家好,我是【??(這是月亮的背面)】。本文通過用Python設(shè)計一種任務(wù)型預(yù)約電梯系統(tǒng),更深刻地理解了獨立電梯轉(zhuǎn)換為群控電梯不單單是電梯的簡單組合,整個電梯系統(tǒng)設(shè)計因素應(yīng)該以時間運(yùn)行為主,將各個電梯拆分為多線程運(yùn)行,在本設(shè)計中簡化了時間因素,用跳過樓層替代各電梯間的運(yùn)行差異。
世界上任何美好的事物都值得我們?nèi)チ魬?,不?yīng)該因為當(dāng)下的不堪而放棄了追逐夢想的權(quán)利!
于二零二一年十二月二十九日作

小伙伴們,快快用實踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
------------------- End -------------------
往期精彩文章推薦:
Py自動化辦公—Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動郵件發(fā)送實戰(zhàn)案例
手把手教你用Python腳本調(diào)用 DeepL API Pro 進(jìn)電子書的行進(jìn)行中英文自動翻譯
手把手教你用Python批量創(chuàng)建1-12月份的sheet表,每個表的第一行都有固定3個列標(biāo)題:A,B,C

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點個【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
