読者です 読者をやめる 読者になる 読者になる

最適化一口話

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

最適化モデルの Hello, World

数理最適化の壁は最初の「モデル」を書く部分です。 教科書には「簡単な」モデルが書いてありますが、 なんか現実的ではないのが多いですよね。 部品が 3 つしかない 2 種類の製品を作っている工場の最適化、とか。 こんな高いソフト買って、できるのはそんな程度かね ? と言われては担当者の方も、作り手の我々も立つ瀬がない。

プログラミングの世界には使い手の最初の障壁を取り払うじつにすばらしい発明があります。 それは「Hello, World プログラム」。

// C++ 版
#include <iostream.h>
int main(int argc, char** argv)
{
    cout << "Hello, World\n";
}

端末に Hello, World と打ち出すだけなのですが、 少なくとも自分の指令で CPU を何ミリ秒かだけでも振り向かせることができたのだ、 という満足感があります。

この数理最適化モデル版は何なのかなあと考えて思いたったのがこれ(私がかかわっているソフトウエアのモデリング言語を使っているのはご容赦)。

IntegerVariable x(type=binary),y(type=binary),z(type=binary);// 0-1 変数
x + y + z == 1; // 品物 x,y,z のうちどれか一つ選ぶ
Objective cost(type=minimize); // コスト最適
cost = 400*x + 500*y + 350*z; // x,y,z はそれぞれ 400円、500円、350円
solve();

答は x = y = 0 で、z = 1。 思った通り「一番安い z (350円) を選びなさい」という結果がすぐに出て、 1つではなくて2つ選ぶときにはどうするのか、 満足度とのトレードオフを取るときにはどうするのか... とか話を広げてゆくことができます。 スモールスタートで問題を成長させてゆくのが 数理最適化モデル作りのプラクティスです。 ソフトウエアが人間との対話的なやりとりの中で人間の考えをどれだけ「引き出せるか」が勝負ですから、 変数を 0-1 (選ぶか選ばないか) にしてあえて「脱色」し 人間側の想像力を刺激するのも手かなと思いました。

余談ですが、ソフトウエア業界のいろんなバックグラウンドの方が この "Hello, World" をどう書くのかという古い ジョークがあります ( 私が好きなのは "Seasoned Hacker" と "Guru Hacker" )。 話のネタにどうぞ。python とかないし、若い方にはどういう意味なのかわからない部分もあると思いますが、 先輩の方にどこが面白いのか聞いてみるのも世代間交流になる? かもしれません。