2人の夜勤新人が訓練期間中に各々2回夜勤を行っています。この期間は、プリセプティ分、夜勤者が増えて3人となります。夜勤新人に関わらず2人夜勤となります。複雑な仕様ですが、GUIのみで記述できました。とも同じ集合(男)だと、動作しないと思います。<=1と制約すれば、2名以上の男性が勤務することはありません。よって、スタッフプロパティで、性別を指定し、次のように記述します。共有2020年2月12日水曜日メールアドレス変更しました新しいアドレスは、https://nurse-scheduling-software.com/contact.htmlをご覧ください。今年度中は、旧アドレスでも問題なく届きます。共有2020年2月10日月曜日xbyakによる実装Xbyakは、Intelのアセンブリ言語命令を実行時に生成するC++のライブラリです。今の時代、LLVMがあるので、C++コードのJITコンパイルも可能になっており、その必要性は狭まってはいますが、Xbyakで記述した方が手軽な場合もあります。IntelのMKL-DLLという深層学習用の高速化ライブラリがありますが、そのエンジンには、Xbyakが使われているそうです。aarch64(ARMの64ビットアークテクチャ)にも移植されているようです。Xbyakの概要はこちら。なくて、AL4の高速化です。AL4は、数理的ソルバーですが、部分問題を解く必要があり、そのための新しいアイデアに対する実装に使用します。コンパイル時定数であれば、C++テンプレートでC++コンパイラが勝手に最適化してくれますが、RUNTIME時定数では、テンプレートは何の役にも立ちません。RUNTIME時定数というメリットを最大限使って高速化を図ります。Xbyakの使用は、初めてで、SSE2も初めてなので、初めてのXbyakによるSSE2ということで、実装中のコードを使用して、この先書きたいと思います。下記は、スニペットです。GUIだけで記述できました。平準化のため、各スタッフ6日以下としていますが、Pythonを使えば、この部分もダイナミック化が可能です。ダイナミック化とは、動的に例えば6という数字を決定することです。6というのは、リーダ回数=月の日数/リーダ可能者人数+1で割り出したはずです。ところが、月の日数は変わるし、リーダ可能者も、スタッフプロパティに現れなくて出来ない人(実習等で予定書き込み)もいるかもしれません。その場合でも、予定を集約すれば、より精度の高い平準化が可能になります。同時に、将来のリーダ可能者の増減にも自動で対応可能となります。ロバストな勤務表づくりの要点は、そういった将来の人数の増減まで考えることです。予定の入っていないところだけ制約する前回から続きプロジェクト実装です。確かに、公休数11.5を実現するのに、全休10回、半休3回(長坂さん)でよい雰囲気です。横山さんの公休数11を実現するために、全休8日、半日が6日もアサインがされてしまっていて問題です。半日には、何ら制約が入っていないために、こういう解が出てしまいます。そこで、土曜日以外は、なるべく半日をアサインしないように制約したくなるのですが、元々予定が入っているところは、意味がないので外すことにします。(ソフト制約は、ソルバーにとって重いのでなるべく少なくしたいという意図もあります。予定が入っていればシフトが入ってきます。空白のときだけ、半休がアサインされ、レベル1のペナルティを与えるコードになっています。このコードをEnableすると、土曜日だけ半休がアサインされて下の結果となります。GUIでは、静的制約しかできませんが、Pythonを使えば、上のようにダイナミックに制約することが出来ます。(Atom)自己紹介スケジュールナーススケジュールナースという勤務表自動作成ソフトを開発・販売しています。本ブログでは、ユーザ様の要求仕様を「制約プログラム」に変換していく様子をメインに紹介していきたいと思います。