欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python模擬簡(jiǎn)單電梯調(diào)度算法示例

 更新時(shí)間:2018年08月20日 14:27:12   作者:zzulp  
這篇文章主要介紹了Python模擬簡(jiǎn)單電梯調(diào)度算法,涉及Python線程、隊(duì)列、時(shí)間延遲等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python模擬簡(jiǎn)單電梯調(diào)度算法。分享給大家供大家參考,具體如下:

經(jīng)常在公司坐電梯,由于樓層較高,是雙聯(lián)裝的電梯,但是經(jīng)常等電梯很久,經(jīng)常有人罵寫電梯調(diào)度算法的?;貋黹e來無事,自己嘗試寫了一個(gè)簡(jiǎn)單的。

場(chǎng)景很簡(jiǎn)單,每一層電梯口只有一個(gè)按鈕,不區(qū)分上下,當(dāng)有人按下這個(gè)鍵后,電梯會(huì)過來停在此層,這個(gè)人可以進(jìn)去,并選擇自己想去的層。電梯的調(diào)度策略也很簡(jiǎn)單,在一次向上的過程中,如果有人在下面按了鍵,電梯并不直接向下,而是運(yùn)行到此次向上的最頂層,然后再下次向下運(yùn)行的過程中去服務(wù)這個(gè)請(qǐng)求。

elevator.py

import time
from myque import myque
class elevator:
  def __init__(self,layers):
    self.building_layers = layers
    self.direction = 'up'
    self.cur_layer = 1
    self.up_queue = myque()
    self.down_queue = myque(True)
    self.switcher = 'open'
  def stop(self):
    self.switcher='stop'
  def push_button(self,layer,direction=None):
    if self.cur_layer>layer:
      self.down_queue.insert(layer)
    elif self.cur_layer<layer:
      self.up_queue.insert(layer)
    else:
      if self.direction=='up':
        self.down_queue.insert(layer)
      else:
        self.up_queue.insert(layer)
  def handle_queue(self,direction):
    self.direction = direction
    if direction == 'up':
      inc = 1
    else:
      inc = -1
    que = getattr(self , direction + '_queue')
    while que.length():
      while self.cur_layer != que.front():
        print '/nelevator in ',self.cur_layer
        time.sleep(1)
        self.cur_layer += inc
      print '/nelevator arrives at ',self.cur_layer
      que.pop_front()
  def run(self):
    while self.switcher=='open':
      if self.up_queue.empty() and self.down_queue.empty():
        """elevator now is waiting, stop at a layer"""
        time.sleep(1)
        continue
      """go up"""
      self.handle_queue('up')
      """go down"""
      self.handle_queue('down')

myque.py

import threading
class myque:
  def __init__(self,reverse=False):
    self.mode = reverse
    self.buf = []
    self.lock = threading.Lock()
  def insert(self,object):
    self.lock.acquire()
    self.buf.append(object)
    self.buf.sort(reverse = self.mode)
    self.lock.release()
  def front(self):
    return self.buf[0]
  def pop_front(self):
    self.lock.acquire()
    self.buf.pop(0)
    self.lock.release()
  def length(self):
    self.lock.acquire()
    size = len(self.buf)
    self.lock.release()
    return size
  def empty(self):
    self.lock.acquire()
    size = len(self.buf)
    self.lock.release()
    return size==0

deploy.py

import threading
from elevator import elevator
def init_elevator(building_layers):
  e = elevator(building_layers)
  t = threading.Thread(target = e.run)
  t.setDaemon(True)
  t.start()
  return (e,t)
def main():
  myelevator,ctl_thread = init_elevator(17)
  while True:
    str=raw_input("Input valid layer :")
    try:
      layer = int(str)
    except Exception:
      if str=='quit':
        myelevator.stop()
        ctl_thread.join()
        break
      else:
        print 'invalid input',str
        continue
    if layer not in range(1,myelevator.building_layers+1):
      continue
    myelevator.push_button(layer)
if __name__=='__main__':
  main()

運(yùn)行結(jié)果如下:

如果擴(kuò)展的話,很容易將各層的按鈕擴(kuò)展為帶上下指示的。如果有機(jī)會(huì)可以擴(kuò)展為多聯(lián)裝電梯,并將調(diào)度算法做的更加智能,可以根據(jù)歷史數(shù)據(jù)和時(shí)間進(jìn)行動(dòng)態(tài)調(diào)整。

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • keras的siamese(孿生網(wǎng)絡(luò))實(shí)現(xiàn)案例

    keras的siamese(孿生網(wǎng)絡(luò))實(shí)現(xiàn)案例

    這篇文章主要介紹了keras的siamese(孿生網(wǎng)絡(luò))實(shí)現(xiàn)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • 關(guān)于Python3的import問題(pycharm可以運(yùn)行命令行import錯(cuò)誤)

    關(guān)于Python3的import問題(pycharm可以運(yùn)行命令行import錯(cuò)誤)

    這篇文章主要介紹了關(guān)于Python3的import問題(pycharm可以運(yùn)行命令行import錯(cuò)誤),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 利用python實(shí)現(xiàn)后端寫網(wǎng)頁(yè)(flask框架)

    利用python實(shí)現(xiàn)后端寫網(wǎng)頁(yè)(flask框架)

    這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)后端寫網(wǎng)頁(yè)(flask框架)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 基于Python編寫一個(gè)根據(jù)姓名測(cè)性別的小程序

    基于Python編寫一個(gè)根據(jù)姓名測(cè)性別的小程序

    這篇文章主要為大家介紹了如何利用Python編寫一款根據(jù)中文名能猜測(cè)性別的一款界面化的小程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-03-03
  • Python 實(shí)現(xiàn)王者榮耀中的敏感詞過濾示例

    Python 實(shí)現(xiàn)王者榮耀中的敏感詞過濾示例

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)王者榮耀中的敏感詞過濾示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 如何解決jupyter notebook無法導(dǎo)入自己安裝的包

    如何解決jupyter notebook無法導(dǎo)入自己安裝的包

    這篇文章主要介紹了如何解決jupyter notebook無法導(dǎo)入自己安裝的包問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 如何把python項(xiàng)目部署到linux服務(wù)器

    如何把python項(xiàng)目部署到linux服務(wù)器

    這篇文章主要介紹了如何把python項(xiàng)目部署到linux服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 詳細(xì)聊一聊為什么Python沒有main函數(shù)

    詳細(xì)聊一聊為什么Python沒有main函數(shù)

    相信很多初學(xué)python的人看代碼的時(shí)候都會(huì)先找一下main()方法,從main往下看,但事實(shí)上python中是沒有你理解中的“main()”方法的,下面這篇文章主要給大家介紹了關(guān)于為什么Python沒有main函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 在Python中使用元類的教程

    在Python中使用元類的教程

    這篇文章主要介紹了在Python中使用元類的教程,是Python當(dāng)中的基礎(chǔ)知識(shí),代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python實(shí)現(xiàn)貪心算法的示例

    Python實(shí)現(xiàn)貪心算法的示例

    這篇文章主要介紹了Python實(shí)現(xiàn)貪心算法的示例,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04

最新評(píng)論