2019年7月28日

説明:次のリファレンスです:[US]アーディティヤバルガヴァブック「グラフィックアルゴリズム」

貪欲アルゴリズム:各ステップは、グローバルな最適解を得るために、このようにしようと、局所最適解を見つけるために。

特長貪欲アルゴリズムはNP完全問題解決の近似アルゴリズムとして機能しますが、すべての場合には有効でないことができ、高速でシンプルかつ実装が容易です。

以下の貪欲なアルゴリズムに示されるように、1つの種類は、カバー近似アルゴリズムを設定します。

それは覆われていない状態(状態の数をカバーする放送局は、カバレッジを持っている場合でも、それは問題ではない)の大部分を覆うように(1)ラジオ局を選択します。

(2)繰り返し(1)の工程は、まで、すべての状態をカバーします。

問題を見つけるには問題、厳密解をカバーセットは、時間計算量は\(O(2 ^ N-)\) 貪欲アルゴリズムの時間複雑である\(O(N ^ 2)\) 前記\(N \)は、放送局の数です。

次のように貪欲なアルゴリズム上記のコードは次のとおりです。

# 首先创建一个集合,其中包含要覆盖的州
states_total = set(['mt', 'wa', 'or', 'id', 'nv', 'ut', 'ca', 'az'])

# 使用字典来存储每一个广播台以及它们可以覆盖的区域
# 键为广播台的名称,值为广播台覆盖的州
stations = {}
stations['kone'] = set(['id', 'nv', 'ut'])
stations['ktwo'] = set(['wa', 'id', 'mt'])
stations['kthree'] = set(['or', 'nv', 'ca'])
stations['kfour'] = set(['nv', 'ut'])
stations['kfive'] = set(['ca', 'az'])

# 使用一个集合来存储最终选择的广播台
final_stations = set()

# 算法的思路是每一次都在所有的广播台中寻找一个广播台,使得这个广播台能够在剩余的区域中覆盖的区域最大
# 直至剩余的区域为空,循环停止
# 前面的final_stations之所以使用set,是为了把重复找到的广播台自动过滤掉
while states_total:
    best_station = None # 每一次的best_station和states_covered都要重新设置
    states_covered = set()
    for station, states in stations.items(): # 字典的items函数以列表返回可遍历的(key, values)元组数组
        covered = states_total & states # 集合的与运算
        if len(covered) > len(states_covered): # 找到能覆盖区域最多的广播台
            best_station = station
            states_covered = covered
    
    states_total -= states_covered # 每一次找到局部最优的广播台后,总的区域都要减掉这个广播台可覆盖的区域
    final_stations.add(best_station) # 并将这个局部最优广播台添加到final_stations中
                                     # 这里要注意,set不能用+的方式添加新元素,只能用add方法

print(final_stations)

:NP完全問題について、あなたはを参照することができhttps://www.jianshu.com/p/dcb0b52f4935

NP完全問題の略:非決定性多項式、非決定性多項式複雑である問題。

Pクラス問題:すべての問題は、Pクラスの問題を構成する多項式時間で解くことができる決定します。

クラスNP問題:非決定性多項式時間の設定クラスNP問題のすべて解ける問題を決定します。

巡回セールスマン問題:アルゴリズムの時間計算量は目標のための数に強く依存する(\ O(N)!)\

すべてのソリューションを計算する必要、最適なものを選択し、そこから:巡回セールスマン問題と集合被覆問題を旅行NP完全問題は、彼らが共通して何かを持っている、ありますさ。

どこでもNP完全問題が、問題を判断するNP完全問題は難しいされていない、問題はNP完全問題点と相違点を解決することは容易である通常小さいですが、以下のメソッドは、問題がNP完全ではありません特定するのに役立ちます。

(1)の問題は、問題をカバーするか、セールスマン問題を走行セットに変換することができる場合、それは確かにNP完全です。

(2)「すべての組み合わせ」を参照して、一般的にNP完全です。

(3)小さな問題に問題になることはできません、我々はすべての可能なケースを考慮しなければなりません。これはNP完全であってもよく、

問題は、(例えば、無線局のコレクションとして)収集し、解決するのが困難に関連する場合(4)、それはNP完全問題であるかもしれません。

問題は、シーケンス(例えば巡回セールスマン問題、都市シーケンスなど)と解決が困難である場合(5)、それはNP完全問題であるかもしれません。

(6)非常に高速なアルゴリズム以下のランの要素は、しかし、要素数の増加に伴い、速度が非常に遅くなります場合は、NP完全であるかもしれません。

NP完全問題については、問題の迅速な解決策を見つけるためにまだ持って、ベストプラクティスは、近似アルゴリズムを使用することです。

おすすめ

転載: www.cnblogs.com/tbgatgb/p/11258679.html