最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

運行結果如下:

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

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

希望本文所述對大家Python程序設計有所幫助。

相關文章

最新評論

乐清市| 肥东县| 喀喇沁旗| 灵石县| 塔河县| 赤城县| 墨江| 江口县| 通化县| 乌兰察布市| 昭苏县| 巢湖市| 神木县| 开远市| 永宁县| 石城县| 弥勒县| 娱乐| 庄河市| 昆山市| 南城县| 建宁县| 京山县| 河东区| 浦城县| 佳木斯市| 河曲县| 巴南区| 松江区| 奉化市| 洪湖市| 马山县| 会同县| 吉水县| 山阳县| 攀枝花市| 南华县| 普陀区| 湄潭县| 和平区| 芦山县|