2023年8月31日木曜日

勤怠管理ソフトと連携させたい

 勤怠管理ソフトと連携させたい (nurse-scheduling-software.com)

という要求は、あるかもしれません。「そのソフトがExcelでの入出力を許容していれば」という条件付きのお話です。

Excelでも任意フォーマットの出力は、可能ですが、現状遅すぎるのでCSVで出力することをお勧めします。任意フォーマットに対応可能となります。

2023年8月30日水曜日

前日同じチームに日勤者がいること

 前日同じチームに日勤者がいること (nurse-scheduling-software.com)

病棟内では、チームに分かれることがあります。仮にチームA/Bとしましょう。看護師長を除くとチームの人数は、各々12名程度となります。この条件は、日曜日が最も厳しくなり、何も制約しない状態では、前日の日勤者がいない、という状態が存在します。一人でも居れば、前日の状況が判るので、リスク管理上都合がよい、ということらしいです。

この制約は、GUIでは書けません。なのでPythonで書くことになりますが、制約部は、僅か十数行、検証部を含めても40行以下ですので、他へ移植することも容易かと思います。

2023年8月29日火曜日

数独プロジェクト追加

 数独の問題がただ一つの解を持つことの証明 (nurse-scheduling-software.com)

シフト勤務表では、求解回数が効きます。前回とは異なる解を求めようとするので、2つめの解がないということは、1解しか存在しない、ということの証明になります。

その昔、池上先生のベンチマークについて、池上先生のベンチマーク上の解はどの程度存在するかについて、お聞きしたことがあります。少なくとも100万以上は実際に存在するのだそうです。

しかし、例えば、SchedulingBenchmarksのInstance15を見ると、そんなにもあるはずがないと思います。恐らく一桁台だろうと思います。

問題の難しさは、解空間/探索空間 に反比例するであろうと思うので、その意味では、池上先生のベンチマークは、易しい部類に入り、解きようによっては時間がかからないのだと思います。しかしながら、Instance15は、探索空間も広いし、解も少ないということで、難しい問題、時間のかかる問題ということなのだろう、と解釈しています。


2023年8月23日水曜日

時間割タスク版

タスクカウント、ペアフェーズが動くようになったので、時間割シフト版をタスク版に書き換えてみました。 

時間割作成問題タスク版 (nurse-scheduling-software.com)

なお、ダウンロードしてもバージョンが高いので読み取れない、が出ると思います。8月末までお待ちください。

2023年8月22日火曜日

ペア制約のフェーズモードサポート

 8月末のリリースからサポートします。

タスク指定とフェーズ指定、フェーズオフセットが指定出来ます。





2023年8月20日日曜日

タスクカウント新設

 タスク勤務表のフェーズ行制約について新設しました。


最大ー最小パターンでのフェーズは、意味があります。
それに対して、タスクカウントでは、フェーズ0のみに記述します。フェーズは意味がなく、強いて言うと、AnyPhaseということになります。挙動の違いは、以下を見ると明らかです。

シフトとのANDを取ることも可能です。


松本さんの国語は、総計3個です。制約は、シフト123以外で2個で、その通りになっています。



タスクカウントにおいて、

■複数パターンは禁止

■Notオペレータは、NoTaskVar以外禁止

■パターン最初の曜日・最後の曜日 サポートしていません

■シフト部は、オプションです。シフトまたは、シフト集合のみでフェーズオブジェクトはサポートしません。NOTオペレータはサポートします。




2023年8月19日土曜日

グループ集合要素として、シフトとタスクが記述可能に

 スタッフ毎のシフトとタスクが次のように定義されていたとします。


このシフトとタスクをグループ集合要素として記述できるようになります。

ただし、この実装から、グループ集合名と、グループ要素は、シフト名・タスク名の重複は禁止となります。


2023年8月18日金曜日

先月部の予定エラーを回避するオプション追加

 スタッフプロパティのシフトとタスクはハード制約です。今月から、シフトや、タスクが切り替わって、テーブルの記述を変えたとすると、先月部の予定でハードエラーとなってしまう問題がありました。

この回避方法が比較的面倒なため、機械的に回避できるオプションを追加しました。

現在のシフトとタスクの状態が次であるとします。









求解すると次のようなエラーが出ました。


ダブルクリックしてエラー箇所を表示させます。
シフト123は、Enableされていないのでエラーとなりました。(先月までは、シフト123がありましたが、今月からシフト変更となりシフト123は無くなりました。)

このエラーを回避するオプションで、次をチェックし設定ボタンを押します。


先月部の矛盾する予定は、ソフト化されます。


求解してみると、今度は次の箇所でハードエラーとなりました。

ダブルクリックしてエラー箇所を見ます。先月部の国語が問題でした。
(今月から国語は外されました。)

このエラーを回避するには、次をチェックします。






次のように予定がレベル1にソフト化されます。











2023年8月17日木曜日

ソフト予定制約を優先としない、オプション追加

 次の画面では、シフト123をEnableしていないにも拘わらず、解でシフト123がアサインされています。


これは、ソフト予定の方を優先度を高くしてあるからです。

しかし、スタッフプロパティのシフト予定は、ハード制約というポリシーに反しているので、これを修正することにしました。

今までの挙動を維持したい場合は、チェックを外してください。(8月末リリースよりチェック付きがDefaultとなります。)




フェーズパターンのNOT演算を禁止

 タスク集合では、既に禁止していましが、行制約・フェーズパターンでも禁止としました。

これは、タスクのNOTは、シフトほど単純な構造でなく解釈のトラブルを生じ易いためです。






2023年8月16日水曜日

8月末にリリース予定機能

次の4つの実装を予定しています。 

1) タスクカウント

2) リフレッシュ

3) Group集合名にスタッフプロパティのシフトとタスクを追加

4) スタッフプロパティのシフトとタスク 先月部の矛盾する予定をソフト制約化


これらは、全て4)に起因して実装するものです。



2023年8月11日金曜日

SAT competition 2023

 結果が出ました。毎年楽しみにしているのですが、今年は、プリプロセッサのイノベーションがあったようです。

にしても、KissatよりCadicalの方が良い理由が分かりませんでした。いずれにせよ、来年以降ポートフォリオソルバで採用されていくのは、間違いないと思います。


2023年8月10日木曜日

ネット上のCSVファイル読み込み

 時間割作成問題作成中に知ったのですが、Pulpでは、pandasで簡単にネット上のCSVファイルが読めます。


lesson_df = pd.read_csv("https://raw.githubusercontent.com/ryosuke0010/opt_test/master/composition.csv")

スケジュールナース上のPythonは、pandas等の大きなライブラリは搭載していないので、上記ソースでネット上のCSVファイルを読むことは出来ません。 そこで、pandasなしに次のようにして読んでいます。

def get_list_of_rows():
    url="https://raw.githubusercontent.com/ryosuke0010/opt_test/master/composition.csv"
    response = urllib.request.urlopen(url)
    lines = [l.decode('utf-8') for l in response.readlines()]
    #print(lines)
    reader=csv.reader(lines)
    list_of_rows=list(reader)
    return list_of_rows

2023年8月9日水曜日

時間割作成問題

ふとQiita記事が目に留まったので、スケジュールナースで記述できるかやってみました。

 時間割作成問題 (nurse-scheduling-software.com)

スケジュールナースは、数独、塾勤務表、時間割作成問題のように単にシフト問題に留まらずに、組み合わせ最適化問題を解くプラットフォームとしてもお使い頂けます。

2023年8月7日月曜日

Update INRC2 8weeks data and projects

 Updated project files format, using task schedule table as follows. Also,newly found UB values are updated.