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爬虫
Dec 25 Python
python模块之StringIO使用示例
Apr 08 Python
Python常用知识点汇总
May 08 Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
基于多进程中APScheduler重复运行的解决方法
Jul 22 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
Python3如何在服务器打印资产信息
Aug 27 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面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
推荐一些非常不错的javascript学习资源站点
2007/08/29 Javascript
js用图作提交按钮或超连接
2008/03/26 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
Python SQLite3数据库操作类分享
2014/06/10 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
python批量查询、汉字去重处理CSV文件
2018/05/31 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
python实现LRU热点缓存及原理
2019/10/29 Python
Python sorted对list和dict排序
2020/06/09 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
美国健康和保健平台:healtop
2020/07/02 全球购物
党员干部群众路线个人整改措施
2014/09/18 职场文书
导游词范文
2015/02/13 职场文书
给朋友的道歉短信
2015/05/12 职场文书
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS