엘리베이터가 여행 플로어 주문의 최단 경로를 찾기 위해 어떤 알고리즘을 사용합니까?


27

엘리베이터를 시뮬레이션하려고합니다. 항상 한 번에 한 번만 주문하여 매우 간단하게 시작한 다음 대기열 형식으로 엘리베이터에 메모리를 추가하여 바닥이 눌린 순서대로 바닥을 이동하도록합니다. 분명히 최선의 방법은 아닙니다.

그래서 현재 저는 매우 간단하고 "짧은 시야"논리를 사용하고 있습니다. 즉, 현재 층에서 가장 가까운 층을 찾아서 다음 목적지로 설정하고 더 이상 층이 목록에 없을 때까지 반복합니다.

그러나 이것은 항상 작동하지는 않습니다. 예를 들어 엘리베이터가 5 층 건물의 3 층에 있었고 가장 짧은 경로는 4,5,2 주문이 2> 4-> 5 일 것인데 4 층이 필요하지만이 논리를 사용합니다. 코드에 따라 5를 지불하는 4-> 5-> 2의 선택 가능성은 동일합니다.

가장 짧은 경로를 찾고 엘리베이터를 더 효율적으로 만드는 방법은 무엇입니까?



6
나는 당신을 내 사무실로 초대하고 엘리베이터가 거기에서 사용하는 알고리즘을 알아 내고 싶습니다. 나는 절대적으로 할 수 없기 때문에.
gnasher729

1
@ gnasher729 아, 비록 내가 당신을 모르더라도, 그것은 내 사무실에서와 똑같기 때문에 : 이미 사람들로 가득 찬 경우를 제외하고는 내가있는 층에서 멈추지 마십시오. 내가 맞아?
Andres F.

2
좀 빠지는. 엘리베이터가 4 대 있습니다. 버튼을 누르면 아무 것도 오랫동안 움직이지 않습니다. 하나가 움직이면 바닥 바로 앞에서 멈춰서 나이를 기다립니다. 또 다른 바닥이 넘어져 바닥으로 내려갑니다. 지면으로 내려가는 길에 아무도 들어 가지 않고 3 번 이상 멈 춥니 다.
gnasher729

2
관련 프로그래밍 게임 / 챌린지 : play.elevatorsaga.com
dwikle

답변:


30

"효율성"이 가장 중요한 기능은 아니며, 가장 중요한 것은 모든 주문을 준수하고 기아가 없는지 확인하는 것입니다. 누군가가 100을 누르고 사람들이 1과 2를 계속 누르고 있으면 그 층 사이를 계속 이동하는 것이 효율적일 수 있지만 어느 시점에서 100을 방문하는 것이 좋습니다.

내가 생각하는 대부분이 수행하는 것이 (내가 알아 냈어에 관심이 개인의 관찰에서) :

  1. 첫 번째 버튼을 누른 방향으로 시작하고 우리가 가고있는 방향을 추적하십시오.
  2. 바닥에 도달하고 해당 버튼을 눌렀을 때 문을 멈추고 열고 더 이상 눌리지 않은 것으로이 바닥의 버튼을 표시하십시오.
    • 같은 방향으로 방문해야 할 층이 여전히 더 있다면 그 방향으로 계속 진행하십시오 .
    • 아직 방문하지 않은 층이 있다면 그 방향으로 이동하십시오.
    • 그렇지 않은 경우 버튼을 다시 누르면 1에서 시작합니다.

많은 엘리베이터에는 단일 버튼 대신 문 옆에 "상승하고 싶다"및 "하강하고 싶다"버튼이 있습니다. 알고리즘은 작은 변화 만 필요합니다 .2에서, 해당 층에 대해 눌려진 유일한 버튼이 문 옆에있는 버튼 중 하나 인 경우, 우리가 그 방향으로 가고 있다면 문을 멈추고 열어야합니다. 엘리베이터 내부에서 버튼을 눌렀을 때 문이 열리고 방향이 잘못되면 버튼을 계속 누르고 계십시오.

다음에 갈 방향으로 전체 경로 를 알아낼 필요는 없습니다 .


이것은 내 마음을 완전히 건너 뛰었고 효율성에 집중하고 다른 것들도 중요하다는 것을 잊었습니다. 그것은 같은 방향에 있었지만 적어도 기아를 보장하지 않기 때문에 2-> 100에서 다시 1로 돌아가는 것은 여전히 ​​효율적이지 않습니다. 그리고 주제에서 완전히 벗어나면 아마도이 논리를 가진 두 개의 엘리베이터를 찾는 것이 일반적인 이유 일 것입니다. 주어진 시간에 엘리베이터가 반대 방향으로가는 것이 더 일반적인지 궁금합니다. 어쨌든, 나는 여전히 가장 짧은 전체 경로를 찾는 방법에 대해 궁금하지만, 이것은 내 질문에 매우 깔끔하게 대답합니다.
Raed Tabani

7
바닥이 100 층인 건물에 도착하면 일반적으로 특정 범위의 바닥 (예 : 0-19, 20-39, ...) 만 제공하는 엘리베이터와 장거리 (예 : 0)를 사용하는 고속 엘리베이터가 있습니다. ~ 50, 0 ~ 100, 50 ~ 100, 그러나 그 사이에 층이 없으므로) 목적지에 도착하기 위해 엘리베이터를 변경해야 할 수도 있습니다. 샤프트를 통과 할 수없는 엘리베이터가 여러 대있을 수도 있습니다. 완전히 논외 주제 : IIRC, 사용자 경험 사이트 에서 위아래 화살표 버튼의 효율성에 대해 궁금한 점이있었습니다 .
Jörg W Mittag

고마워, 난 몰랐어 한 부분이 전체 시스템을 분해하지 않고 기계적인 마모에 중요한 하중을 분산시키는 경우 세분화가 좋은 전략으로 보입니다. 이 고속 엘리베이터가 Knuth 엘리베이터 알고리즘의 논리적 단점으로 인한 것인지 궁금합니다.
Raed Tabani

내가 추가 거라고 유일한 다른 점은 종종 그들이 사용하지 않을이 다른 엘리베이터 다를 수 있습니다 때 돌아가 어쩌면 하루의 시간과 예상 사용 패턴에 따라 변경됩니다있는 '집'층을 가지고있다
JK .

실제로 어느 방향으로 여행하든 상관없이 위 / 아래 버튼을 반으로 무작위로 누르는 경향이 있습니다. 제 경우에는 목적지가 하나뿐이므로 엘리베이터를 선택 했든 아니든 상관없이 엘리베이터가 해당 위치로 이동합니다. 내려가는. 아래 버튼을 눌러 내 위의 바닥을 선택한 다음 엘리베이터가 움직이기 전에 내 아래의 바닥을 선택하면 처음으로 밀었던 바닥이 아니라 내 아래의 바닥으로 이동합니다. 나는 틀릴 수 있습니다. 다음에 엘리베이터에서 나를 찾을 때 테스트해야합니다.
Ucenna

13

다른 답변은 표준 엘리베이터 알고리즘을 정확하게 제공하는데, 이는 기본적으로 "가능한 한 동일한 방향으로 계속 진행하고 필요한 모든 정지를하는 것"입니다.

다른 엘리베이터 알고리즘이 있습니다. 예를 들어, 올라 갈수록 아파트가 비싸지는 아파트 건물을 생각해보십시오. 건물의 소유자는 엘리베이터 알고리즘을 "가능한 한 같은 방향으로 진행하지만 내려가는 도중에 만 멈추도록"수정할 수 있습니다. 그렇게하면 로비에 있고 2, 5, 10으로가는 엘리베이터에 사람들이있는 경우 엘리베이터는 10, 5, 2로 가서 지불하는 임대료 순서대로 사람들을 내려 놓습니다. 그러나 물론 10 세의 사람들 이 아파트를 떠날 때 로비에 도착하기 위해 더 오래 기다려야하는 경우가 더 많습니다.

효율적인 솔루션을 찾고 있다면 비용에 대한 메트릭을 제시하고 다양한 알고리즘을 구현하고 시뮬레이션을 실행하십시오. 평균 비용뿐만 아니라 하나의 요청을 처리하는 데 걸리는 시간과 같은 메트릭도 측정해야합니다. 낮은 평균을 최적화하면 때로는 최악의 경우를 최적화 해제 할 수 있습니다.


1
드문 (다른 alogirthms을) 것 같다
FindOutIslamNow

10

엘리베이터는 일부 하드 드라이브 컨트롤러와 동일한 스케줄링 알고리즘을 사용합니다. 표준 SCAN 알고리즘은 엘리베이터 알고리즘 이라고도 합니다 . 실제로 LOOK 알고리즘은 SCAN보다 약간 더 효율적이므로 더 일반적 이라고 생각 합니다.


확실하게 말할 때 엘리베이터 코드를 구현 한 전문적인 경험이 있습니까? 특히 최신 엘리베이터 시스템? NYC에서 9/11 이후 승객을 데려 오는 것보다 승객을 데려 오는 것이 우선 순위가 높은지 궁금합니다.
존 자브로 스키
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.