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中操作列表之List.pop()方法的使用
May 21 Python
Python中的变量和作用域详解
Jul 13 Python
Python 中的with关键字使用详解
Sep 11 Python
python删除服务器文件代码示例
Feb 09 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
Python超越函数积分运算以及绘图实现代码
Nov 20 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
python爬虫中PhantomJS加载页面的实例方法
Nov 12 Python
Python自动化爬取天眼查数据的实现
Jun 15 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在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
Python进度条的制作代码实例
2019/08/31 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
市场营销专科应届生求职信
2013/11/24 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
市场总监岗位职责
2015/02/11 职场文书
离婚案件答辩状
2015/05/22 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
Nginx配置https的实现
2021/11/27 Servers