仕事に効くコンピュータサイエンス
大きい問題を小さく割る — アルゴリズム設計読了目安 10分

同じ計算を二度しない — 動的計画法

似たような問い合わせが月に何度も届きます。そのたびに一から資料を調べ直して回答を組み立てていないでしょうか。過去に同じような問いに答えた記録があるなら、それを使い回せば調べる時間はほとんど要りません。それでも多くの職場では、過去の回答は個人のメールの奥や、担当者本人の記憶の中にしか残っていません。このページの問いは、過去の答えをどう取っておき、どう再利用するかです。

動的計画法とは何か

動的計画法とは、大きな問題を解く途中で現れる部分的な答えを保存しておき、同じ部分の答えが必要になったときに、計算し直さずに保存したものを使い回す考え方です。名前だけ聞くと難しそうですが、中身はいたって単純です。この「保存しておいて使い回す」動作を、専門用語でメモ化と呼ぶこともあります。メモ化とは、一度計算した結果を控えておき、次に同じ入力が来たら控えを取り出して答えとする手法のことです。

なぜこの考え方が必要になるかというと、大きな問題を分割して解こうとすると、実は同じ形の部分問題があちこちで繰り返し現れることが多いからです。分割統治のページで見た「分けて解いて合わせる」という考え方は、分けた部分同士が完全に独立していることを前提にしていました。ところが実際には、分けた部分の中に同じ小さな問題が何度も登場することがあります。そのたびにゼロから解き直すのは無駄であり、一度解いた答えを保存しておけば、二度目以降は取り出すだけで済みます。動的計画法は、この「同じ計算の繰り返し」を狙い撃ちして省く考え方です。

図にすると、この違いがはっきりします。何も保存しない場合、同じ部分問題に出会うたびに、毎回最初から計算をやり直します。保存する場合は、一度目の計算の結果を控えておき、二度目以降はその控えを取り出すだけで済みます。

保存なし 毎回計算 毎回計算 毎回計算 保存あり 計算して保存 控えを使う 控えを使う

二回目以降の作業が「計算」から「取り出し」に変わる点が、動的計画法の効果の本体です。

仕事の言葉に訳すと

仕事の場面に置き換えると、動的計画法は「過去に一度考えて出した答えを書き留めておき、次に似た場面が来たら考え直さずにその答えを使う」という進め方になります。分割統治が「仕事を独立した部分に分ける」ことに主眼があったのに対し、動的計画法は「繰り返し現れる部分を見つけて、答えを使い回す」ことに主眼があります。似ているようで狙いが違います。分割統治は分け方の設計であり、動的計画法は保存と再利用の設計だと考えると、区別しやすくなります。

この考え方が仕事に効くのは、業務の中に「毎回ゼロから考えているが、実は前にも同じことを考えたことがある」という場面が驚くほど多いからです。同じ質問に何度も答える、似た見積もりを何度も作る、似た説明を何度もする。これらはすべて、部分的な答えを保存して使い回せば、かかる時間を大きく減らせる場面です。ポイントは、保存する対象を「その場限りのメモ」ではなく「次にも使える形」にしておくことです。個人の頭の中だけに答えを置いておくと、本人しか使い回せません。

「次にも使える形」とは、具体的には、誰が読んでも状況が分かるように書かれていること、いつ作った答えかが分かること、そして探したい人が見つけられる場所に置かれていることです。この三つが欠けると、保存したはずの答えが結局見つからず、また一から考え直すことになります。保存すること自体よりも、保存した答えを本当に取り出せる状態にしておくことのほうが、実務では難しいところです。

具体的な場面で見る

まず、問い合わせ対応でのFAQ化です。同じ質問に毎回ゼロから調べて答えるのではなく、一度出した回答を整理して残しておき、次に似た質問が来たときはその回答を取り出して使います。ここで大事なのは、回答をただ保存するだけでなく、「どんな質問のときにこの回答が使えるか」という見出しをつけて整理しておくことです。見出しがないと、保存した答えが増えるほど、探す手間のほうが大きくなってしまいます。

次に、見積もり作成のテンプレート化です。毎回、案件の内容に応じて一から積算をやり直すのではなく、過去の類似案件の内訳を土台にして、差分だけを調整します。似た規模・似た内容の案件が何度も来る業務では、この使い回しの効果が特に大きくなります。土台となる過去の内訳をどれだけ整理して残しておけるかが、次の見積もり作成の速さを決めます。案件ごとに内訳の書き方がばらばらだと、土台として使い回すこと自体が難しくなるため、書き方の型を先にそろえておく価値があります。

三つめは、資料の部品化です。説明資料の中でよく使うグラフや説明文を、独立した部品として保存しておき、次の資料を作るときに貼り込んで使います。毎回ゼロから図を作り直す代わりに、過去に作った部分的な答え(この場合はグラフや説明文)を再利用しています。部品を保存する場所を決め、誰でも取り出せる状態にしておくことで、個人の頭の中に留まらない使い回しが可能になります。よく使う部品ほど、保存する優先度を上げておくと、資料作成にかかる時間の削減効果が大きくなります。

落とし穴 — 古い答えをそのまま使う危険

動的計画法の落とし穴は、保存した部分的な答えが、状況の変化によって古くなっていることに気づかないまま使ってしまうことです。過去のFAQの回答を保存していても、料金や制度が変わっていれば、その回答はもう正しくありません。古い答えをそのまま使い回すと、間違った情報を伝えてしまいます。この危険は、記憶階層とキャッシュを扱った4章で見た「キャッシュ無効化」の問題と同じ構造を持っています。手元に置いた古い情報を、更新されたものと気づかず使い続けてしまう危うさです。保存した答えには「いつ時点の答えか」を必ず添えておき、定期的に見直す仕組みが必要です。

もうひとつの落とし穴は、繰り返し現れない問題にまで動的計画法を無理に当てはめてしまうことです。動的計画法が効くのは、同じ部分問題が何度も現れる場面に限られます。一度きりの特殊な案件について、わざわざ「次のために保存しておく」手間をかけても、二度目が来なければその手間は無駄になります。保存する価値があるかどうかは、「これは今後も似た形で繰り返し出てくるか」という問いで判断できます。繰り返し出てこないと分かっている作業にまで整理・保存の手間をかけるのは、動的計画法の誤用です。

三つめの落とし穴は、保存する粒度を誤ることです。細かすぎる部分ごとに保存しようとすると、整理する手間そのものが膨らみ、探すときにも該当する控えを見つけにくくなります。逆に大きすぎる単位で保存すると、少し条件が違うだけの案件に使い回せなくなります。ちょうど良い粒度は、「次に来る似た案件で、そのまま使える部分はどこまでか」を基準に決めると見極めやすくなります。

持ち帰り

  • 動的計画法は、一度出した部分的な答えを保存し、次に同じ場面で使い回す考え方です。
  • 保存した答えは、個人の頭の中でなく、次にも使える形で残す必要があります。
  • 保存した答えは状況の変化で古くなるため、いつ時点の答えかを添えて見直す仕組みが必要です。

やってみる

この一か月で二回以上似た形で答えた質問や作った資料をひとつ選び、次回のために保存しておく場所と見出し、そしていつ時点の情報かを、今日中に決めてください。