クイック スタート - 貪欲アルゴリズム

目次

編集

序文

文章

基本的な手順

事例:ワイン替え問題

トピック

例 1

例 2

分析する

コード

要約する


序文

貪欲なアルゴリズムとしても知られる貪欲なアルゴリズムは、最良または最適なアルゴリズムにつながることを期待するために、選択の各ステップで現在の状態で最良または最適な (つまり、最も有利な) 選択をしようとします。

この記事では、貪欲なアルゴリズムをすぐに使い始めることができます。


たとえば、巡回セールスマンの問題で、旅行者が毎回最寄りの都市を選択する場合、これは貪欲なアルゴリズムです。

貪欲なアルゴリズムは、部分構造が最適な問題で特に効果的です。最適部分構造とは、局所最適解が大域最適解を決定できることを意味します。簡単に言えば、問題は部分問題に分解することで解決でき、部分問題の最適解は最終問題の最適解に再帰的になる可能性があります。

欲張りアルゴリズムは、各部分問題の解を選択し、後戻りできないという点で、動的計画法とは異なります。動的計画法は、以前の演算結果を保存し、以前の結果に従って電流を選択し、フォールバック機能を備えています。

アプリケーションでは、貪欲な方法は、グラフ内の最小スパニング ツリーの検索、ハフマン コーディングの検索など、いくつかの最適化問題を解決できます。

他の質問については、貪欲な方法は通常、私たちが求める答えを得ることができません。貪欲な方法で問題を解決できるようになると、一般的に貪欲な方法が問題を解決するための最良の方法になります。

貪欲な方法の効率が高く、得られた答えが最適な結果に比較的近いという事実により、貪欲な方法は補助アルゴリズムとして使用したり、不正確な結果を必要とするいくつかの問題を直接解決したりすることもできます。さまざまな状況で、最適解を選択するとシンプソンのパラドックスが発生し、最適解が表示されない場合があります。

文章

基本的な手順

ステップ 1 : 初期ソリューションから開始します。

ステップ 2 : 反復プロセスを使用して、目標に進むことができる場合、問題の規模を縮小するための局所最適戦略に従って部分的な解決策が取得されます。

ステップ 3 : すべてのソリューションを合成します。


事例:ワイン替え問題

トピック

近所のコンビニがセール中で、  numExchange  の空きワインボトルを新しいワインに交換できます。 numBottles のワインを購入し  ました。ボトルのワインを飲むと、ボトルは空になります。飲むことができるボトルの最大数を計算してください。


例 1

入力: numBottles = 9, numExchange = 3 出力: 13 説明: 空のワイン ボトル 3 本をワイン 1 本と交換できます。つまり、最大 9 + 3 + 1 = 13 本のワインを飲むことができます。

例 2

入力: numBottles = 15, numExchange = 4 出力: 19 説明: 空のワイン ボトル 4 本をワイン 1 本と交換できます。つまり、最大 15 + 3 + 1 = 19 本のワインを飲むことができます。


分析する

この質問における貪欲の次元は非常に明白であり、それは質問の表面に直接表れています。

つまり、すべての飲み物を飲んだ後、それは空のボトルになり、既存の空のボトルの後、飲み物の最大かつ貪欲な交換など、手元の空のボトルが飲み物のボトルを交換するのに十分でなくなるまで. .


コード

class Solution(object):
    def numWaterBottles(self, numBottles, numExchange):
        """
        :type numBottles: int
        :type numExchange: int
        :rtype: int
        """
        sumb = numBottles
        empty = numBottles
        while empty // numExchange:
            bottle = empty // numExchange # 兑酒数
            empty = bottle + empty % numExchange # 空瓶子数
            sumb += bottle

        return sumb

要約する

いわゆる貪欲なアルゴリズムとは、問題を解決するときに、常に現時点で最良の選択を行うことを意味します。つまり、全体最適性を考慮しないと、ある意味で局所最適解しか作られません。

貪欲なアルゴリズムには、固定されたアルゴリズムの枠組みがありません. アルゴリズム設計の鍵は、貪欲な戦略の選択です. 貪欲な戦略を使用する前提は、ローカル最適がグローバル最適につながる可能性があることです.

貪欲なアルゴリズムはすべての問題に対して全体的な最適解を得ることができず、選択された貪欲な戦略には後遺症があってはならないことに注意する必要があります。つまり、特定の状態の後のプロセスは前の状態に影響を与えず、現在の状態にのみ関連します。 (動的計画法とは異なります) . したがって、採用された貪欲な戦略が余効を満たさないかどうかを慎重に分析する必要があります。

おすすめ

転載: blog.csdn.net/flyTie/article/details/127130941