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类参数self使用示例
Feb 17 Python
Python中dictionary items()系列函数的用法实例
Aug 21 Python
Python3实现转换Image图片格式
Jun 21 Python
python调用staf自动化框架的方法
Dec 26 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
python 二维数组90度旋转的方法
Jan 28 Python
Opencv实现抠图背景图替换功能
May 21 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
PHP 函数语法介绍一
2009/06/14 PHP
19个Android常用工具类汇总
2014/12/30 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
BootStrap中Datepicker控件带中文的js文件
2016/08/10 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
Python实现的简单算术游戏实例
2015/05/26 Python
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python实现下载pop3邮件保存到本地
2018/06/19 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
六行python代码的爱心曲线详解
2019/05/17 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python 面向对象部分知识点小结
2020/03/09 Python
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
《窗前的气球》教学反思
2014/04/07 职场文书
岗位职责说明书模板
2014/07/30 职场文书
高三英语教学反思
2016/03/03 职场文书
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技