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中的Numpy入门教程
Apr 26 Python
在Python的Flask框架中实现全文搜索功能
Apr 20 Python
Python批量修改文本文件内容的方法
Apr 29 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
python绘图模块matplotlib示例详解
Jul 26 Python
django 取消csrf限制的实例
Mar 13 Python
pandas apply多线程实现代码
Aug 17 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 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实现把数字ID转字母ID
2013/08/12 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
jQuery插件HighCharts绘制2D圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
Python3爬楼梯算法示例
2019/03/04 Python
python3中rank函数的用法
2019/11/27 Python
Python小白垃圾回收机制入门
2020/06/09 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
会计专业毕业生推荐信
2013/11/05 职场文书
新三好学生主要事迹
2014/01/23 职场文书
经理任命书模板
2014/06/06 职场文书
安全横幅标语
2014/06/09 职场文书
保护水资源的标语
2014/06/17 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP