2024年7月26日金曜日

INRC2 8Weeks LB 改善構想

 改善方法を構想しました。

一つには、BranchingTreeのパラレル化です。マルチスレッドで、残っているBranchingTreeを潰していきます。ネックは、グラフを解く速度ではなくリニアソルバCLPの速度であることが分かっているので、CLPのマルチスレッド数がその上限の速度向上となります。しかしながら、この方法でも十分ではありません。

そこで、LB改善専門の専用スレッドを立ち上げます。このスレッドは、LB(Lower Bound)が求まったあとに、通常のBranching Tree Search(左側)とは独立、かつ並列にLBだけを改善します。


LB改善とは何か?というと、リニアソルバで求めたBranching Tree Rootのフラクショナルな値を整数化していくことです。それでは、Branch&Boundと何が違うか?というと問題を分割しません。Rootのまま行います。なので、そこでフラクショナルを整数に出来たとき、何某かLB改善に寄与するはずです。その問題の目的関数値の最小公約数で決まる値以下にUB-LBギャップまで改善出来た場合、最適値証明が完了します。INRC2の場合は、最小公約数は、5です。(重みが10,15,20,30)です。必ずしも全てのFractionalを整数化する必要はありません。UB-LBギャップー5>=0となるまで改善出来れば十分です。別な言い方をするなら、全てのFractionalを整数化出来た時、UBが未知だとしてもリニアソルバの値が即最適値UBとなります。

INRC4Weeksのように通常は、左側ループのみで厳密解が求まります。しかし、長時間廻しても求まらない、若しくは求まらない可能性を考えて右側ループも最初から廻します。現在の状況からするとINRC8Weeksの場合は、1時間も廻すともうこれは尋常ではない=BranchingTree爆発ということが分かるので、その時点で右側に全力投入したほうがよいかもしれません。

これは、INRC8WEEKSに対して8時間以内に厳密解が求めるためのアイデアであり、やむにやまれず、手段を選んでられない状況から考えました。もう意地になっているいうか、これを解くことが自分の使命のように思い込んでしまっている自分が怖いです。


ところで、整数計画創始者ゴモリーの考案した方法は、ゴモリーカットと呼ばれています。

Vol.50_10_719.pdf (orsj.org)

The history of state-of-the-art MIP solvers is fascinating. There are very few p... | Hacker News (ycombinator.com)

CPLEX→CLP/Gruribi→ZIB/Highs→COPT

という最近のCOPTの攻勢をみるにつけ、アカデミックなバックグラウンドは、全て繋がっている、のが面白い、というかそれだけ難しい分野ということが言えると思います。最先端のMIPソルバを開発できる人は、非常に限られており、会社から会社へ移動することによって成長と遂げてきたという歴史があります。COPTの中の人達も、スタンフォード出身だったのですね。

とりあえず、この方法を菅原カットと呼ぼうと思います。平面削除は、アナログをデジタル化する方法です。一方、菅原カットは、デジタルからアナログを改善する方法です。実装してみて、どんなものなのか、今後数週に渡り、実装・評価していきます。




2024年7月25日木曜日

INRC2 8WEEKS LBの改善が必要

 200時間廻しても解が得られないのが大半であることが分かりました。正確には、厳密解証明が出来ていません。約10日計算機を廻しても解が得られないというのは、何か方法論からして間違っているような気がします。

どういう問題かというと、BranchingTreeの爆発という現象が生じて、調べるのが困難になるということです。Branching Treeを全て調べて、現在のUBを下回る解が存在しない、ということを言いたいのですが、調べれば調べる程、調べるべきNodeが増えてくる現象です。つまり、恐らくこの値は最適値であろうが、これより良い解が存在しない、という証明が出来ないのです。

そんなこと、どうだっていいじゃん?ほぼ最適値が分かっているんでしょ?と言われそうですが、アカデミックの世界で重要なのは、厳密解です。これが言えるかどうかで、その価値に雲泥の差が生じます。厳密解が分かれば、その後、高速なヒュリスティクスを開発することも有利になります。しかし、それが分からないと、現在の解がどれだけ最適値に近いのかが分からないということになります。量子アニーリングがどれだけ早くかつ精度よく問題を解けるのかは?最適値が分かっている最も困難な問題分野で、比較評価されるべきでしょう。そういった評価をする上においても重要です。量子アニーリング自体は、厳密解を求めるものではありません。厳密解を得るのは、依然としてクラシカルな方法によります。

NP困難な世界に挑むとは、そういうことだと思います。


この手の問題に対して一般的なMIPの対処方法は次の3つがあります。

■Strong Branch

■Reduced Cost Fixing

■Cut Generator

です。代表的な組み合わせ最適化問題、例えば、VRP(Vehicle Routing Problem)問題では、Cut Generatorが有効であることが報告されていますが、NSPに関しては殆どありません。

どのようにするか、するべきか考え中です。




2024年7月24日水曜日

サブスク契約

 Q.スケジュールナースシステムの利用について、サブスク契約するにあたりの、見積り

書とメンテナンスに係る経費の概算を教えてください。


Ans.

サブスクは、マイクロソフトストアによる販売です。菅原システムズは、ソフトの開発元ではありますがサブスクの販売は行っておりません。

従いまして、契約書はありません。

もしかして、勤務表作成サービスの方をご所望でしたら、以下のような内容になります。

https://www.nurse-scheduling-software.com/japanese/publications/project_creation_service.pdf

お勧めしているのは、1年サポートの方です。実績的に見ますと、3カ月+サブスク版では、ITに明るい方でないと期間的に難しいかな?という感じです。慣れの部分大半ですが、厳しい方が散見されます。

1年版でしたら、買い切りであり、この期間内に学習して頂ければあとはご自分達でメンテナンス出来るので費用負担も発生しない、という算段です。

勿論、独力で可能であれば、買い切り版のみの販売もお受けします。

以上、ご案内させていただきました。

2024年7月23日火曜日

入稿データ作成

 印刷媒体に広告を出すのは初めてなので、以下の通りご教示頂きました。

*****

ご質問いただきました入稿データの件ですが、

添付のpptの黒枠内にモノクロで作成の上、PDF保存お願いします。

その後、以下URLにてグレースケール変換※をお願いします

(※グレースケール変換しないと印刷データとしてNGのため)

https://avepdf.com/ja/convert-pdf-to-grayscale


また、特に最小フォントなどの指定はございませんが、

文字のアウトライン化をお願いします

※アウトライン化の方法は以下URL参照お願いします

https://ppdtp.com/powerpoint/font-outline/


また、貴社HPのURLが記載されておりますが

QRコードは不要でしょうか?

もしご希望でしたら、以下URLにてQRコード作成可能ですので

作成後、広告データ上に配置の上、最後グレースケール変換いただければと存じま

す。

https://barcode-place.azurewebsites.net/Barcode/qr



*****

ということで、本来なら、版下作成にイラストレーターが必要ところ、

1)所定のPPTテンプレート上で作成

2)アウトライン化

3)PDF化

4)PDFをグレースケール化

で、済みました。サポートありがとうございました。



2024年7月19日金曜日

Nursing BUSINESS10月号に広告を掲載予定

勤務表作成の特集があるようで、その縁で広告を掲載することにしました。

現在Google広告を使用していますが、「看護師」「勤務表」「自動」での広告単価は、時に、@350を超えてます。数年前に比べ、数倍~10倍に高騰しています。一方、スケジュールナースのサブスクで手元に入ってくるのは、@300足らずです。(マイクロソフトは@15%ですが、そのほかにUSのTAXが取られます。) いつの間にか、とんでもないことになっていました。つまり、製品の原価以上に広告費が高い、という異常な状態にあります。

それだけ価値のあるような競合製品群になっている、とも思えないのですが、民生分野からすると、医療分野は、美味しい分野なのかもしれません。そもそも、アプリの志向が違うので競合とも言えないのですが、傍から見ると同じに見えるのでしょう。

スケジュールナースは、簡単ではないしAIも使っていません。

アプリの設定を使うというよりは、アプリにプログラムする、もう少し正確な言い方をすると、制約プログラミングするためのプラットフォームです。ユーザは、アプリの下にあるのではなく、ユーザ自身が制約プログラミングするところが決定的に違います。

ただし、いわゆるプログラミングではありません。プログラムは、問題を解くやりかた、アルゴリズムに沿ってコーデイングしますが、制約プログラミングは、アルゴリズムを解くことではありません。制約プログラミングは、制約を列挙することであって、問題を解くやり方をコンピュータに指示する必要はありません。制約を列挙しさえすれば、後は、制約で決まる解空間上での最適解を求めるのはソルバの仕事です。

とりあえず、どんなものかな~位の気持ちで試してみることにしました。


2024年7月18日木曜日

HighsのHiGHS Newsletter 24.1

 ワークショップがあったようで、結構な参加者がいたようです。資金調達も上手く行っているようで、スポンサーも付いているようです。


トピックは、内点法ソルバのプロトタイプを8月末までにリリースするとのことです。また、開発の議論の場として、Discordを始めるようです。Metisによるパーティションニングを施すとのことなので、恐らくは、マルチスレッド化したものになるでしょう。


なので、それなりの性能アップが期待できます。この性能を見た後に、必要ならCOPTに切り替える作戦でもよいかな?と思いました。とりあえず、厳密解を全て明らかにするという壮大な仕事が終わってから、普及活動に戻りたいと思います。

2024年7月17日水曜日

夜勤ナースと夜勤支援二つのグループに属する夜勤者数の変更の仕方について



 次のような大変丁寧なご質問を頂きました。この質問の優れた点は、問題箇所の説明であることは、勿論ですが、、再質問の余地がなく、必要にして十分な情報が盛り込まれています。しかも、ご自分でトライして、このようにしたけれどもダメだったと、記述されていることです。

このように記述して頂くと、どこで躓いているのかが分かるので、大変ありがたいです。





「夜勤」というシフトを今まで、各Grから一人づつ、計2名確保していたけれども、新しく、どちらのGrにも属せる人が居た場合は、上のように制約したい、とのことですね。これに対する私の一次回答は次です。

夜勤というシフトを二つに分けるのよいかと思います。

夜勤=夜勤ナース業務 または 夜勤支援業務

とします。


次の3つの制約で、所望の動きになると思います。

1)1<=夜勤ナース業務<=2

2)夜勤支援業務<=1

3)2<=夜勤<=2

3)番目の制約は、夜勤する人は、変わらず2人、という制約です。これは異論ないと思います。1)番目の制約は、ナース夜勤でみると、上の二つのケースでみて、2人のナースの方が夜勤する場合と、1人のナースと1人の支援業務の方の場合があります。どちらのケースでも、最低ナースは一人確保されている必要があります。最大で2名は異論ないと思います。2)番目の制約は、二つのケースで見ると、0名もしくは1名となります。

一つのシフトは、同じ人には二つ割り当てられることはなく、常に一つという性質を利用して制約します。スタッフプロパティ上の集合は、どちらの集合にも属する場合が出てくるので、仕事を分けるには、シフトを分けることが必須になります。(今後、さらに夜勤の種類が増える場合には、タスクを使うことで、シフトとタスクの分離が出来、メンテナンス性がよいものとなりますが、今回の場合は、シフト分割でよいでしょう。)

分かりづらければ、現在のプロジェクトファイルを送って頂ければ、それに上記を追加変更いたします。

ということで、具体的にプロジェクトを変更していきます。

夜勤シフトのチェックを外します。
すると、次のようになります。

勤務者数で参照されているので、勤務者数のチェックを外します。


多くの箇所で参照されているので、グループ毎の設定をオフにします。






行制約も同様です。


削除した「夜勤」を二つにシフトにします。夜勤ナースと、夜勤支援という二つのシフトを追加しました。

シフト集合を追加しました。このとき、「夜勤」は、元の「夜勤」と同じ名前にしておくのがポイントです。

行制約で前の夜勤ラベルは、トでした。元のシフト「夜勤」は無くなりましたが、新しくシフト集合の「夜勤」は、存在しています。ソフトが参照しているのは、ラベルではなく、名前の方です。名前「夜勤」は、変わっていないので、パターンを弄る必要はなく、グループの適用をオンにしていけばよいだけで済みます。

殆ど全てのグループの適用をオフにし、その後オンにしました。中身を弄るのは、唯一列制約部分になります。

グループ集合は新たに次を作成しました。

スタッフプロパティで夜勤支援を追加し、動作を確認します。

何故かナース2人を許容しているのですが、そのケースはありませんでした。試しにナース二人を予定で勤務させましたが、その場合は確かにその通りになりました。原因はよくわかりませんが、ナース勤務が多忙であるとすれば、説明が着くかもしれません。

以上で、実装終了です。基幹となるシフトを変更すると、多数の箇所に影響を及ぼすのは、必然です。多くの制約でそのシフトを参照しているので、制約毎にオフしていくと何がなんだか分からなくなってしまいますが、グループのオフであれば、何とか記憶の範疇ではないでしょうか? 

しかし、上のようにすれば、それほど手間ではありません。

その他にもタスクを用いる方法、Pythonを用いる方法等を思いつきますが、多分、今回の方法が一番分かりやすいと思います。

=>早速、見て頂き、返信を頂きました。

ブログを拝見させていただき、修正版も確認しました。
こちらの希望通りの仕様となっており感動いたしました。
精読しましたところ私が混乱していたところが理解でき、また新たに勉強になった部
分もあり大変助かりました。

とのことで、安堵しました。これも、また嬉しいのは、どうだったかが記載されていることです。納得行く答えに辿りつくことが出来たかは、こちらも気になっているものです。
このようなお返事を頂くと大変ありがたいです。

してみると、最初の質問の仕方から、Closeに至るまで首尾一貫しているのは、相手に対する気遣いではないか?と思います。他人であり、普段の状況が分からない私に対して、分かりやすいようにご自分の問題を図示を駆使した説明することは、簡単なようで実は、難しいことです。

こうした、日本語能力の高さと言いますか、広く言えばコミュニケーション能力は、「制約を弄る」ということにおいて、重要な能力の指標だとも思います。「制約をする」とは、日本語で5W1Hを規定することに他なりませんから。

図示をするのは、面倒なことです。でもその作業をすることにより自分の考えをまとめることに繋がり、なおかつ、相手にも分かり易い説明になる、結局、一番早い問題FIX方法ではないでしょうか? と思った次第です。

対照的な例は、
で述べました。


私は、一次回答をするのに5分もかかっていません。問題を直ぐに理解できたからです。
鋭い方は、一次回答は、図示を言葉にしただけであることに気づくかもしれません。実際、図を見ながら、回答しました。言い換えると、ここまで記述できるなら、制約化できるまであと一歩のところだった、ということが言えます。

プロジェクトを修正するのに30分位、スクショを取りながらブログ文章を書くのに3時間位かかっています。他人に説明するということは、それだけ手間がかかるということです。しかし、その結果として、以降、今回の学習により同様の問題は独力でFIXできるようになる、という成果が得られます。

今回の問題は、比較的高度な、それでいてありそうな問題です。独力でこのレベルを操れるようになったならば、開発者として望外の喜びです。そして、こんなときは、こういう風にすればいいんだ、ということを皆さまには、頭の隅に入れてもらって何かの折に参考にして頂けたら、幸いです。