의사 스케줄링 응용 프로그램을 작성 중입니다. cplex/lindo와 같은 선형 프로그래밍 및 솔버를 사용하여 모델을 해결하고 있습니다. 몇 가지 모델링 제한으로 인해 야간 교대조를위한 바이너리 패턴을 생성해야합니다.제약 조건을 가진 이진 순열 생성
일반적으로 우리는 한 달 일정을 생성하므로 야간 근무를 위해 30 일 동안 패턴을 생성해야한다고 생각해보십시오.
야간 근무에는 야간 근무가 계속되는 경우 의사가 다음 5 일 동안 일할 수없는 것과 같은 제약이 있습니다. 따라서 제한은 몇 가지 예입니다.
111000001111100000111110000011 Valid
111000001100000000111110000011 Valid
111010001111101000111110000011 Invalid
일부 정의 된 값보다 작은 연속적인 것들의 수 시작 전 간단한 알고리즘을 시도 일부 규정치 등
우선 미만이어야되어야 패턴들의 수와 같은 다른 제약들이있다 형식 0을 사용하고 비트 연산자를 사용하여 다음 순열을 얻고 다음 순열을 확인하고 유효하지 않으면 모든 순열을 검사하여 다음 순열을 얻고 유효하지 않은 패턴을 무시합니다. 이 패턴은 길이가 30 비트이므로 (2 = 1073741824) 패턴 수가 너무 많아 내 간단한 알고리즘을 검사하지 않습니다. 나는 모든 유효한 패턴을 발견하는 데 24 시간 이상이 걸릴 것으로 생각합니다.
이제 내 질문에 내가 시간을 효율적으로 적용 제약의 모든 순열을 찾아 주어진 문제에 대한 사용하여야한다 알고리즘
- 은?
이 문제는 정확한 커버 문제입니까? 내가 겪고있는 문제에 대한 링크를 춤처럼 적용 할 수 있습니까?
이 문제에 대해 제안하는 해결책에 대한 링크를 제공하십시오.
전체 계획 창의 모든 야간 교대에 대한 모든 이진 패턴 조합을 열거하면 아마도 축척되지 않습니다. 최소한, 7 일 (2 일 연속 작업 일은 5 일간 무료)이 소요되는 작은 조각으로 잘라내거나 전체 제약 조건을 단일 제네릭 제약 조건으로 표현하는 방법을 찾아보십시오 (다소 [this] (https : /github.com/droolsjbpmpm/optaplanner/blob/master/optaplanner-examples/src/main/resources/org/optaplanner/examples/nurserostering/solver/nurseRosteringScoreRules.drl)). –
30 개의 2 진수에 대해 12333800 개의 패턴이 있으며, 최대 5 개의 연속 된 패턴, 연속적인 패턴의 연속 된 5 개의 연속 된 0 개 및 총 15 개의 패턴이 있습니다. 34134는 정확히 15 개가 있습니다. –
모든 가능한 패턴을 생성하고 싶다면 매우 간단한 재귀 적 솔루션이 있어야합니다. 그러나 마커스 (Markus)가 지적했듯이 이것은 다소 많은 패턴이 될 수 있습니다. – beaker