网络编程
位置:首页>> 网络编程>> Python编程>> Python模拟简单电梯调度算法示例

Python模拟简单电梯调度算法示例

作者:zzulp  发布时间:2021-09-27 14:52:31 

标签:Python,算法

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/zzulp/article/details/5681482

0
投稿

猜你喜欢

  • 导语轻松瘦 | 和闺蜜减肥的日常,谁说闺蜜是减肥路上的一座山?哈喽!大家好!我是木木子吖~小编有一个闺蜜,还是同一所学校读书毕业的,这体重在
  • 阅读上一篇教程:WEB2.0网页制作标准教程(7)CSS学习入门 CSS布局与传统表格(table)布局最大的区别在于:原来的定位都是采用表
  • 此文刊登在《程序员》三月期,有删改提到安全问题,首先想到应付这些问题的应该是系统管理员以及后台开发工程师们,而前端开发工程师似乎离这些问题很
  • 本文实例讲述了Python二叉树定义与遍历方法。分享给大家供大家参考,具体如下:二叉树基本概述:二叉树是有限个元素的几个,如果为空则为空二叉
  • Web开发中,我们经常会遇到分页显示和排序数据记录集的情况,这在服务器端使用服务器端的代码和数据库技术是件很轻松的事情,比如:ASP、PHP
  • 一、项目背景:为了回顾关于django的文件上传和分页功能,打算写一个微型的小说网站练练手。花了一个下午的时间,写了个小项目,发现其中其实遇
  • SQL SERVER数据存储的形式在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小
  • 实际上,在web开发中,cookie仅仅是一个文本文件,当用户访问站点时,它就被存储在用户使用的计算机上,其中,保存了一些信息,当用户日后再
  • 1、算术运算符:+、-、*、/、%。2、递增/递减运算符:如$a++,$a--,++$a,--$a.如:<?php$a=10;$b=5
  • 一些MySQL发布对MySQL数据库中的系统表的结构进行了更改,添加了新权限或特性。当你更新到新版本MySQL,你应同时更新系统表,以确保它
  • 模板的继承完美在写html的时候会发现,自己多个html文件中又好多东西是一样的,包括静插件的引入 还有有些简单的css样式都不需要修改,这
  • 阅读上一章:Chapter 8 再谈清单Chapter 9 精简标签先前我们不断提到结构化内容能够把结构与设计细节分类并精简标签,该怎么做呢
  • 本篇文章主要介绍Java操作MongoDB。开发环境:System:WindowsIDE:eclipse、MyEclipse 8Databa
  • 在asp中获取当前的地址栏网址很简单,使用下面这句语句即能实现获取网站域名Request.ServerVariables("HTT
  • 前言最近微信小游戏跳一跳大热,自己也是中毒颇久,无奈手残最高分只拿到200分。无意间看到教你用Python来玩微信跳一跳一文,在电脑上利用a
  • map( )函数在算法题目里面经常出现,map( )会根据提供的函数对指定序列做映射,在写返回值等需要转换的时候比较常用。关于映射map,可
  • 基础代码pred_y = test_output.data.numpy()pred_y = pred_y.flatten()print(pr
  • http://swik.net/Ajax/Ajax+Mistakes在某网站瞎逛时,发现这个链接,进去逛了逛,觉得很有意思,大家也可以去看看
  • 概念关键字:array,数据的组合(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过变量一次性得到该容器中的所有数据.数组定义语
  • 本文实例为大家分享了js实现全选取消效果的具体代码,供大家参考,具体内容如下<!DOCTYPE html><html la
手机版 网络编程 asp之家 www.aspxhome.com