欲張りアルゴリズム:学習の概要、および変更問題のPythonコードの実装

1.欲張りアルゴリズム

(1)いわゆる欲張りアルゴリズムとは、問題を解決するときに、現在のビューで常に最良の選択を行うことを意味します。言い換えれば、全体的な最適性を考慮せずに、彼が作成したのは、ある意味で局所的な最適解にすぎません。
(2)欲張りアルゴリズムは、すべての問題に対して全体的に最適な解を得るわけではありません。選択された欲張り戦略は、後遺症があってはなりません。つまり、特定の状態の後のプロセスは前の状態に影響を与えず、現在の状態にのみ関連します。

2.欲張りアルゴリズムの適用条件

(1)適用可能な前提:ローカル最適戦略はグローバル最適ソリューションにつながる可能性があります。
一般に、問題が欲張りアルゴリズムに適しているかどうかを分析するには、最初に問題の下にあるいくつかの実際のデータを選択して分析し、次に判断を下すことができます。

3.例-変更コインの最小数

(1)欲張りアルゴリズム

def changegdal(totalmoney):       #找零算法,一共用25、10、1三种面币大小
    numcoins = 0
    if totalmoney >= 25:
        numcoins += totalmoney // 25
        totalmoney = totalmoney % 25
        print(f'25分找了{numcoins}个')

    if totalmoney >= 10:
        numcoins += totalmoney // 10
        print(f'10分找了{totalmoney//10}个')
        totalmoney = totalmoney % 10

    if totalmoney > 0 & totalmoney < 10:
        numcoins += totalmoney
        print(f'1分找了{totalmoney}个')

    print(f'一共找硬币{numcoins}个')


changegdal(3)

(2)再帰呼び出し:

import time

def recMC(coinValueList, change):
    minCoins = change
    if change in coinValueList:
        return 1
    else:
        for i in [c for c in coinValueList if c <= change]:
            numCoins = 1 + recMC(coinValueList, change - i)     #加1,是因为后边调用自身减去了一个硬币
            if numCoins < minCoins:
                minCoins = numCoins
        return minCoins

def recDC(coinValueList, change, knownResults):
    minCoins = change
    if change in coinValueList:     #递归基本结束条件
        knownResults[change] = 1    #记录最优解
        return 1
    elif knownResults[change] > 0:
        return knownResults[change] #查表成功,直接返回最优解
    else:
        for i in [c for c in coinValueList if c <= change]:
            numCoins = 1 + recDC(coinValueList, change - i, knownResults)
            if numCoins < minCoins:
                minCoins = numCoins
                knownResults[change] = minCoins
    return minCoins


if __name__ == '__main__':
    #print(time.perf_counter())          #python3.8不推荐使用time.clock
    #print(recMC([1, 5, 10, 25], 63)
    #print(time.perf_counter())

    print(time.perf_counter())          #python3.8不推荐使用time.clock
    print(recDC([1, 5, 10, 25], 63, [0]*64))
    print(time.perf_counter())          #


おすすめ

転載: blog.csdn.net/qq_40797015/article/details/115186412