Python でよく使われるアルゴリズム - 貪欲アルゴリズム (別名 greedy algorithm) をご存知ですか?

Python でよく使われるアルゴリズム - 貪欲アルゴリズム (別名 greedy algorithm) をご存知ですか?

貪欲アルゴリズム (または貪欲アルゴリズム) とは、問題を解決するときに、その時点で適切と思われる選択を常に行うことを意味します。つまり、全体的な最適解を考慮せずに、彼が導き出したのは、ある意味では局所的な最適解なのです。

貪欲アルゴリズムは最適な解を保証するものではありませんが、いくつかの問題では貪欲アルゴリズムの解が最適な解となります。貪欲アルゴリズムを使用して問題を計算できるかどうかを判断できる必要があります。貪欲アルゴリズムと他のアルゴリズムには明確な違いがあります。動的プログラミングでは、貪欲に選択するのではなく、常にすべてのサブ問題のソリューションを組み合わせて、現在の最適ソリューション(グローバル最適ソリューション)を取得します。バックトラッキング方式は、パスを選択しようとするものです。選択が間違っている場合は、「後悔」、つまり戻って別の選択を試すことができます。

[[280667]]

1. 変更の問題

店主が n 元のお釣りを返す必要があるとします。硬貨の額面は 100 元、50 元、20 元、5 元、1 元です。必要な硬貨の最小額を返すにはどうすればよいでしょうか? (注: 10 元という額面はありません)

お釣りが376元だったらどうなりますか?100*3+50*1+20*1+5*1+1*1=375

コードは次のとおりです。

  1. # tは店で入手できる小銭の額面を表します
  2. t = [100, 50, 20, 5, 1]
  3.   
  4. # nはn元を意味します
  5. 定義変更(t, n):
  6. m = [範囲(len(t))内の_の場合0]
  7. i, money in enumerate(t)の場合:
  8. m[i] = n // お金 # 割り算と切り捨て
  9. n = n % お金 # 割り算後の余り
  10. m, nを返す
  11.   
  12. print(change(t, 376)) # ([3, 1, 1, 1, 1], 0)

2 ナップサック問題

一般的なナップサック問題には、整数ナップサック問題と部分ナップサック問題があります。問題の説明は大まかに次のようになります。

泥棒が店でn個の品物を見つけました。i番目の品物はVi元の価値があり、重さはWiキログラムです。彼はできるだけ価値の高いものを持ち帰りたいと願っていますが、彼のバックパックには最大で W キログラムの物しか入りません。どの商品を持っていくべきでしょうか?

  • 0-1 バックパック: 製品の場合、泥棒はそれをそのまま持ち去るか、そのまま置いていきます。アイテムの一部だけを取ることや、同じアイテムを複数回取ることはできません(アイテムは金の延べ棒です)
  • 断片的なバックパック: 泥棒は製品のどの部分でも盗むことができます。 (商品は金砂です)

例:

0-1 ナップサックと分数ナップサックの両方で、貪欲アルゴリズムは最適なソリューションを得ることができますか? なぜですか?

明らかに、貪欲アルゴリズムは、小数点付きバックパックの最適解を確実に得ることができます。各アイテムの単位重量の値を計算し、降順で並べ替えてから、アイテムの取り出しを開始します。そのタイプのアイテムがすべて入る限り、すべてを入れることができます。すべてを入れることができない場合は、バックパックがいっぱいになるまでいくつか入れることができます。

この問題に関しては、0-1 バックパックがいっぱいにならないことは明らかです。偶然可能だとしても、すべての 0-1 ナップサック問題を満たすことはできません。 0-1 ナップサック問題 (整数ナップサック問題とも呼ばれる) は、2 つのタイプに分けられます。1 つは、各カテゴリのアイテム数が制限されている (制限されている) 問題です。 1 つは無制限で、好きなだけ取得できることを意味します。貪欲な戦略は、両方に使用することはできません。 0-1 ナップサックは、整数ナップサック問題の典型的な第 1 種です。

分数バックパックコードの実装:

  1. # 各製品タプルは(価格、重量)を表します
  2. 商品 = [(60, 10), (100, 20), (120, 30)]
  3. # まず商品を並べ替える必要がありますが、もちろんここではすでに並べ替えられています
  4. goods.sort(キー=lambda x: x[0]/x[1], 逆順= True )
  5.   
  6. # wはバックパックの容量を表します
  7. def fractional_backpack(商品, w):
  8. # mは各アイテムが何個取られたかを示します
  9. 合計_v = 0
  10. m = [範囲(len(商品))内の_に対して0]
  11. enumerate(商品)i、(賞品、重量)について:
  12. w >= 重量の場合:
  13. m[i] = 1
  14. total_v += 賞品
  15. w -= 重量
  16. # w>= weight の場合、m[i] = 1、そうでない場合はweight / w
  17. それ以外
  18. m[i] = w / 重量
  19. total_v += m[i]*賞金
  20. 0 です
  21. 壊す
  22. m、total_vを返す
  23.   
  24. res1、res2 = fractional_backpack(商品、50)
  25. print(res1, res2) # [1, 1, 0.666666666666666]
  26. 1.3 最大数連結問題

n 個の非負の数値があり、文字列と同じ方法で整数に連結されます。連結して最大の整数を得るにはどうすればよいですか?

たとえば、 32、94、128、1286、6、71 を連結すると、最大の整数 94716321286128 が形成されます。

注 1:文字列のサイズの比較は、整数のサイズの比較とは異なります。文字列のサイズを比較する場合、まず最初の桁を見て、大きい方が大きな数字になります。しかし、長い文字列と短い文字列をどのように比較するのでしょうか。たとえば、128 と 1286 をどのように比較するのでしょうか。

考え方は次のとおりです。

# シンプル: 2つの等しい数値を比較すると

  1. a = '96'  
  2. b = '97'  
  3.   
  4. a + b、もし a > b ならば、そうでなければb + a

# 比較する桁数が等しくない場合、貪欲アルゴリズムをどのように使用すればよいでしょうか?

# 考え方を変えて文字列を連結し、結果を比較します

  1. a = '128'  
  2. b = '1286'  
  3. # 文字列の追加
  4. a + b = '1281286'  
  5. b + a = '1286128'  
  6.   
  7. a + b の場合、a + b > b + aでなければ、 b + a

デジタルスプライシングコードは次のとおりです。

  1. functoolsからcmp_to_keyをインポートします
  2.   
  3. li = [32, 94, 128, 1286, 6, 71]
  4.   
  5. xy_cmp(x, y)を定義します。
  6. # 1はx>yを意味し、-1,0は同じ意味です
  7. x+y < y+xの場合:
  8. 戻り値1
  9. x+y > y+x の場合:
  10. -1を返す
  11. それ以外
  12. 0を返す
  13.   
  14. 定義 number_join(li):
  15. li = リスト(マップ(str, li))
  16. li.sort(キー=cmp_to_key(xy_cmp))
  17. 戻る  "" .結合(li)
  18.   
  19. 印刷(number_join(li)) # 94716321286128

4 活動選択の問題

同じ会場を占有する n 個のアクティビティがあるが、その会場は一度に 1 つのアクティビティのみが使用できるとします。

各アクティビティには開始時刻 Si と終了時刻 Fi (質問内の時間は整数で表されます) があり、アクティビティが間隔 [Si、fi) 内のスペースを占めることを示します。 (注:左が開いて右が閉じています)

Q: この会場で開催されるイベントの数を最大限に増やすには、どのような活動が必要ですか?

貪欲な結論:最初に終了するアクティビティは、最適なソリューションの一部である必要があります。

証明: a はすべてのアクティビティの中で最初に完了するアクティビティであり、b は最適ソリューションの中で最初に完了するアクティビティであると仮定します。

a=bの場合、結論は真である

a!=b の場合、b の終了時刻は a の終了時刻よりも遅くなければなりません。このとき、a は最適解の b を置き換えるために使用されます。a は最適解の他のアクティビティ時間と重なってはならないため、置き換え後の解も最適解です。

コードは次のとおりです。

  1. # タプルはアクティビティ(開始時刻、終了時刻)を表します
  2. アクティビティ = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 9), (5, 9), (6, 10), (8, 11),
  3. (8, 12), (2, 14), (12, 16)]
  4.   
  5. # アクティビティが終了時間順に並べられていることを確認します。まずは自分で並べ替えることができます。
  6. アクティビティ.ソート(キー=lambda x:x[1])
  7.   
  8. アクティビティ選択を定義します。
  9. # まず、a[0]は最初に終了する必要があります
  10. 解像度 = [a[0]]
  11. iが範囲(1, len(a))内にある場合:
  12. if a[i][0] >= res[-1][1]: # 現在のアクティビティの開始時刻が、最後に選択されたアクティビティの終了時刻以下である
  13. # 衝突なし
  14. res.append(a[i])
  15. 戻り
  16.   
  17. res = activity_selection(アクティビティ)
  18. 印刷(res)

5 最大部分列合計

最大サブ配列の合計を求める問題は、整数配列 (配列要素は負と正の両方) が与えられた場合に、連続するサブ配列の合計の最大値を求めることです。以下では、貪欲アルゴリズムを使用して 1 つずつ走査します。

コードは次のとおりです。

  1. def maxSubarray(li):
  2. s_max、s_sum = 0、0
  3. iが範囲(len(li))内にある場合:
  4. s_sum += li[i]
  5. s_max =最大値(s_max, s_sum)
  6. s_sum < 0の場合:
  7. s_合計 = 0
  8.   
  9. s_maxを返す

<<:  Googleの検索アルゴリズムがユーザーをより深く理解する方法

>>:  人工知能はデジタルマーケティング革命において否定できないトレンドとなっている

ブログ    
ブログ    

推薦する

AIがコンテンツマーケティングを進化させる方法

デジタル メディアはほぼすべての人の日常生活に浸透し、私たちのあらゆる活動に永続的な影響を及ぼしてい...

オイラー誕生!中国初の産業グレードのグラフディープラーニングオープンソースフレームワーク

[[255980]]ついに待望の登場です! Alibaba は、主要なオープンソース プロジェクトで...

AIと自動化により企業のクラウド移行が改善

COVID-19 パンデミックの影響で、2020 年末までに推定 60% の企業がワークロードをクラ...

...

Reverse Midjourneyがオンラインになりました!デジタルアーティストがスティーブ・ジョブズに魅了され、写真がボルヘスの精神世界に入る

ブラウザに住むアーティストが開発した、ニューヨーク発のAIカメラアプリが人気を集めている。もしスティ...

素人の私でも、機械学習コミュニティのこれらの問題が分かります

「分野が違えば意味も違う」とよく言われます。機械学習コミュニティは部外者から見るとどのように見えるの...

ニューラルネットワークの内部はどのようになっているのでしょうか?

ニューラル ネットワークは錬金術の炉のようなものです。大量のデータを入力すると、魔法のような結果が生...

持続可能なAI: イノベーションと環境責任のバランス

人工知能 (AI) は研究と産業の両方で驚異的な成長を遂げ、科学、医学、金融、教育など多岐にわたる分...

AI導入を成功させるために最も重要なスキル

実践により、人工知能 (AI) が適切に導入されなければ多くのリスクをもたらすことがわかっているため...

...

多くの場所で顔認証の削除が通知されました!人工知能業界は衰退するのでしょうか?

[[356436]] 「ブラックテクノロジー」の顔スキャンマシンを大量に購入する人がいる一方で、顔...

ChatGPT 技術製品の実装: 技術アーキテクチャから実際のアプリケーションまで

導入この共有では、ChatGPTテクノロジー製品の実装についてお話ししたいと思います。技術アーキテク...

5Gの導入により、インテリジェント交通は4つの大きな質的変化をもたらします。

現在、あらゆるToB市場において、5G+AIが並行して未来を創造しています。 [[331677]] ...

人工知能か、それとも人工的な愚かさか?予想外の大規模なアルゴリズムのロールオーバー

あなたはアルゴリズムを信じますか?答えが何であれ、私たちの生活はアルゴリズムによって完全に変わりまし...

...