2025年2月20日木曜日

Q.遅勤務1(休遅)は、月1回が上限

 Ans.

「月1回が上限」のニュアンスは、ハード制約だと思います。ただし、スタッフによっては、月2回までやってもよい、という方もおられるかもしれません。そういった要求に対する実装です。


いつものように、スタッフプロパティシートで、希望上限回数を指定します。


行制約で、制約します。ソフトレベル1に着目してください。

行制約レベル1の許容エラー数を1にします。

こうすると、スタッフプロパティシートで、0を指定しているとすると、

0+1=1回までは、ソフトエラー範囲であり、同時に1回以下がハード制約となります。

つまり、2回という解を許容しませんので題意を実現できます。

また、あるスタッフがスタッフプロパティシートに1回と記述すると

1+1=2回までは、ソフトエラー範囲であり、ハード制約でもあります。3回という解は許容しません(存在しません)

このように、題意の要求以上に、将来の変更を予想して記述しておくとメンテナンス性がよくなるでしょう


なお、行制約レベル1には、他の制約も(5連休禁止)あるのですが、不等式制約ではないので、何ら影響はありません。



2025年2月19日水曜日

Q.休日、準夜(準)の職員がいる場合は、日勤の看護師4名をA及びBチームから同数程度を割り当てる 。休日で準夜(準)の職員がいない場合は、日勤の看護師3名をA及びBチームから同数程度を割り当てる

 Ans.

居る場合と居ない場合で記述されています。この場合、

日勤看護師4+準夜1==5

日勤看護師3+準夜0==4

となっていて、同じ値にはならないので、列制約では記述できないように見えます。

ただし、この他に

■準夜(準)がいる場合、長日勤(長日)をA及びBチームに各1名、夜勤(夜)をA及びBチームに各1名割当てる

■準夜(準)がいない場合、長日勤(長日)をA及びBチームに1又は2名合計3名、夜勤(夜)をA及びBチームに1名又は2名合計3名割当てる

という制約があり、
長日2+準夜1==3 夜勤2+準夜1==3
長日3+準夜0==3 夜勤3+準夜0==3

となっています。
これを勘案すると、

準夜1:長日2+休日日勤4==6
準夜0:長日3+ 休日日勤3==6

と、見事に同じ数になっています。本質的な意図は、むしろこちらの方ではないでしょうか? これで、ペア制約ではなく、列制約で記述出来ます。

これを実装すると、以下のようになります。
シフト集合は、



次に、A/Bチームの割り当てです。常に成立するのは、A/Bチームから1名以上という制約です。

一方、
準夜1:日勤4名:Aチーム2名、Bチーム2名以上
準夜0:日勤3名:Aチーム1名以上、Bチーム1名以上

となっています。これより、

    Aチーム人数日勤者数==準夜+1

となっている関係であることが分かります。こういう等式がある場合は、リニアペア制約が使えますが、今回は、列制約とペア制約を用いて記述しました。

■休日A/Bチームから1名以上 :列制約
■休日準夜が居るならば、Aチームは、2名 :ペア制約

Aチーム2名とすることで、自動的にBチームも2名になりますから、上の記述だけで十分です。必ず出来るかは、分かりませんのでペア制約は、ソフト制約としています。1名以上は、mustでしょうからハード制約としています。










2025年2月18日火曜日

Q.準夜(準)がいる場合、長日勤(長日)をA及びBチームに各1名、夜勤(夜)をA及びBチームに各1名割当てる 。準夜(準)がいない場合、長日勤(長日)をA及びBチームに1又は2名合計3名、夜勤(夜)をA及びBチームに1名又は2名合計3名割当てる

 Q.

■準夜(3交代準)がいる場合、長日勤(長日)をA及びBチームに各1名、夜勤(夜)をA及びBチームに各1名割当てる

■準夜(3交代準)がいない場合、長日勤(長日)をA及びBチームに1又は2名合計3名、夜勤(夜)をA及びBチームに1名又は2名合計3名割当てる


Ans.

上の仕様を式で表現すると、以下の関係になっています。

長日2+準夜1==3 、夜勤2+準夜1==3
長日3+準夜0==3 、夜勤3+準夜0==3

つまり、足すと常に3です。こういう関係は、ペア制約ではなく列制約で記述した方がベターです。

シフト集合は、以下で合成します。


2025年2月17日月曜日

Q平日の日勤は9名以上が望ましく、A及びBチームから同数程度を割り当てたい

Ans.

「日勤9名以上」は、そのまま列制約で記述すれば良いのですが、「望ましい」とあることから、ソフト制約とします。

「A及びBチームから同数程度」は、9/2=4. 5 ですので、Aチームから4名以上、Bチームから4名以上とすればよいでしょう。

 






2025年2月15日土曜日

AI技術サーベイ

 目標としているのは、モデリングの代行をAIに行わせることはできないか?ということです。似たようなこととして、プログラミング言語または、独自言語を生成AIで生成させること、または、学習すること、その視点でサーベイしてみました。

https://qiita.com/jovyan/items/6767c9fd944a636fdf88

https://note.com/k_ishi_ai/n/n2897a12f917c

https://note.com/k_ishi_ai/n/n475c804f3195

https://zenn.dev/knowledgesense/articles/110a81646806e6

最終目標は、

日本語 ⇒ 構造化JSON ⇒ プロジェクトファイル 

とすることです。AIが日本語から、構造化JSONを出力させることが出来れば、自動的にプロジェクトファイルには、出来ると思います。そしてそれが正しいかどうか?チェックもまた可能だろうと思います。

問題は、如何にして、それを学習させるかがポイントになると考えられます。
ローカルでDeepSeekをファインチューニングさせることが出来れば、遊べるようになると思います。

