2025年4月21日月曜日

目的関数とは何か?

 最適化問題において最小化あるいは最大化する目的を関数で表現するもの

目的関数とは、最適化問題において最小化あるいは最大化する目的を関数で表現するもので、量的変数のこと。最適化問題や需要予測の計算の中で、最大化あるいは最小化したい関数のこと。

がCopilotの回答です。

<スケジュールナースの場合>

スケジュールナースの場合は、制約に対する違反の度合いを重みで表現し、その重みに対するエラー数を乗じた値の総和(下図)ということになります。



しかし、それは一般のナーススケジューリングにおけるモデル化の一つであって、別な目的関数が必要になることもあります。

例えば、塾講師の割り当て問題のように、塾の利益を最大化するには、単価の低い塾講師をなるべく割り当てる、みたいな最小化もあります。

<どういう勤務割り当てをしたら塾経営者は一番儲かるか?>

という問題を考えてみたいと思います。塾講師の1コマあたりの単価は決まっているとします。

ここでは、講師側のQOL(Quality Of Life)は考慮せずに、経営者側だけの都合で考えます。QOLに拘わるソフト制約はなしとします。

講師のコマあたりの単価表です。安藤は、カリスマ講師で単価が高いです。




シフトは、コマ数2,3,4しか存在しません。空き時間であっても指定シフトの支払いをするものとします。なので、各シフトに対するコストを設定します。

次のPythonコードで、コスト7*3=21種類のコストIndexを設定します。


Excelで並びを整えコピーします。



貼り付けします。


総コスト65700円が最適値として求まりました。Algorithm2で1秒でした。



結果は、


予想通り、コストの安い講師に集中して割り当てされていることが分かります。当然ですね。しかし、単価が高い上位3人は、全く割り当てられることがありません。経営者の儲けだけを考えた場合のモデルなので仕方ありませんが、契約的に問題となるので、実際的には、何らかのハード制約追加が必要でしょう。

例えば、土日の単価や、夜時間があったとしても自由にコストも変えることが出来ます。

また、シフトでのコストを求めましたが、空き時間には支払いをしないコマ単位でのモデル化も可能です。

<何を最小化したいか?>

私が扱う問題の殆どは、制約の違反に対するペナルティ重みの最小化という目的関数になります。しかし、上の例のように、それが目的関数ではない場合もあります。

仕様を頂いて、仕事がスタートするのですが、何を目的関数としたいのか?が曖昧だと、開発・設計そのものが出来ません。

仕様は、願望を書くことではありません。理想を書く場所でもありません。実績に基づくデータがあって初めて仕様は書けると思います。

■必ず実現すること ハード制約

■出来れば実現したいこと ソフト制約

■目的関数が明示されていること 何を最小化(最大化)したいか?

これらがセットになって初めて仕様です。ナーススケジューリング問題の場合、目的関数は自明です。そうではない問題の場合は、何を最小化したいですか?とお尋ねすることにしています。




0 件のコメント:

コメントを投稿