시프트 계산기
제약 조건이있는 엔티티 세트가 주어지면 이러한 제약 조건을 최대로 존중하는 교대 일정을 계산하십시오.
용법
명령 줄에서 python --version
실행하여 컴퓨터에 Python이 설치되어 있는지 확인하십시오.
그렇지 않은 경우 여기에서 Python을 다운로드 할 수 있습니다 : https://www.python.org/downloads
파이썬을 설치할 때 :
- Windows는 App Store에서 Python을 설치할 수 있도록 시도 할 수 있습니다.이를 무시하고 Python.org에서 설치해야합니다. 그렇지 않으면 설치를 사용자 정의 할 수 없으므로 Windows. 설치를 사용자 정의 할 수 있어야합니다.
- 상자를 확인하여 경로에 추가하십시오! 이렇게하면 명령 줄 터미널이 프로그램을 실행하려고 할 때 Python을 찾을 수 있습니다.
프로그램을 실행하려면 :
- 릴리스에서
calculateShifts.py
파일을 다운로드하십시오 (또한 sampleEntities.csv
유용한 것을 찾을 수도 있음). -
calculateShifts.py
포함하는 폴더로 이동하십시오 - 왼쪽 상단에서 "파일"을 클릭하고 "Windows PowerShell에서 열기"를 클릭하십시오.
- 명령을 입력하십시오. (아래 참조.)
이 프로그램은 명령 줄에서 실행됩니다. 입력 파일이 필요하고 생성 된 일정을 출력 파일로 기록합니다. 다음과 같은 주장이 필요합니다.
- 엔티티 파일 이름 (예 : foo.csv) - 입력 파일입니다. 아래의 요구 사항에 대한 요구 사항을 참조하십시오.
- 시작 날짜 (yyyy-mm-dd)
- 몇 주
- 변속이있는 날, 소문자를 사용하여 단축 된 날 이름은 반 콜론으로 분리되었습니다 (예 : Fri; Sat; Sun)
- 교대 사이의 최소 일
예를 들어:
python calculateShifts.py sampleEntities.csv 2021-08-01 10 "fri;sat;sun" 6
엔티티 파일 요구 사항
엔티티 파일은 다음 열이있는 쉼표로 구분 된 값 (CSV) 파일이어야합니다.
- 이름
- 그룹 - 현재 프로그램에서 사용하지는 않지만 일정에 다른 그룹이 어떻게 분포되는지 확인하려는 경우 출력에 포함됩니다.
- 이용할 수없는 날 -이 엔터티를 소문자를 사용하여 사용할 수없는 요일을 지정하고 반 콜론으로 분리 된 짧은 날 이름 (예 : Fri; Sat; Sun).
예를 들어 SampleNtities.csv를 참조하십시오!
산출
프로그램은 다음 열이있는 output.csv 파일을 출력합니다.
일정은 제약 위반을 최소화하려고 시도하지만 이러한 제약 조건이 충돌 할 수 있으므로 일정은 완벽하지 않을 것입니다. 이 일정을 직접 사용하는 경우 대체를 허용하는 것이 좋습니다.
또한이 프로그램은 일부 디버그 출력을 콘솔에 인쇄합니다. 각 엔티티에 대해, 그것은 그들의 제약이 손상되었고, 다른 날에 대한 교대의 분포가 손상된 시간의 수녀를 공유 할 것입니다.
구현 계획
다음은 관심이있는 경우 프로그램의 작동 방식에 대한 자세한 내용입니다.
제약
이 프로그램은 모든 제약 조건이 완벽하게 충족되도록 보장하지는 않습니다. 이는 입력이 완전히 비 투자 적이어야하므로 모든 제약 조건이 필요합니다. 대신, 제공된 유형의 제약 조건을 우선시하고 예정된 엔티티에 해당 제약을 최소화하고 균일하게 배포하려는 시도.
우선 순위 :
- 일을 사용할 수없는 날 - 실체는 이용할 수없는 하루 동안 예약되어서는 안됩니다.
- 교대 분포 - 모든 엔티티가 전체 기간 동안 거의 동일한 수의 시프트를 가지고 있는지 확인하십시오.
- 교대 사이의 최소 일 - 교대 사이의 최소 시간을 존중하려고 시도합니다.
- 주간 분포 - 각 엔티티가 다양한 일을 사용할 수있는 일에 교대하는지 확인하십시오.
의사 코드
- 모든 시프트 목록을 생성하십시오.
- 처음에는 엔티티를 대부분의 날에서 최소한의 날 제한을 정렬합니다.
- "완료"가 아닌 각 엔티티에 대해 :
- 다음으로 이상적인 변화를 찾으십시오.
- 비어 있지 않으면 가져 가십시오.
- 점유 된 경우 제한을 완화하고 새로운 이상적인 변화를 찾으십시오. 이 엔티티의 타협 수를 1 씩 증가시킵니다.
- 우리가 마지막 제한 (사용 가능한 일)에 있다면이 엔티티를 건너 뛰고 해당 제한을 위반하지 않고 "완료"로 표시하십시오.
- 여전히 할당되지 않은 교대와 "완료"가 아닌 엔티티가 있는지 확인하십시오.
- 그렇다면 엔티티를 대부분 타협 수에 의해 정렬 한 다음 다시 반복하십시오. 이를 통해 가장 많이 타협 한 엔터티는 각 라운드마다 첫 번째 선택을받을 수 있습니다.
- 일정을 output.csv로 출력합니다.
필수 데이터 구조 :
- 날짜, 일 및 할당 된 엔티티의 변화 목록
- 이름, 그룹, 사용할 수없는 날, 타협 수 및 완료 마커가있는 엔티티 목록