下記論文に着目しています。Native Language(英語)とCHAT GPTを用いて、Gurobi等のソルバを呼び出すようです。


NL4Optは、ORとAIの合同チームによるモデリングCompetitionです。ここでもファーウェイが主導しているようです。


こちらは、今後も注目していきたいと思います。現在は、全てChatGPTによるものですが、今後は、DeepSeekを使った報告も出てくるだろうと思います。



現時点で言えるのは、当面モデリングエキスパートの需要はなくならない、ということだろうと思います。言語から簡単にモデリングというのは、現時点においては幻想です。暗黙知の他に、ときに、本人も言葉で出来ない制約があります。その職場に固有の事情や知識も必要となります。加えて言葉の外にある制約や、意図、心理等、を全て学習しない限り、100%の精度で制約には変換できないと思います。エラーが存在する⇒そこにエキスパートが必要だと思います。




Q.変則2交代に3交代が混在、準夜が居た場合に翌日深夜、深夜が居た場合前日準夜

 前回から引き続き、

■3交代、準夜が居た場合、同じチームで、翌日深夜が居ること

■3交代、深夜が居た場合に、同じチームで、前日に準夜が居ること

この要件は、3交代の勤務を考えた場合、必然となります。日勤を除く時間帯16時間を誰かが埋めないといけない、ということです。

この職場の場合、チームは、A/Bの2チームで、3交代が各々1名居ります。なので、

■Aチーム3交代準夜が居れば、翌日Aチーム2交代深夜が居ること

■Bチーム3交代準夜が居れば、翌日Bチーム2交代深夜がいること

になります。同様に、

■Aチーム3交代深夜が居れば、前日Aチーム2交代準夜が居ること

■Bチーム3交代深夜が居れば、前日Bチーム2交代準夜がいること

が、制約になります。



「居ること」の真意は、「少なくとも一人居ること」ですから、ORで、演算子「または」を用いて実装できます。(具体的な深夜準夜人数については、列制約で制約しています。)

また、「前日」が必要ですから、「制約開始日1日前から」を使えば、先月からの流れも問題ありません。翌日に対しては、+1、前日に対しては、ー1を「日オフセット」で指定すればOKです。

以上を実装したのが、次になります。



「AならばB」で気を付けること

「AならばB」制約は、難しいので、使わないで済むならば、使いたくはないです。
今回の場合のように、使わなくては記述できないので、使わざるを得ないのですが、その際、気を付けることがあります。それは、

「Aでないときは、何も制約していない」

ということです。言葉通り、Aならば、Bになるのですが、その反対の、Aでないならば、
の状態のとき、Bがどうなるかは、何も制約されていないということです。

今回の例で言えば、3交代深夜が居ないときに、2交代準夜が居てもおかしくない、ということが起きてしまいます。
つまり、茶色枠の制約だけでは、上の事象が起きてしまう可能性があります。本当は、どういう風にしたいかというと、

■Aチーム3交代準夜が居ないならば、翌日Aチーム2交代深夜が居ない

という風にしたい訳です。なので、茶色枠の4つの制約に対して、さらに4つの制約を加えています。これで初めて、意図した動きになると思います。本質的な意図は、

準夜人数==翌日深夜人数

ということなので、AならばBを使うと、両方向から制約する必要がある、ということです。(多分、リニアペア制約を使えば、上の制約をダイレクトに制約出来ると思います。)

まとめとして、

「AならばB」制約では、Aでないときどうしたいか?も考える

ということがポイントになります。フリーで良いならば片方向でよく、フリーではまずいということであれば、両方向で制約する必要があります。

結構難しい制約です。今回は、Aチーム、Bチーム一人づつの3交代での記述になるのですが、この条件が崩れた場合は、また記述しなおす必要があります。これをメンテナンスしていくのは、なかなか大変そう..と思います。

全員が同じ変則2交代に移行してくれれば、上のような面倒な制約は、必要ありません。
特殊な事例ですが、このような例は、他の地方公立病院でもありそうな話ではあると思います。



2025年2月14日金曜日

Q.変則2交代に3交代が混在

 Q.

■準夜(準)がいる場合、長日勤(長日)をA及びBチームに各1名、夜勤(夜)をA及びBチームに各1名割当てる

■準夜(準)がいない場合、長日勤(長日)をA及びBチームに1又は2名合計3名、夜勤(夜)をA及びBチームに1名又は2名合計3名割当てる

■準夜(準)を1名割当てた場合、翌日に準夜(準)と同じチームの1名を深夜(深)に割当てる

■準夜(準)及び深夜(深)の割当ては、3交替制の職員を優先して行う

Ans.

言葉にして言うと難しいです。図にしてみましょう。

今3交代勤務者が深夜準夜の勤務をしたとすると、準夜の後深夜を誰かが行う必要があります。ところが、同じチームに3交代勤務者は一人のため、2交代勤務者が深夜勤務を代行する必要があります。本来は、2交代勤務者は、長夜明だけなのですが、3交代勤務者のサポートのために、深夜・準夜もシフトをこなす必要が出てきます。皆が一斉に変則2交代に移行すれば、必要ないのですが、なかなか簡単には行かない事情があるようです。

また、準夜が居れば、長日・夜勤者は、2名でよい、居なければ3名必要ということになります。




つまり、

    準夜+長日==3名
    準夜+夜勤==3名

という制約式になります。==は、C言語表記で、等しい という意味です。
これを列制約で記述します。準夜+長日は、シフト集合で合成します。準夜+夜勤も同じく
シフト集合で合成します。
マウスホイールボタンを押すと、下のように、シフト集合の場合は、その要素が表示されます。




準夜が居た場合に翌日深夜
深夜が居た場合に前日準夜

は、ペア制約による記述となります。