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

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

本文实例讲述了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

标签:Python,算法
0
投稿

猜你喜欢

  • Go获取与设置环境变量的方法详解

    2023-06-21 04:35:10
  • Python对数据进行插值和下采样的方法

    2022-06-02 03:36:41
  • jQuery模板提案

    2010-03-30 18:27:00
  • python em算法的实现

    2021-09-18 11:45:30
  • Go高级特性探究之稳定排序详解

    2023-07-17 16:11:48
  • Python常见数据类型转换操作示例

    2022-11-20 19:13:05
  • sqlserver中with(nolock)深入分析

    2023-07-20 21:28:33
  • 用asp编写文档搜索页面

    2008-01-13 07:04:00
  • Oracle数据库集复制方法浅议

    2010-07-21 12:50:00
  • Window.Open详解

    2008-06-08 13:43:00
  • sqlserver通用的删除服务器上的所有相同后缀的临时表

    2012-06-06 20:07:34
  • Python中的exec、eval使用实例

    2022-07-05 21:01:41
  • python中子类调用父类函数的方法示例

    2023-12-30 14:17:03
  • 使用Python读取二进制文件的实例讲解

    2021-08-20 11:34:48
  • Asp中如何设计跨越域的Cookie

    2008-10-24 09:46:00
  • 快速让MySQL数据库服务器支持远程连接

    2010-01-16 13:06:00
  • JS打开新窗口的2种方式

    2023-07-07 02:44:49
  • WEB2.0网页制作标准教程(4)如何调用css样式表

    2007-11-13 13:26:00
  • 判断字段是否被更新 新旧数据写入Audit Log表中

    2012-01-29 17:56:33
  • 详解python中的数据类型和控制流

    2022-08-11 14:32:50
  • asp之家 网络编程 m.aspxhome.com