最適化一口話

仕事として数理最適化を実践している立場から、その中身や可能性について概説しております。

空白セルの圧迫と「ルール」の力

「一筆書き」のように、 答を見せられれば正しいかどうかはすぐにわかるけれど、 「白紙」の状態からそれを見つけるのはかなり難しい、 というタイプの問題は世の中には数多くあります。 数学的な話で有名なのは大きな数の素因数分解ですが、 ここまで抽象的な例を引っ張り出さなくても、選択式の試験よりも記述式の方が難しい、とか 日常的な感覚として了解できるところかなと思います。

じつはこの手の「一筆書き」的問題にアプローチできるという点が数理最適化という手法の特徴の一つと言えます。 次はマス目タイプのスケジューリング問題のデモンストレーションで、20人の一か月分のスケジュールですが、 水色のセルに(準日勤、日勤、準夜勤、当直、深夜勤、休日)のいずれかを入れる、 というのがここでの課題になります。 入力は、各日に各勤務を担当している人の合計人数(タテ計)と各人の休日数(ヨコ計)で 黄色い表の部分です。

f:id:optimizationTanabe:20160824121716p:plain

しかしこうしてみると水色の空白セルから受ける「圧迫感」はかなりのものです。 マス目タイプのスケジューリング問題は制約の数(表のタテヨコの和)よりも変数の数(表のタテヨコの積)が圧倒的に大きくなるのでやむを得ないことではありますが。実務家の方々が、毎月この空白セルを手動で埋めていると考えるとその労苦が偲ばれます。そんなところに数理最適化が現れてこんな答を書き込んでゆきました・・。

f:id:optimizationTanabe:20160824121756p:plain

ときにつっこみどころ満載ではありますが一応制約を満たす答ではあります。一つの結果があるとこれがいわゆる 'ice break' になって思考を前に進めることはできます。

こんなことを計算機がやるなんて、なんかちょっと不思議?

そうですね。 このシフト表を与えられて集計結果を出すのは計算機がごくあたりまえに行うことですが、 逆に集計結果しかない状況でシフト表を計算機に求めさせようとするのが数理最適化なのです。

データが潤沢に得られる「ビッグデータ時代」になって、 計算機ができることの質が格段に向上したのは確かなのですが、 だからと言ってデータが不足している場合に何もできないわけではありません。 データの不足は「ルール」で補うのです。上のケースでは、集計結果を合わせることと、 勤務種別に関する幾つかのルール(実は最初の二行に対応する人、1番さんと2番さんには日勤優先、としています)、 そして努力目標(休日の日数はできるだけ揃える)を与えるだけでかなりもっともらしい勤務表を導くことができています。

もちろん、「ルール」一辺倒で事足りるわけではないのは、大量データの解析を背景とした昨今の機械学習の応用の目覚ましい発展が教えるところであります。一般に「ルール」は各論的な話や明文化できないものに弱い。 ルールの目が粗すぎると結果が絞り切れてなかったり、 逆に細かすぎても前回議論したような実行不可能性が引き起こされて結果が出なくなってしまうこともあります。 そんなときには「ルール」に拘りすぎずに過去の勤務表の「データ」を使うのが最善の手です。 シフトの例で言えば、もし過去の勤務表がデータ化されているのなら、将棋のプログラムで使われているように 何等かの評価値(結果が前例のように尤もらしいか)を作成して、シフト生成の目的関数に利用する、といったことができます。数理最適化の立場としては「データ」あるいは「モデル」一辺倒ではなく、手に入る限りの「データ」と「モデル」両者から、うまく情報を引き出して要領良く適切な結果を得ることが現在の我々に求められていると言えるでしょう。

「実行不可能」との戦い

「メンバーは5人、勤務は日勤と夜勤の二種類しかありません」 今、小さな病院の担当の方に勤務シフト作りについて伺っています。 「毎日日勤は2人、夜勤は1人は必要です。夜勤空けは休み。それとは別に各人週に1日は休みを入れ、夜勤の担当回数は週あたり1日から2日です」 ここまではごく普通。 「新人の E さんは、ベテランのAさん、あるいはBさんとペアで夜勤に入れるようにしてください」良くある話ではあります。 「ベテラン二人は夜勤1日との約束になってます」了解。 モデルのタイプはまさにマス目埋め の典型で、要求を書き下すことに何の難しさもありません。 まずは、この5名(A,B,C,D,Eさん)一週間分の勤務シフト表を作ってみることにしました。

さて、「実行不可能」との戦いの始まりです。 なぜなら、この設定だとすべての制約を満足する勤務シフト表は作れないからです。

昔の数理最適化ソルバーの場合

古典的な数理最適化ソルバー(厳密解法)にこの条件を入力してみましょう。結果は

「実行不可能(エラー xx番)」

制約条件を満たす解が存在しないので、解析できない、という意味です。 制約を満たす中で最適な答を探すアルゴリズムにとって、 確かに想定外なのはわかるのですが、理由くらい教えてほしい。

「すいません、条件が厳しすぎて結果が出ないんですが」
「え?なぜですか」
「それが私にもわからないんです、でも数学的に答がないことはわかりました!」
「...」

前回に言ったような特殊ケースでなければ、これを喜んでくれるお客さんは居ません。

制約充足問題への変形

こんなとき古くから伝わる智恵として、制約を「努力目標」として記述し、 違反を零にできないまでも最小化する、という形(制約充足問題)に問題を変形する、という手があります。 制約充足問題をやはり古典的な分枝限定法による厳密解法で解いてみましょう。 今度は無事結果が出ました! 違反の最小値は 1、結果は以下です。夜勤明けを「-」で区別して表示しています。

f:id:optimizationTanabe:20160819032401p:plain

「一箇所違反が出てしまうようですが、結果出ました」
「でも、新人の E さんが一人で夜勤をやってしまってますけど..」
「だって、一箇所は違反が出てしまうのは数学的に仕方ないんです!」
「...」

「数学的」事実をタテに妙に強気に出てはなりません。 ここで「最適解は実は沢山あるかも」と気をまわしていたら、 次のような答え方になったかもしれません。

「Eさんの制約違反の重みを大きく設定すれば、違反しない解が出るかもしれません。
  大丈夫です。制約すべてに重みを設定できるようにすれば、お好みの解が自由自在です!」
「...」

がんばっているのはわかるのですが、制約はざっと 9 種類。 お客さんは結果が欲しいのであって、 こんな重みの調整に苦労するくらいならば自分でシフト表、作りますよね。

複数の答を出す(メタヒューリスティクスの適用)

今我々が持っている手段の中で最も訴求力がありそうなのは、 同じ目的関数の答を複数個出すこと。 アルゴリズムを古典的解法からメタヒューリスティクスに切り換えると実現できます。 例えば次のような感じの答が沢山得られます。

月曜に誰も夜勤をやらない解:

f:id:optimizationTanabe:20160819032501p:plain

ベテランの B さんやむなく週2回で夜勤をする解:

f:id:optimizationTanabe:20160819032524p:plain

何回か実行して出てきた解を分類すると、最初に出た「新人が単独勤務」解、 「どこかの日の夜勤担当なし」解、「ベテラン週2回」解、 が出るようです(私としては、いつか Web 検索のように、 これら候補解が違反量でランキングされて複数出すようにすればもっと数理最適化は馴染みのあるものになると思っています)。 どんな方向性の解が良いかはお客さんに選んでもらいましょう。 若干のお手数をかけますが、「完成品」の答を選ぶのは9個の重みを設定するよりも良い手段ではあります。 ここまでわかれば、あの deep-learning も及ばない人間知性の働きであるところの 「帰納的推論能力」のおかげでこの問題が解けない理由に気付くことができるでしょう。すなわち、 いずれかの日で(Aさん - Eさん)あるいは(Bさん - Eさん)の組みあわせで夜勤をしてしまうと、 残りの6日の夜勤を3人で担当せねばならない。 その 3人のうち一人は Aさんか Bさんなので、 合計して担当できる夜勤の回数は5回。要するに一日分足りないわけです。 Eさんが2回夜勤をするケースも考えられますが、これも C さん D さんが2人で5回の夜勤をしなければならないので無理、というわけでした。

ごく単純な制約でも組みあわせると相互作用して引き起こされる上、解消の方向性が一意ではない。 数理最適化を実務的に応用しようとする場合、 そのエネルギーの少なからざる部分がこの「実行不可能」との戦いに費される理由になっています。

「ない」ことを示す功罪

厳密に言おうとすると、答えが「ある」ということより「ない」ということの方が難しい。 「ある」ことは答を一個見つけてくればよいのに対して「ない」は網羅的に確認する必要があるから。そういえばあのフェルマーの大定理やリーマン予想もこのタイプの命題です。 ここまで高尚な話を持ちださなくても、なぜ探し物が大変かを考えてみればなんとなく実感できるでしょうか。ちょっと探して見つからなくてもひょっとすると自分の探し方が悪かったのではないかという疑念から根本的に逃れることはできません。要するに「ない」が厳密に言えないので結局探しつづけることになってしまうわけですね。

数理最適化は機械の腕力と数学の力(探し物に電波発振器でも付けるようなことに例えられるでしょうか) を使って、不完全ながらも条件が揃えば「ない」を厳密に示すことができる手法です。 厳密解法と呼ばれるアルゴリズムが「目的関数の最小値は 4 です」と言ったら、 4 よりも小さな答が存在しないことが裏付けとして得られたことになります (けれど、4を与える答は他にもあるかもしれないことはどうか、ご注意くださいませ)。

今年も配信が開始されましたが、CS進出ナンバーを求めるのに数理最適化が使われているのはご存知でしょうか。プロ野球の各チームがクライマックスシリーズ進出(3位以内)を確実にするために何勝すればよいかを求めるところにじつはこの「ない」の積みあげが元になっています。

具体的に説明しましょう。 あるチームの残り試合が 40試合になったとします。 40試合全勝したら少なくとも何位以上の順位が保証されるでしょうか、 まあ、理論的に最良の結果ですから良い順位なのは間違いありません。 ここで 30, 25, 20, .. と勝ち数の仮定を少なくしてゆくと、 最終的に保証できる順位は段々下がってくるはずです。 順位3位以上が保証できればクライマックスシリーズ進出が保証されるわけですが、ここで論理を反転させます。すなわちある勝ち数を仮定したときに4位以下に転落するシナリオが「ない」ことを数理最適化に示させて、クライマックスシリーズ進出の保証を行うのです。 例えば今日 2016/8/11 現在の広島のように19勝を仮定したときにめでたく「ない」が言えるのならば 19勝すれば3位以上に残れることは確実です。そして19が CS進出ナンバーであるかを知るため勝ち数の仮定をさらに減らして「ない」が言えなくなるぎりぎりを探します。さすがに今の広島と言えども 18勝まで減らすと4位以下になるシナリオが存在する。かくして19 がCS進出ナンバーとして出力される、というわけです。

このように数理最適化による「ない」という一見否定的な結論からも厳密な場合には非常に有益な示唆を引き出すことができるのです。が、いつでもそうとは限りません。 例えばマス目埋めタイプのシフト表作りのようなスケジューリングのモデルを作っているとき、 実務的なルールをどんどん取り込んだとして、 すべてのルールを充足する答は果たして存在するものでしょうか。 そんなの一般的にわかるわけない? ごもっとも。 ただ、私の経験の教えるところによると、ルールが数個を超えたとき、 それらが互いに矛盾しない答があることの方が稀です。 こんなとき数理最適化が答えが「ない」ことを示しても

「数学的に厳密に答がないことを言っているのだな、すごい」

と感心してくれるユーザーは存在しません。 次回はこういった場合にテクニックを駆使して「ない」をいかに「ある」に変えるか、 という話をしてみましょう。

最適化で何が実現できるのか(3)

判断材料を増やす

例えばスマートフォンを買うとして、契約プランの決定をする段になったとしましょう。 「利用量が 1G を超えないのならば基本料金お安め従量制のこのプランでしょうかね。 けど沢山使う方でしたらちょっと高いけど定額の契約もこんなにお得です。 ご家族と一緒に契約すると..」とかなんとか。滔々とおっしゃる窓口の方の前で相槌うちながらも内心すごく困っててプランの説明も細かいところはいつしか上の空。 なぜって「自分がどの程度利用しそうか」という最も重要な情報がないのだもの。 プランの説明はいいから「私ってその「沢山使う方」に見えますでしょうか」と聞きたいのが本音ではあります。

会社の業務としてこれと同様の判断を迫られる局面も多々あります。 例えば電力の購入先を変更する、アルバイトさんを新規採用する、大型のボイラーを購入する、 こういった投資を合理的に判断するときどうしても必要になるが得られないことが多いのは、 仮に投資が実行されたときにどういう使われ方をするのか、という情報ではないでしょうか。

実はこの「使われ方」を数理最適化の結果で埋める、という方法があります。 我々は例えば電力契約、プラントの機器、アルバイト人員などの場合を手掛けました。

  • 「需要予測を信じると電力プランを切り替えて、従量料金を払った方が得」
  • 「大きなボイラーを導入すれば、コジェネを有効に活用できメリットが出る」
  • 「ここにアルバイトの人が居てくれれば、社員が本来業務に集中できる」

いずれも業務に組み込んだとき、需要・既存の設備や人員と相互作用して結果が決まることなので、 数理最適化でも使わないとリアルな使われ方予測にならない。 大家さん蓄電池購入のケースはこのごく簡単な具体例になっています。一般に数理最適化は「最適に運用する・運用する」という強力な仮定があるので、 いわゆる「シミュレーション」と比べて外から与える情報が少なく済むのがメリットで、データ不足でも大丈夫。 ただ、あくまで「需要の予測」が正しく「最適に運用できた」という前提があることにはご注意ください。

コミュニケーションを促進する

実務の問題を解く数理最適化プログラムを作ろうとするならばその道のプロにまずは話を聞かせてほしい、とお願いするのが第一歩です。 「特に話すことはないよ」という前置きに続いて繰り出される情報はごく一部で数理最適化案件で言うと「仕様書」のレベルでしょうか。そこから実務家の意識下に埋まっている情報を掘り出す作業を開始するのですが、それには結果を出してダメ出しを受けるのが一番。その過程の中で「そういえば..」「言い忘れてたけど..」として溢れ出てくるこれらの情報は 実務家自身も驚くほど多いものです。 数理最適化の案件で我々が「チューニング」と呼んでいるプロセスはこのためにあります。

こうして実務家のノウハウをある程度(我々の経験値から言うと大体7,8割といったところです) 受け継いだ数理最適化プログラムができあがります。 これをエキスパート自身の居る部署での業務に使うのは普通として、 実は周辺の部署と方のコミュニケーションを促進するためにも使うことができます。 「いつでも聞いてください」と言ってくださる方でも忙しくてなかなか話を聞けなかったり、 あまりに簡単な質問をするのははばかられますが、プログラムならば大丈夫。 (その気になれば)中身だって見られる。 数理最適化プログラムは部署間のコミュニケーション解消の道具として活用するのもあるのです。

さてさて、数理最適化という道具が何ができるのかではなく、 今回あえて「その先」に話題を設定してみました。あくまでユーザーの方々側のお話しなので 我々は道具を提供したゆきがかり上近くに居ただけであくまで「観客」として見聞きしたことがほとんど。 例えば「公正さの追求」「コミュニケーション」といった側面は伺うまで意識したことはありませんでした。 このような事例を見聞きするのは私にとっての素直な喜びであり、 数理最適化の普及に向けての願いでもあります。

最適化で何が実現できるのか(2)

最適化でいろいろやった結果何が実現できているのか、という話の続きです。 どんどん行きましょう。

実行可能性チェックによる安心感

数理最適化という手法のメリットの一つに、出た結果は少なくとも制約式を満たしている、 ということが挙げられます。 実務的に複雑で重要な意思決定であるほど、それを計算機にさせるということには考えも及ばず、 本来は単純作業であるはずの制約式のチェックも含め、まるごと人が請け負うことになっている現場も数多くあります。 そんなときに数理最適化を導入してまず喜んで頂けるのは「最適かどうかはわからないけど、 とにかく実行可能をチェックした結果が出る」というポイントだったりします。

もっともらしい推測

前回から文章ばかりが続いていますので、ここではちょっと例を出しましょう。 次は 8時から18時まで操業している工場を出入りした人数です。

f:id:optimizationTanabe:20160729084305p:plain

工場から出た人数のうち、青いところがわからないので、 推測するという課題を解いてみます。 負の数や小数以外ならば何を入れてもありな気がしますが、 できるだけもっともらしくしたい。 方法の一つとして隣り合った前後でそんなに人数は急激に変化しないように、 すなわち青い部分が前後の時間帯の平均に近くなるように、 適当に数字を埋める、という手を思いつきました(どうやってやるのか気になる方へ:数理最適化でももちろんできますが、一次方程式を解けばできます)。 結果は次のようになります。

f:id:optimizationTanabe:20160729084349p:plain

グラフはこんな感じ。

f:id:optimizationTanabe:20160729084427p:plain

確かになんとなくもっともらしいのですが、この方法には欠点があります。 入った人数の合計が 474人なのに、 出ている人数の合計が 518人でつじつまが合っていません。 差の 44人を解消するにはどうすればよいでしょう。いくら推測とはいえ恣意的に手でいじるのは気が引ける。 こういう場合、数理最適化がもっと良い方法を提供します。 それは数字が従う事実を「制約」として組み込んでしまうのです。 この場合では工場のオープンとクローズ時の人数はゼロで、 工場に入った人は必ず出てゆき、消滅したり増えたりしない(「保存」)。 もっと細かく言うと例えば15時台に入った人はそれ以降の時刻に出てゆく、 時間を遡って13時台に出ることはありません。 細かくなるので述べませんが、この制約は 「保存」タイプ の数理最適化です。 この制約を満たしながら、人数が前後の時刻の平均に近いようにした結果が次(推測2)です。

f:id:optimizationTanabe:20160729084526p:plain

どうでしょう。確かに合計がちゃんと揃っています。 グラフで比較してみましょう。

f:id:optimizationTanabe:20160729145519p:plain

データが不足している状況でスタンダードな回帰など普通の統計的予測モデルを作ろうとしているとき、あまりに自由度が高く汎化性能の低いモデルができてしまう場合があります。 そんなときに有効なのが、例えば回帰だったら回帰係数に制約を入れるなど「モデルに構造を入れる」方法です。この例では人数の保存を表現する制約を入れたわけです。 数理最適化は追加する制約の自由度がかなり高く、このアプローチには有用な解析手法です。 得られる情報が増えると、予測の確からしさを増やすことができることもこのアプローチのメリットです。例えばこの工場のケースでは「工場における一人の平均滞在時間」が手に入ったと考えると、制約はもっと詳細化できて予測はより精緻になりますね。

また次回。この話題をもうすこし続けます。

最適化で何が実現できるのか(1)

最適化で「何をしているのか」と問われれば、 「運転計画」「スケジューリング」「配送計画」「ポートフォリオ最適化」 といった月並な答になってしまいますが、 ここでは数理最適化にこれらをさせることによって、 結局「何を実現しようとしているのか」という 「動機付け」そのものについて私の経験から拾ってお話してみたいと思います。

コストの削減

品質の要件を満たす製品をできるだけ少ない材料コストで作りましょう、 経路の長さ(輸送の費用)最小で所定の場所を巡回するルートを探しましょう、 在庫にある原材料を使ってできるだけ高く売れて利益の出る製品を作りましょう、 といった具合に数理最適化の教科書の例題はコスト削減や利益最大化を意図したものがじつに沢山あります。 また、単純な例題の結果もビーズの例のように、わずかでも得となると、購入先をすべて乗りかえてしまうといった単細胞なものなので、 最適化を冷徹なコストカッター、利益追求を極限まで突きつめるための技法、 と思われている方も多いと思います。

実際には、「コスト削減」だけを旨とした最適化はむしろ少数派なのです。 ただ、重宝されているのは確かで、 代表選手としてはネット広告配信(費用対コンバージョンの調整)があります。 設定が人工的で結果の評価軸が「コスト」「コンバージョン」の二つ、 という具合に少ないので数理最適化がうまくはまると言えるでしょうか。 また人間が介在することができないくらい大量の意思決定が必要、という特性も適用を後押ししています。 数理最適化がエネルギーの分野で適用例が多いのも、 この分野では「コスト」という尺度がかなり重要視されるところから来ていて、 プラントの運転最適化(需要予測に基いてプラントの機器の運転を決定する)という代表例があります。 ただ、この分野も「環境負荷軽減」という、 ときに「コスト」に対して真っ向から相反する尺度が入っていますので、 数理最適化一発で結果を求めるという風にならないことも多くなっています。

公正さの追求

人の割り当てといった業務は、人間の熟練者にはまずかないません。 夜勤の後に休暇を取るとか、月あたりの勤務時間の制約を守る、 とかいうのは満たせてあたりまえの話であって、大事なのはその先です。 休暇の間隔をなるべく同じにする、つらい業務を一部の人に偏らせない、 担当できる職務が一緒ならば担当回数が揃うようにする、 残業時間は賃金に直結するのでなるべく差をつけない、 など「平等であること」の追求は「働きやすい」職場の実現のために欠かせません。 一方で各人の立場に応じた割り当ても必要です。 例えば店長さんは掃除や棚出しなど、店の業務は何でもできますが、 通常はレジを担当していて棚出しするのは人繰りが逼迫しているのが自然ですね。 熟練者のスケジューリングは相反した要求が緊密なバランスの下に成りたっていて、 「アート」の領域だと言ってよいでしょう。

ただ、人間のやることなのでスケジュールを作成する人の癖による偏りは消せません。 そんなつもりがなくても、なぜ「俺は月曜に夜勤が多いんだろう」 「なぜ私の勤務希望は通りにくいのかなあ」とかいう疑問が職場の雰囲気に影響します。 機械が独立な立場で行うことで「公正さ」が実現する。 数理最適化が自動でスケジューリングを行う意図の一つはここにあります。

ただ、数理最適化は人間の「アート」を実装するためにかなりの苦労を強いられます。 この手のモデルはマス目埋めタイプを骨組としていますが、 平等性や自然さを実現するために、 他のメンバーがどのような勤務をしているかにも関連させたタイプの制約を多数入れる必要があります。 我々はお客様とのやり取りを通じて平等性や自然さの表現方法のコツを学びました。

熟練者のサポート

社会的にも大きなインパクトのある、お金にすると数億円以上といった 大規模な意思決定を毎日、業務として行いつづけている方がいらっしゃいます。 いつも驚くのはそのような決定を行っているのは、大人数のチームではなく、 かなり少数の熟練者の方々だということです。

実務的な最適化を業務としていて、 そういった方々とお話する機会が得られるのは私にとって最も嬉しいことの一つですが、 話を伺っていつも思うのは、彼らの頭の中には定式化されていないにせよ、 問題とその解き方が整理されているので、 数理最適化はまずそれらをトレースすることを旨とすべし、ということです。

解き方なんか聞かなくても問題の条件だけから数理最適化によってもっと「最適な」答が出る? それこそあまりにおこがましく、非科学的な態度というものでしょう。 数理最適化が考慮できるのはモデル化された数式の範囲だけ。 モデル化された定式もいつも 100% 解けるとは限らないのですから。 重要な意思決定に数理最適化が貢献できるとしたら、 ノウハウを数理モデルの形で明確化し、人手を煩わせないで結果を出すことができる、 という点においてです。 工夫次第で数理最適化は、熟練の実務者の7,8割程度の答なら出すことができます。 この答をリファレンスに使って後継者を育てる、とか 平常業務は機械に任せて、熟練者は人間ならではの難しい判断を要求されるイレギュラーなケースに対応する。 また、常に忙しい熟練者を煩わせないよう、 簡単な問いあわせならば数理最適化に答えさせるようにする、といった役割分担ができます。

3つ紹介しましたがいかがでしょうか、数理最適化にさせていることは多種多様でも、 「動機付け」については意外と共通している部分も多いのではないかとも考えます。 もうすこしあるのでこのトピックで続けてみましょう。

あれもこれも良くしたいのだけど..(2:重み調整に頼らない方法)

前回は数理最適化を使って、利便性と安全性を共に追求する地点を探そうとして目的関数を

(利便性重み)×(地点の利便性) + (安全性重み)×(地点の安全性)

という「重み付き平均」にしたは良いのですが、 候補になる土地の形が直線的なときにちゃんと「按分」された結果が出ないという話でした。

f:id:optimizationTanabe:20160714102055p:plain

重みの按分は上の図の青い点線の傾きに反映していて、 傾きが緩ければ A 地点が最適解(左の図)、きつければ B 地点が最適解(一番右の図)。 問題は利便性重みと安全性重みが同じ(真ん中の図)ケースで、 A 地点、B 地点とその中間地点がすべて「最適解」となってユーザーを襲います。

プログラム開発作法の文脈での数の数え方は「1 つ、2 つ、沢山」。未開の民族の言語みたいですが、要するに 3つ以上あるならば汎用化を意識しろという意味です。 実務的な数理最適化における最適解の数は「まれに 1 つ、普通は沢山、じつは無限個」。 「最適(最も良いもの)」という言葉の印象から我々は無意識に「最適解」は唯一だと思っているフシがありますが、この例に見るように最適解が一つに定まらないケースが結構あって、 最も基本的かつ強力な数理最適化である線形計画法でも出現してしまうのです。 上で無数の最適解が「襲う」と言いましたが、 同等の無数の解がある、ということがユーザーに「見える」わけではなくて、数理最適化ソルバーの都合で無数の最適解があってもそのうちのどれか一個が出てくるだけ。 さて、そんなときにユーザーとの対話を通じて無数の最適解候補を具体的に出力させる常套手段を紹介しましょう。

適当に軸になる目的関数の尺度(仮に安全性)を決め、 まず安全性だけで最適化、結果として得られる A 地点が持つ安全性の値("1" とします)をどこまで折り合えるか(例えば 0.8 とします)を考え、

安全性が 0.8 を下回らない中で、可能な限り利便性を最大化する

という問題を解きます。そうすると、結果として許される領域は小さくなって、 安全性が 0.8 を下回らない範囲で利便性を最大化した「地点 C」が最適解として出ます。

f:id:optimizationTanabe:20160714102120p:plain

あとは同様で、この "0.8" という値を変化させてこれを繰り返せば、 最適解のバリエーションが一つずつ出力されてゆきます。

f:id:optimizationTanabe:20160714102136p:plain

線形計画問題の答が按分された答になってくれないのは「シーソー」がわずかな重さの差でも必ずどちらがが上がり切ってしまうことに似ています。目的関数の重みは両側に載せる重しのようなものなのでここをいかに按分調整しても(完全に釣り合わせることができない限り)結果は二通りしか出てきません。

f:id:optimizationTanabe:20160714102211p:plain

ここで紹介した、制約を追加して探りを入れる、 という方法はシーソーの片側を手で抑えて、力を加減することに相当します。 こうすればシーソーを自然に任せた場合とは本質的に違う結果を見ることができる、というわけです。少々面倒ですがいろいろな状況で使うことができる汎用性が高い方法ですから、二つ以上の目的関数があるとき、重み調整の代替手段としてぜひご検討ください。