Python 시 뮬 레이 션 단순 엘리베이터 스케줄 링 알고리즘 예시

4399 단어 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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기