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正则表达式修复网站文章字体不统一的解决方法
Feb 21 Python
Python作用域用法实例详解
Mar 15 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
django进阶之cookie和session的使用示例
Aug 17 Python
python用post访问restful服务接口的方法
Dec 07 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
Python中Unittest框架的具体使用
Aug 27 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
Python如何读取、写入JSON数据
Jul 28 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
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
AngularJS入门教程之控制器详解
2016/07/27 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
Python pass 语句使用示例
2014/03/11 Python
Python的另外几种语言实现
2015/01/29 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
python验证码识别教程之利用滴水算法分割图片
2018/06/05 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
Python 私有化操作实例分析
2019/11/21 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
tornado+celery的简单使用详解
2019/12/21 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
旅游专业职业生涯规划范文
2014/01/13 职场文书
大型车展策划方案
2014/02/01 职场文书
优秀老师事迹材料
2014/02/05 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书