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 01 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
python+pandas分析nginx日志的实例
Apr 28 Python
python实现NB-IoT模块远程控制
Jun 20 Python
Python sorted函数详解(高级篇)
Sep 18 Python
python实现flappy bird游戏
Dec 24 Python
python带参数打包exe及调用方式
Dec 21 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
python实现暗通道去雾算法的示例
Sep 27 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 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实现动态web服务器方法
2015/07/29 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
PHP单例模式数据库连接类与页面静态化实现方法
2019/03/20 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
Python实现带百分比的进度条
2016/06/28 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
Python unittest模块用法实例分析
2018/05/25 Python
Django 路由系统URLconf的使用
2018/10/11 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
python中时间模块的基本使用教程
2019/05/14 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
采购员岗位职责
2013/11/15 职场文书
个人担保书范文
2014/05/20 职场文书
2015年工商所工作总结
2015/05/21 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
python之json文件转xml文件案例讲解
2021/08/07 Python
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript