일정 / 계획 알고리즘


24

어떻게 접근 해야할지 모르겠습니다. 직원을위한 캘린더를 생성해야합니다. 직원마다 특정 업무 제약이 있습니다 (일부 개인, 일부 일반)

내가하고있는 일 :

  • 나는 의사가
  • 각 의사는 주 5 일 근무해야합니다.
  • 각 의사는 일주일에 1 박 일해야합니다
  • 각 의사는 다른 의사에 비해 (또는 가능한 한 가까운 밤) 일해야합니다.
  • 각 의사는 다른 의사들과 동등한 목요일 밤과 일요일 밤을 동등하게 일해야합니다.
  • 일부 의사는 특정 요일 / 야간에 근무할 수 없습니다 (사용자 입력)
  • 일부 의사는 특정 요일 / 야간 (사용자 입력)을 원합니다
  • 일부 의사는 특정 요일 / 야간 (사용자 입력)을 원치 않습니다

문제의 사용자는 캘린더를 다루는 사람이며 모든 제약 조건을 준수하는 캘린더를 자동으로 생성하는 솔루션을 구축하려고합니다. 이 솔루션은 각 의사에 대해 "의사 추가"및 "제약 추가"를 입력 한 다음 "캘린더 생성"버튼 만 입력하면됩니다. 사용자에게는 정말 기본입니다.

내 문제 :

실제 계획을 생성하는 방법을 잘 모르겠고 신경망, 유전자 알고리즘 등에 대해 읽었으며 모두 올바른 솔루션처럼 보이지만 실제로는 아닙니다.

GA를 살펴보면 주어진 모집단 (내 문제)이있는 솔루션을 찾게되었지만 시작 인구는 이미 주어진 일련의 제약 조건을 준수해야하며 최적화됩니다. 이 경우, 시작 인구는 이미 해결책입니다. "최적화"할 필요는 없습니다. 한 사람이 월요일에 3 일 밤 연속 일한다는 것은 중요하지 않습니다. 실제로는 정확하고 다른 사람이 같은 금액으로 일하는 경우 다른 사람도 어느 날 3 월 3 일 밤 일을하는 것이 좋습니다. GA의 시작점으로 문제가 이미 해결 되었기 때문에 GA가 '고급'이라고 생각합니다.

그러나 다시 한번, GA는 실제로 그들이 만든 것처럼 보이므로 올바르게 이해하지 못할 수 있습니까?

어쨌든 GA (또는 신경망 또는 그와 비슷한 종류)를 사용한 적이 없기 때문에 그러한 학습 곡선에 참여하기 전에 올바른 접근 방식을 사용하고 있는지 확인하고 싶습니다.

내 질문 :

내 것과 같은 문제에 대한 좋은 접근법 / 알고리즘 / 기술은 무엇이라고 생각합니까? 가스? 신경망? 다른 완전히 다른 것?

나는 모든 귀이며 필요한 경우 자세한 내용을 열 수는 있지만, 나는 내가 분명하게 생각했다고 생각합니다. :)


22
아마도 간호사 명부 작성 문제에 관한 문헌을 살펴볼 가치가있을 것입니다. en.wikipedia.org/wiki/Nurse_scheduling_problem
Renaud M.

그런 편리한 용어! 도니는 다르게, 당신의 연결을위한 감사)
길 모래

8
나는이 분야의 전문가는 아니지만 개발에 시간을 절약 할 수있는 접근법이라면 문제를 Mixed Integer Programming Problem ( en.wikipedia) 으로 모델링하는 것이 좋습니다. org / wiki / Linear_programming # Integer_unknowns )를 입력 한 다음 MIP 솔버 또는 제약 조건 프로그래밍 문제로 입력 한 다음 OR-tools ( developers.google.com/optimization ) 와 같은 CP 솔버에 입력하십시오 . 이 방법으로 문제를 표현하면됩니다.
Renaud M.

3
최적의 솔루션을 도출하기 위해 선형 프로그래밍 이 보장됩니다!
recursion.ninja

2
@RenaudM. 전문 프로그래머가이 놀랍도록 유용한 수학 분야를 이해하는 것은 부끄러운 일입니다. 누군가가 시뮬레이션 어닐링 또는 AI 필드의면이 바깥을 향하게 유전자 알고리즘을 제안 할 때마다, 내 직감 응답은 다음과 같습니다 아마 더 나은 선형 프로그램 최적화로 모델링 할 수있다
recursion.ninja

답변:


14

유전자 알고리즘과 신경망은 여기에 적합하지 않습니다. 문제에 대한 충분하고 근사한 해결책을 찾기위한 메타 휴리스틱입니다. 특히, 둘 다 후보 솔루션을 평가할 비용 함수를 찾아야합니다. 이러한 비용 함수가 있으면이 비용에 최적화 된 알고리즘을 수동으로 생성하는 것이 더 쉬울 수 있습니다.

이것은 중요한 생각입니다. 두 개의 일정이 주어지면 일정 A 또는 일정 B가“더 나은”지 여부를 결정하는 방법이 필요합니다. 다양한 기준을 나열했지만 관련 기준이 명확하지 않습니다. 하나의 기준을 충족하지 못하면 전체 솔루션이 실패합니까? 또는 제약 조건이 부분적으로 실패하면 다른 제약 조건보다 더 나쁜 해결책이 될 수 있습니까?

가장 기본적인 수준에서는 일주일을 개별 시간 슬롯으로 분할하고 모든 슬롯 의사 조합을 무차별하게 수행 할 수 있습니다. 그러나 까다로운 제약 조건을 사용하여이 검색 공간을보다 관리하기 쉬운 크기로 줄일 수 있습니다. 근무 시간 및 야간 근무에 대한 제한은 이러한 검색 공간 제한에 적합한 것으로 보입니다. 그러면 수백 개의 후보 솔루션이 남게됩니다.

최상의 후보 솔루션을 선택하려면 순위를 정해야합니다. 의사가 특정 교대 근무를 할 수없는 경우, 의사가 해당 교대 근무를 원하지 않는 것보다 더 중요한 경우가 있습니다. 그러나 나는 당신을 위해이 규칙들을 결정할 수 없습니다 – 그것은 관리 결정입니다. 두 개의 소프트 제약 조건이 명확한 우선 순위를 갖지 않으면 더 어렵습니다.이 경우 단일 메트릭에서 두 제약 조건의 중요성을 통합하는 일종의 비용 함수가 필요합니다.


우선 순위가 지정된 기준에 따라 빈 시간표를 채우는 욕심 많은 알고리즘을 구성했을 것입니다. 이것이 가장 최적의 솔루션은 아니지만“최적”이 실제로 무엇을 의미하는지에 대해 철학적으로 생각하는 것보다 훨씬 쉽습니다.

첫 번째 단계로, 주말에는 야간 근무를하고 주말 야간 근무를하지 않은 의사를 선택하려고 할 수 있습니다. . 이러한 희망 사항이 주 단위이며 연속적이지 않다고 가정하면, 주말 밤에 일주일 동안 일할 수없는 의사가 다음 주에 선발 될 것입니다.

다른 밤에도 비슷한 절차를 사용할 수 있습니다. 사용자의 소원을 존중하려고 시도한 후 가장 오랜 시간 동안 야간 근무를하지 않은 사람에 따라 의사를 작성합니다. 절차는 세 번째 종류의 시간 슬롯에 대해서도 유사하게 반복됩니다. 요일이 바뀝니다. 두 명의 사용자 희망 사항을 조정할 수없는 경우, 사용자가 원하는 권한이 얼마나 자주 부여되었는지 추적 한 후 권한이 적은 의사로 우선 순위를 정할 수 있습니다.

불행히도, 나는이 시스템을 게임하는 두 가지 방법을 볼 수있다. 예를 들어 의사가 주말 밤 근무를하도록 선택되었지만“여기서 일할 수 없다”요청을한다면, 선택은 일주일 지연 될 것이다. 주말 밤의 빈도는 동료의 비용으로 바뀝니다. 거절 된 요청의 수를 확인하는 희망 해결 절차가 구현되면, 사용자는 원하는 요청 하나를 부스트하기 위해 몇 가지 불가능한 요청을 넣을 수 있습니다. 그러나 선의 (그리고 의사들이 서로 교대 할 수있는 유연성)를 가정 할 때, 그러한 알고리즘은 충분한 솔루션이되어야합니다.


귀하의 답변에 감사드립니다. 나는 동료와 함께 그것에 대해 조금 더 파헤칠 것입니다. 또한, 그들은 현재 선의를 위해 노력하고 있으며 잘 작동하고 있습니다. 그들은 그것을 손으로 동동하고 "나는 너무 일을 할 수 없다"를 사용하지 마십시오. 그들이 실제로 손으로 하기 때문에 그들이 지금 어떻게 작동하는지 꽤 좋습니다 . 따라서 "유효한"솔루션은 이미 그들에게 세상을 의미하고, 언제 일할 수 있는지에 대한 많은 브레인 스토밍 시간을 절약 할 수 있습니다.
Gil Sand

5
@Zil 현재 일정을 만들고있는 사람들은 이미 비공식 알고리즘을 사용하고있을 것입니다. 당신은 그들에게 말하고 그들의 결정 과정을 이해하려고 노력한 다음 그것을 공식화하고 구현할 수 있습니다. 이것은 신경망을 설정하고 훈련시키는 것보다 훨씬 쉽습니다.
amon

그것이 우리의 첫 번째 단계입니다 : p 우리는 이미 그들과 회의를했습니다! 모든 도움에 감사드립니다 :)
Gil Sand

3
이 유스 케이스의 경우, 유전자 경쟁 알고리즘은 국제 간호사 명단 경쟁 연구 경쟁에서 입증 된 바와 같이 Tabu Search 및 Simulated Annealing보다 지속적으로 열등합니다. (물론 그들은 욕심 많은 알고보다 여전히 낫습니다.)
Geoffrey De Smet

12

시뮬레이션 어닐링을 사용할 수 있습니다 .

첫 직장에 착륙하기 전에 이와 같은 일을했습니다. https://vimeo.com/20610875(2:50 에서 시작하는 데모, 6:15에서 알고리즘 설명)를 참조하십시오.

시뮬레이션 어닐링은 유전자 알고리즘의 한 유형이며 이론 상으로는 적합하지 않을 수도 있지만 (@amon이 그의 답변 에서 유지 관리하는 것처럼 ) 실제로 실제로는 잘 작동했으며 사용자와 거의 동일한 사용 사례였습니다.

소스 코드는 사용할 수 있지만 (C #) 작동하지만 끔찍합니다. 몇 년 전이었고 자해 심이 있었기 때문에 유지 관리성에 대해 알지 못했습니다. 그래도 아주 좋은 결과를 얻었습니다.

어쨌든 작동 방식 :

  • 시작점으로 1 개의 가능한 (매우 좋지는 않지만 물리적으로 가능한) 시간표를 생성하십시오. 이 시점에서 유전자 알고리즘은 필요하지 않습니다. 찾은 첫 번째 솔루션으로 무너질 수 있습니다. 역 추적을 사용했습니다 . 매일 로타를 개별적으로 해결하면 계산 복잡성을 극복 할 수 있습니다. 솔루션이 전혀 없으면 (있는 경우),이 시점에서 솔루션을 감지합니다.

  • 솔루션 풀을 작성하십시오 (예 : 시작시이 엔트리 레벨 솔루션의 사본 100 개).

  • 모든 솔루션을 무작위로 변경 : 의사가 서로 교대 근무를하도록하고, 의사를 무작위로 교대하고 무작위로 가능한 사람을 배치하십시오.

  • 그것이 얼마나 좋은지를 결정하는 운동 기능으로 각 솔루션을 평가 하십시오. 한 남자가 다른 남자보다 더 많은 밤을 일하고 있습니까? 페널티 포인트를 뺍니다. 누군가 월요일에하고 싶었지만 그렇지 않습니까? 페널티 포인트를 다시 빼십시오.

  • 20 가지 최고의 솔루션을 가져 와서 각각 5 번 복사하여 나머지 80 개를 덮어 써서 차세대로 전달하십시오. 적자 생존.

  • 헹구고 반복하십시오.

숫자는 분명히 임의적이므로 시나리오에 가장 적합한 설정을 찾으려면 매개 변수를 사용하여 바이올린을 조정해야 할 수도 있습니다.

용액을 돌연변이시키는 것과 관련하여, 모의 어닐링은 온도라는 것을 도입합니다. 기본적으로 그것은 처음에는 솔루션을 매우 열심히 변경하고 (예 : 항상 한 번에 10 번의 교대 전환 시도) 점진적으로 후속 반복에 대해 덜 공격적이어야하므로 미세 조정이 더 많이 이루어집니다 (예 : 다운) 세대당 2 번만 시도해보십시오.


4
나는 대학 시간표를 위해 OptaPlanner (nee Drools Planner)와 Simulated Annealing을 사용했습니다. 모델을 선언하십시오-교대에는 시간과 의사가 있습니다. 체력 기능에 대한 선언적 규칙을 작성하십시오-어려운 제약 (닥터는 교대 근무를 할 수 없음) 및 처벌 (Ann은 월요일을 싫어함). 교대에 대한 선언적 (그 시점!) 스왑을 작성하십시오. OptaPlanner는 임의로 시작 상태를 생성하고 (가능하지 않을 수 있음) 규칙에서 피트니스 기능을 계산하며 최적화 알고리즘에 따라 스왑을 운영합니다. 어닐링 일정과 같은 매개 변수를 선택하고 조정할 수 있습니다.
Jesvin Jose

6

유전 알고리즘 이 여기에 적용됩니다. 학부 과정에서 동료 중 한 명이 비슷한 문제에 대한 논문을 썼습니다.

당신은 찾아보실 수 있습니다 작업 상점 일정오픈 숍 스케줄링 또는 흐름 숍 일정은 흥미있는 시작점이 될 수 있습니다

유전자 알고리즘을 사용하려면 완벽한 솔루션이 필요하지 않습니다. N 개의 무작위 후보로 시작 하여 각 함수체력 함수 를 적용 할 수 있습니다 .

  • 가장 바쁜 의사와 덜 바쁘게 일한 시간의 차이는 비용 함수에 대한 처벌입니다.
  • 의사가 일주일에 5 일 이상 또는 주당 1 박 이상 일할 때마다 페널티
  • 각 제약 조건 등

N 개의 후보를 생성 하면 X를 가장 잘 선택하게되며 , 제약 조건에 덜 영향을주는 후보가 됩니다. 그들과 함께 일하면서 여러 세대에 걸쳐 교차 하고 돌연변이 하면 좋은 해결책이 될 수 있습니다.

그 모든 것에 대해 이야기하면서, 교차점의 돌연변이에 더 의존하는 유전자 알고리즘을 사용할 때마다 더 쉬운 구현으로 훨씬 더 나은 성능을 발휘할 수있는 시뮬레이션 어닐링을 개발할 수있었습니다. 유전자 알고리즘의 비용 / 적합성 및 돌연변이 기능은 아마도 시뮬레이션 어닐링에서 사용되는 것과 매우 유사 할 것입니다. 나는 거기에서 시작할 것이다. @ Konrad Morawski answer

구직 및 GA에 대한 Google 검색 결과

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.