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冒泡排序简单实现方法
Jul 09 Python
Python实现购物系统(示例讲解)
Sep 13 Python
Python中用post、get方式提交数据的方法示例
Sep 22 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
Python利用heapq实现一个优先级队列的方法
Feb 03 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
Django实现CAS+OAuth2的方法示例
Oct 30 Python
Python基于requests库爬取网站信息
Mar 02 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
python中关于数据类型的学习笔记
Jul 19 Python
python通过新建环境安装tfx的问题
May 20 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
10 个经典PHP函数
2013/10/17 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
php通过各种函数判断0和空
2020/07/04 PHP
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
第一次动手实现bootstrap table分页效果
2016/09/22 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
小程序实现带年月选取效果的日历
2018/06/27 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
python for和else语句趣谈
2019/07/02 Python
python标记语句块使用方法总结
2019/08/05 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
pandas 数据类型转换的实现
2020/12/29 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
自我鉴定书面格式
2014/01/13 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
质量负责人岗位职责
2015/02/15 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS