最適化問題をアニーリングマシンで解くということを現実の課題に適用する場合、最終的な目的は、最適化処理によってユーザの業務を改善することです。
ユーザが持つ現実の課題の要件定義を経て、定式化、そしてアニーリングマシンの実行と一連の流れの経験のある技術者であっても、要件定義に困難さを感じているようです。最適化処理の要件定義では、業務知識(ユーザが持つ専門知識)と最適化処理の知識(技術者が持つ専門知識)を互いに出し合い、解決へ向けて深く議論する必要があります。そのような場合においては、机上で最適化問題をアニーリングマシンで解くことでは直面し得ない様々な困りごとが起こります。
このコラムでは、厳密な話ではありませんが、最適化処理の要件定義ならではの困りごとを紹介し、実務をより身近に感じて頂ければと思います。
要件定義とは、システム開発などにおいてもよく使われる言葉です。どんなシステムを作る場合でも、まずはユーザがシステム開発によって何を実現したいかを開発者が把握し、検討項目を詳細化しながら、ユーザの業務に沿った必要な機能や性能、また予算やスケジュールを満たすための方針を固めます。要件定義が終わったらシステムの場合、外部設計と呼ばれる工程に進みます。
最適化処理の要件定義は、システム開発の場合とどのように違うでしょうか。システム開発では、ハードウェアやその制御ソフトなど、あらゆる機能を開発するため工数が膨大になることも多く、最初にできるだけ正確に要件定義することが求められます。
一方、最適化処理を行う際の要件定義は、一度で定義できない条件などもあるため、完璧でなくとも定式化、実行と進み、再び要件定義に戻るというアジャイル開発に近いやり方がうまくはまることが多いと言えます。
ユーザの業務要件を満たしながらアニーリングマシンの性能を最も効率的に引き出すことができる定式化を行うためには、要件定義→定式化→要件定義、また、定式化→実行→定式化というように、何度も最適化フローを回し、完成度を高めて行くことが望ましいのです。
COVID-19の流行により、日立の研究所でシフト勤務最適化を行った時はどのようなことがあったか、例として挙げてみましょう。出社人数を制限する必要がある一方で、実験のため出社が必要な人も多く、誰をいつ出社させるかを決める必要がありました。
当初は、部屋の人数上限を決めて、そこに各研究者の希望(この日は絶対実験したい、または、絶対というほどではないができれば実験したい、等)を入力し、アニーリングマシンを実行してシフトを決定する、という運用を始めました。
しかし実際に運用を始めてみると、一緒に働かせる人の制約(例えば、新人と指導員とか)、逆に一緒に働かせたくない人の制約(例えば、マネージャ2人が同時にコロナに罹ると困るので、同時に働かせない)といった希望が出てきました。また、勤務日は指定しなくてもいいが、週のうち少なくとも3日は勤務したい、といった希望も出てきました。
このように、研究者の希望をもとに新たな制約を取り込みながら、シフト最適化アプリがバージョンアップしていきました。
また、このようなイジングモデル化に関することだけヒアリングするのではなく、業務として運用するための調整も求められます。今回のケースでは1週間分のシフトを最適化により作成することになりましたが、前週の木曜日までにシフトがほしい、という人もいれば、一方で希望の提出を木曜日まで待ってほしい、と言う人も現れました。実際には、木曜の夕方に希望の入力を締め切り、翌日金曜朝にはシフトを公開しました。
このように、要件定義の段階では、最適化のための定式化だけではなく、業務で運用する上で必要な条件を考慮することが必要です。そうしてこそ実際に適用した時にユーザが「改善できた」と感じることができるのです。結果として、最適化処理の迅速さがあるからこそ研究所のシフト勤務が成立し、効果があるということを実証することができました。
イジングモデルのコスト関数を作るため、ユーザに「何を最適化したいか」をヒアリングしても、ユーザが即答しづらいケースもあります。たとえば、時間割の最適化をしたいユーザがいたとして、技術者が時間割というものを知らなかったとしたら、ユーザにこのように尋ねるかもしれません。
「制約はたくさん挙げてもらったのですが、最適化したい指標が何かをまだ聞いていません。あなたは何を最適化したいのですか?」
こう尋ねられてユーザはしばらく悩んだ後、「時間割を作りたいだけなのですが…。一体何が知りたいのですか?」と言いたくなるのではないでしょうか。
どういうことかというと、この技術者はイジングモデルのコスト関数を作りたいがために、最小化あるいは最大化したい指標を知りたがっているのですが、時間割問題というのは、制約ばかりの問題であることが多く、このユーザが作りたい時間割も〇〇を最大化したい、〇〇を最小化したいというような性質の問題ではなかったということになります。
さすがに時間割を知らない技術者はあまりいないので極端な例ですが、技術者が初めて見るような組合せ最適化問題をユーザから与えられることも考えられるため、ヒアリングの際は思い込みを捨てて挑むことが大事だと言えます。また、どのような最適化問題があるかという事例を蓄積し、世の中で共有していくことが重要ということがわかります。
今、アニーリングマシンの最適化技術の存在が世に知られるようになってきて、これまで人の手で組合せを考えていたような業務に、アニーリングマシンを適用しようとユーザが試みる機会が増えてきています。しかしアニーリングマシンで解くことをめざして要件定義を進めた結果、線形の問題であることが分かってくるケースもあります(詳細は、アニーリングマシンのための数学の項を参照)。
定式化したところ2次の項が出てこないのであれば線形問題であり、2次の項が出てきたのであればアニーリングマシンが得意、となることが基本ですが、解いてみて効果の度合いを比較してみないとなんともいえないということもあります。実行までしてみたけれど最適化手法を選定する段階に戻って始めから検討することも視野にいれて、最適化フローを回すことがプロジェクトを前進させます。
膨大なコミュニケーションを通じて多くの手がかりを得た成果である要件に対し、最適な手法を適切に適用することがユーザの価値に繋がるのです。色々な問題を経験することで、アニーリングマシンを効果的に使える問題がわかり、ユーザ価値だけではなく、世の中に貢献する新しい成果となる事例の創出に繋がることでしょう。
この記事はACWスキルロードマップの一部です。スキルロードマップを使ってACWを学んでみてください。
記事が役に立ちましたか?他の人に共有してみてください。
組合せ最適化を身近な組合せ最適化問題として分かりやすい2つの例を用いて解説します。また、IoT社会における組合せ最適化処理の高速解法の重要性について述べます。
COVID-19の流行に伴い、感染リスクを考慮した制約条件の下、研究員のシフト作成をアニーリングマシンで行うユースケースを紹介しています。
自然災害リスクに対応するため、保険会社が保有する膨大なデータを活用した再保険ポートフォリオ策定をアニーリングマシンで行うユースケースを紹介しています。
初級者向けに、アニーリングマシンで最適化問題を解く工程を、「課題整理と要件定義」「定式化」「入力データ作成」「アニーリングマシン実行」の4段階に分けて手順やポイントを解説します。
アニーリングマシンが得意とする問題の特徴である「二次」「離散」を中心に、知っておくべき数学的前提を易しく解説します。