贪婪算法:集合覆盖问题
假设你办了个广播节目,要让全美50个州的听众都能收听的到。为此,你需要决定在哪些广播台播出。在每个广播台播出都需要支付费用,因此你力图在尽可能少的广播台播出。现有广播台名单如下:

每个广播台都覆盖特定的区域,不同广播台的覆盖区域可能重叠。

贪婪算法
贪婪算法可以得到非常接近的解。
选出这样一个广播台,即它覆盖了最多的未覆盖的州。即便这个广播台覆盖了一些已覆盖的州,也没有关系。
重复第一步,直到覆盖了所有的州。
这是一种近似算法(approximation algorithm)。在获得精确解需要的时间太长时,可使用近似算法。
# 首先,创建一个列表,其中包含要覆盖的州 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"]) # 最后,需要使用一个集合来存储最终选择的广播台 final_stations = set() while states_needed: confirm = None #当前循环已选中的最优广播台 count = set() #当前循环已选中广播台所包含最多的未被覆盖的州的州列表 #循环找出包含未被覆盖的州数量最多的广播台 for byroadcasting_station,states in stations.items(): covered = states & states_needed #当前广播台所覆盖的未被选中的州 if len(covered) > len(count): #true则刷新当前最优广播台和其包含的未覆盖的州 confirm = byroadcasting_station count = covered states_needed -= count #刷新未被覆盖的广播台 final_stations.add(confirm) print(final_stations)
浙公网安备 33010602011771号