Python模拟简单电梯调度算法示例


Posted in Python onAugust 20, 2018

本文实例讲述了Python模拟简单电梯调度算法。分享给大家供大家参考,具体如下:

经常在公司坐电梯,由于楼层较高,是双联装的电梯,但是经常等电梯很久,经常有人骂写电梯调度算法的。回来闲来无事,自己尝试写了一个简单的。

场景很简单,每一层电梯口只有一个按钮,不区分上下,当有人按下这个键后,电梯会过来停在此层,这个人可以进去,并选择自己想去的层。电梯的调度策略也很简单,在一次向上的过程中,如果有人在下面按了键,电梯并不直接向下,而是运行到此次向上的最顶层,然后再下次向下运行的过程中去服务这个请求。

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

运行结果如下:

Python模拟简单电梯调度算法示例

如果扩展的话,很容易将各层的按钮扩展为带上下指示的。如果有机会可以扩展为多联装电梯,并将调度算法做的更加智能,可以根据历史数据和时间进行动态调整。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python通过shutil实现快速文件复制的方法
Mar 14 Python
python threading模块操作多线程介绍
Apr 08 Python
Python httplib模块使用实例
Apr 11 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
python 实现对文件夹中的图像连续重命名方法
Oct 25 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
Jun 12 Python
python实现动态数组的示例代码
Jul 15 Python
python rsync服务器之间文件夹同步脚本
Aug 29 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
详解python tkinter模块安装过程
Jan 06 Python
2021年最新用于图像处理的Python库总结
Jun 15 Python
django_orm查询性能优化方法
Aug 20 #Python
Python Requests库基本用法示例
Aug 20 #Python
Django中使用第三方登录的示例代码
Aug 20 #Python
基于Django框架利用Ajax实现点赞功能实例代码
Aug 19 #Python
分析python请求数据
Aug 19 #Python
浅谈django orm 优化
Aug 18 #Python
django连接mysql配置方法总结(推荐)
Aug 18 #Python
You might like
PHP 输出缓存详解
2009/06/20 PHP
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
理解JavaScript的prototype属性
2012/02/11 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
javascript 封装Date日期类实例详解
2017/05/28 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
python中多层嵌套列表的拆分方法
2018/07/02 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Python对列表的操作知识点详解
2019/08/20 Python
Python3 翻转二叉树的实现
2019/09/30 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
争论的故事教学反思
2014/02/06 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
爱心捐款倡议书
2014/04/14 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
擅自离岗检讨书
2014/09/12 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
2014年团委工作总结
2014/11/13 职场文书
展览会邀请函
2015/02/02 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
2015教师节通讯稿
2015/07/20 职场文书
公司会议开幕词
2016/03/03 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers