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实现一个简单的MySQL类
Jan 07 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
pygame实现俄罗斯方块游戏
Jun 26 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
python实现播放音频和录音功能示例代码
Dec 30 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
200行python代码实现2048游戏
Jul 17 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
python爬虫模块URL管理器模块用法解析
Feb 03 Python
python统计文章中单词出现次数实例
Feb 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中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
北京奥运官方网站幻灯切换效果flash版打包下载
2008/01/30 Javascript
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
javascript数字验证的实例代码(推荐)
2016/08/20 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
银行会计职员个人的自我评价
2013/09/29 职场文书
中学门卫岗位职责
2013/12/26 职场文书
创业资金计划书
2014/02/06 职场文书
身边的榜样活动方案
2014/08/20 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
全国法院系统开展党的群众路线教育实践活动综述(全文)
2014/10/25 职场文书
实习生个人总结范文
2015/02/28 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
安全教育的主题班会
2015/08/13 职场文书
详解Python常用的魔法方法
2021/06/03 Python
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis