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时间模块中的datetime模块
Jan 13 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
Python生成器以及应用实例解析
Feb 08 Python
Python 字符串与数字输出方法
Jul 16 Python
python找出完数的方法
Nov 12 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
python 多线程重启方法
Feb 18 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
Python列表嵌套常见坑点及解决方案
Sep 30 Python
Flask中jinja2的继承实现方法及实例
Mar 03 Python
Python 中的 copy()和deepcopy()
Nov 07 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 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
php短信接口代码
2016/05/13 PHP
让FireFox支持innerText的实现代码
2009/12/01 Javascript
Js event事件在IE、FF兼容性问题
2011/01/01 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
python with statement 进行文件操作指南
2014/08/22 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
Python根据已知邻接矩阵绘制无向图操作示例
2018/06/23 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
wxPython实现列表增删改查功能
2019/11/19 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
Python类成员继承重写的实现
2020/09/16 Python
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
高校毕业生自我鉴定
2013/10/27 职场文书
建材业务员岗位职责
2013/12/08 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
前台接待员岗位职责
2015/04/15 职场文书
高中信息技术教学反思
2016/02/16 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python