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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.