python之贪婪算法

贪婪算法

贪婪算法也称为最优算法,这种算法并不是最准确的答案,但确认最接近答案的近似算法。

这时候有人会问,不是最准确的答案我要她干嘛?但是在日常中,我们有时候会遇到一些我们无法处理的问题,甚至是要花费成吨的资源也无法很好解决的问题

这时候我们可以考虑使用近似算法,来节约资源这种简单方法解决

假如我们现在很富有,家里有好多地皮造房子,这时候你需要找最少的施工队伍去帮我们同时造房子

用贪婪算法我们要做的非常简单,只要两步:

(1) 选出这样一个施工队伍,即可以覆盖了最多的未覆盖地皮。即便这个施工队伍覆盖了一些已覆盖的地皮,也没有关系。

(2) 重复第一步,直到覆盖了我家所有的地皮。

 

我用拥有["杨浦","徐汇","崇明","虹口","黄浦","普陀","闵行","宝山"]地皮,为什么用set集合呢,因为我们每个区里有好几处地皮,用set可以帮助我们去重

现在一共有4个施工队伍,每个队伍负责的区域如下我放在一个字典里

house_haved =set( ["杨浦","徐汇","崇明","虹口","黄浦","普陀","闵行","宝山"] )
constructionTeam = {"one":set(["杨浦","徐汇","崇明"]),"two":set(["崇明","虹口","黄浦"]),"three":set(["虹口","黄浦"]),"four":set(["虹口","普陀","闵行","宝山"])}

 创建一个用过存放最终结果的集合

final_teams=set()

 循环取队伍判断能覆盖最多未覆盖的地区的队伍

每次for循环结束把队伍加入到最终结果里,再从拥有的地皮集合中减去已经覆盖到的地区,一直到所有房屋都被覆盖了(house_haved为空)

取house_haved和team_cover的交集和best_covered比较, 循环出best_covered

while house_haved :
    best_team=None
    best_covered = set()
    for team , team_cover in constructionTeam.items():
        covered = house_haved & team_cover
        if len(covered) > len(best_covered):
            best_team = team
            best_covered = covered
    final_teams.add(best_team)
    house_haved -= best_covered

 

posted @ 2022-05-15 19:53  yetangjian  阅读(138)  评论(0编辑  收藏  举报