集合覆蓋問題與貪婪算法


貪婪算法的思想:每步都選擇局部最優解,最終得到的就是全局最優解。

近似算法:在獲得精確解需要的時間太長是,可使用近似算法。

判斷近似算法的標准:

速度又多快;

得到的近似解與最優解的接近程度;

貪婪算法是不錯的選擇,不僅簡單,而且通常運行速度很快。

集合運算:

並集運算:setA | setB

交集運算:setA & setB

差集運算:setA - setB

集合不包含重復的元素;

用最少的廣播台覆蓋最多的區域,不同廣播台覆蓋的區域可能重疊的問題:

def greedy(states_needed):
# 存儲最終選擇的廣播台
final_stations = set()

while states_needed:
# 存儲覆蓋了最多的未覆蓋州的廣播台
best_station = None
# 包含該廣播電台覆蓋的所有未覆蓋的州,for循環迭代每個廣播台,並確定它是否是最佳的廣播台
states_covered = set()
# 遍歷所有的廣播台
for station, states in stations.items():
# 求需要覆蓋的台的集合與廣播台覆蓋的州集合的交集
covered = states_needed & states
# 每次找出一個覆蓋州最多的廣播台
if len(covered) > len(states_covered):
# 保存當前的廣播台
best_station = station
# 保存當前覆蓋的州集合
states_covered = covered
# 更新需要覆蓋的州集合
states_needed -= states_covered
# 將找出的廣播台添加到最終集合
final_stations.add(best_station)

# print(final_stations)
return final_stations


if __name__ == '__main__':

states_needed = 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"])
print(greedy(states_needed))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM