Section 4 / 11
貪欲法の概要と使用場面
貪欲法(Greedy Algorithm)は、最適解を求める際に、部分最適解を選び続けることで全体の最適解を目指すアルゴリズムの一種です。この手法は、問題に対して局所的に最適な選択を行い、それを繰り返すことで最終的な解を導きます。貪欲法は、最適解が局所最適解の組み合わせで得られる場合に効果的です。
貪欲法の特徴
- 局所最適選択: 各ステップで最も良いと考えられる選択を行います。
- 部分問題の解決: 問題が複数の部分問題に分割できる場合に適用できます。
- 最適性の保証: 貪欲法が最適解を提供するかどうかは、問題によって異なります。
使用場面
貪欲法は、以下のような問題に広く使用されます。
- 最小スパニングツリー: グラフの全ての頂点を含む最小の辺の集合を求める問題(例: クラスカル法、プリム法)。
- 最短経路問題: 重み付きグラフにおいて、スタート地点からゴール地点への最短経路を求める問題(例: ダイクストラ法)。
- 活動選択問題: 与えられた活動の中から、重複しないように最大数の活動を選択する問題。
- コイン問題: 与えられた金額を作るために必要なコインの最小枚数を求める問題。
サンプルコード: コイン問題
ここでは、貪欲法を使ってコイン問題を解くサンプルコードを示します。与えられた金額を作るために使用する最小のコイン枚数を求めます。コインの種類は事前に定義されています。
def coin_change(coins, amount):
# コインを降順にソート
coins.sort(reverse=True)
count = 0
for coin in coins:
# 現在のコインで何枚使えるか計算
while amount >= coin:
amount -= coin
count += 1
return count
# コインの種類と金額を設定
coins = [1, 5, 10, 25]
amount = 63
# コイン問題を解く
result = coin_change(coins, amount)
print(f"最小のコイン枚数: {result}")
コードの解説
- 関数定義:
coin_change関数は、コインのリストと金額を引数として受け取ります。 - ソート: コインのリストを降順にソートします。これにより、大きいコインから順に使用していくことができます。
- ループ: 各コインに対して、現在の金額がそのコインの額面以上である限り、コインを使い続けます。使用したコインの枚数をカウントします。
- 結果の表示: 最終的に、使用したコインの枚数を返します。
このアルゴリズムは、コインの額面が特定の条件を満たす場合(例えば、1, 5, 10, 25のようなコインの組み合わせ)に、最適解を保証します。しかし、すべてのコインの組み合わせにおいて最適解を保証するわけではないことに注意が必要です。
まとめ
このように、貪欲法は特定の問題に対して効果的な解法を提供することができます。しかし、問題によっては最適解を求められない場合もあるため、問題の特性を理解することが重要です。次回は、分割統治法の基本とその応用について学んでいきましょう。