シフト計算機
制約のあるエンティティのセットが与えられた場合、それらの制約を最大限に尊重するシフトのスケジュールを計算します。
使用法
python --version
コマンドラインのバージョン)を実行して、コンピューターにPythonがインストールされていることを確認してください。
そうでない場合は、Pythonをこちらからダウンロードできます:https://www.python.org/downloads
Pythonをインストールするとき:
- WindowsはApp StoreからPythonをインストールしようとする場合があります。これを無視してpython.orgからインストールする必要があります。インストールをカスタマイズできるようにする必要があります。
- ボックスをチェックしてパスに追加してください!これにより、コマンドライン端末がプログラムを実行しようとするときにPythonを見つけることができます。
プログラムを実行するには:
-
calculateShifts.py
ファイルをリリースからダウンロードします( sampleEntities.csv
も有用であると思われます)。 -
calculateShifts.py
含むフォルダーに移動します - 左上の「ファイル」をクリックし、「Windows Powershellで開く」をクリックします。
- コマンドを入力します。 (以下を参照してください。)
このプログラムはコマンドラインから実行されます。入力ファイルを取得し、生成されたスケジュールを出力ファイルに記録します。次の引数が必要です。
- エンティティファイル名(foo.csvなど) - これは入力ファイルです。以下の要件を参照してください。
- 開始日(yyyy-mm-dd)
- 週数
- 小文字を使用したシフトのある日、セミコロンで区切られた日の短縮日名(例:sat; sun)
- シフト間の最小日数
例えば:
python calculateShifts.py sampleEntities.csv 2021-08-01 10 "fri;sat;sun" 6
エンティティファイル要件
エンティティファイルは、次の列を備えたコンマ集合値(CSV)ファイルである必要があります。
- 名前
- グループ - 現在プログラムでは使用されていませんが、スケジュールでさまざまなグループがどのように分散されているかを確認する場合に備えて、出力に含まれます。
- 利用できない日 - 小文字、短縮日名をセミコロン(例:金; sat; sun)を使用してこのエンティティが利用できない曜日を指定します。
例については、sampleStities.csvを参照してください!
出力
プログラムは、次の列を使用してoutput.csvファイルを出力します。
スケジュールは制約違反を最小限に抑えようと試みますが、これらの制約は競合する可能性があるため、スケジュールは完璧ではありません。このスケジュールを直接使用する場合は、代替を許可することをお勧めします。
さらに、プログラムはコンソールにいくつかのデバッグ出力を印刷します。各エンティティについて、それは彼らの制約が損なわれた回数のnunmberと、異なる日に彼らのシフトの分布を共有します。
実装計画
以下は、興味があれば、プログラムの仕組みについての詳細です。
制約
このプログラムは、すべての制約が完全に満たされることを保証するものではありません。それは、入力が完全に矛盾している必要があるためです。代わりに、提供された制約の種類に優先順位を付け、スケジュールされたエンティティ全体でこれらの制約の違反を最小限に抑え、均等に配布しようとします。
優先順位の順:
- 利用できない日 - エンティティは、利用できない1日には決してスケジュールされないでください。
- シフト分布 - すべてのエンティティが全期間にわたってほぼ同数のシフトを持っていることを確認してください。
- シフト間の最低日数 - シフト間の最小時間を尊重しようとします。
- 日配布 - 各エンティティが利用可能なさまざまな日にシフトしていることを確認してください。
擬似コード
- すべてのシフトのリストを生成します。
- 当初、エンティティを最大の制限から最小限までソートします。
- 「完了」されていないエンティティごとに:
- 次の理想的なシフトを探してください。
- それが空いていない場合は、それを取ってください。
- それが占有されている場合は、制限を緩和し、新しい理想的な変化を探してください。このエンティティの妥協カウントを1増加させます。
- 最後の制限(利用可能な日)になっている場合は、このエンティティをスキップして、その制限に違反するのではなく、「完了」としてマークします。
- まだ割り当てられていないエンティティが「完了」されていないエンティティがまだあるかどうかを確認してください。
- もしそうなら、エンティティを最も少なくとも最小に妥協する数で並べ替えてから、再びそれらをループします。これにより、各ラウンドを最も侵害したエンティティが最初のピックを獲得することが保証されます。
- スケジュールをoutput.csvに出力します。
必要なデータ構造:
- 日付、日、および割り当てられたエンティティを伴うシフトのリスト
- 名前、グループ、利用不能、妥協の数、および行われたマーカーを持つエンティティのリスト