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 20 Python
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
Python中urllib2模块的8个使用细节分享
Jan 01 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
进一步探究Python中的正则表达式
Apr 28 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
Feb 10 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
如何在Python对Excel进行读取
Jun 04 Python
python中get和post有什么区别
Jun 19 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 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
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
解决layui laydate 时间控件一闪而过的问题
2019/09/28 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python文件操作方法详解
2020/02/09 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
python飞机大战游戏实例讲解
2020/12/04 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
几道Web/Ajax的面试题
2016/11/05 面试题
幼教个人求职信范文
2013/12/02 职场文书
消防志愿者活动方案
2014/08/23 职场文书
党建工作汇报材料
2014/12/24 职场文书
财务经理岗位职责
2015/01/31 职场文书
承诺书范本大全
2015/05/04 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
Github 使用python对copilot做些简单使用测试
2022/04/14 Python