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学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
分析在Python中何种情况下需要使用断言
Apr 01 Python
理解Python中的类与实例
Apr 27 Python
OpenCV实现人脸识别
Apr 07 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python实现人民币大写转换
Jun 20 Python
基于python中theano库的线性回归
Aug 31 Python
Python 判断奇数偶数的方法
Dec 20 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
python字典的常用方法总结
Jul 31 Python
python带参数打包exe及调用方式
Dec 21 Python
django上传文件的三种方式
Apr 29 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 ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
nginx 设置多个站跨域
2021/03/09 Servers
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
cookie的secure属性详解
2015/04/08 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
Python写的贪吃蛇游戏例子
2014/06/16 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
python中的错误如何查看
2020/07/08 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
学习心得体会
2014/01/01 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
泰山导游词
2015/02/02 职场文书
法律意见书范文
2015/06/04 职场文书
2019邀请函格式及范文
2019/05/20 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL