2024年6月28日金曜日

INRC2の再実装 exactly one

 世界記録更目的のため、細部まで詰めて再設計を行っています。スケジュールナースベースではなく別なフレームワーク上での設計になります。

最初は、Exactly One。

スケジュールナースが内部で持っている唯一と言ってよい最も基本的な制約の実装になります。具体的には、シフトは、1スタッフ・1日あたり1個である。2個以上でも0個でもない、1個である、という制約です。

グラフ上でこれを表現すると、最初の2日は、


Earlyでなければ、Day、Dayでなければ、Late,LateでなければNight,NightでなければRestとなります。シフト数は休みを含めて5個であり、必ず5個のうちの1個のシフトが選択されています。

全体では、このパターンが続いて、28日+7=35日パターンとなります。


INRC問題のパターンは、1カ月の場合28日ですが、先月の分を7日分見ており、35日として解いています。

Exactly One制約は、グラフ上ではシンプルに表現出来ていることが分かります。
ところで、Exactly Oneは、例えば数独のラージサイズ版、100x100は、多数のExactly One制約が出現します。こうした場合のExactly Oneの実装は、巨大になります。Native表現では、At least one && At most oneですから、1個以上かつ2個は、NGになります。AtleastOneは、ORかつ全ての2個の組み合わせで2個があってはいけない(Atmostone)を実装することになります。その場合、例えば25個では25C2となり、無視できない大きさになります。これが、スケジュールナースでシフトは、25個以下を推奨している理由です。Exactly Oneの実装は、学術問題でもあり、例えば、

があります。しかし、そうした場合でもグラフ上の表現は、シンプルであることがグラフを使うメリットです。

0 件のコメント:

コメントを投稿