【问题标题】:Optimal coalition structure最优联盟结构
【发布时间】:2021-04-14 18:59:57
【问题描述】:

问题如下:如果有一个集合S = {x1, ..., x_n}和一个函数f: set -> number,它将一个集合作为输入并返回一个数字作为输出,那么最好的联合是什么结构(联盟结构S的一组子集。即找到子集,使得S中每个子集s_if(s_i)之和最大)。联合中的集合不应重叠,它们的联合应为S。 一个模板是这样的:

def optimal_coalition(coalitions):
    """
    :param coalitions: a dictionary of the form {coalition: value}, where coalition is a set, and value is a number
    :return:
    """


optimal_coalition({set(1): 30, set(2): 40, set(1, 2): 71}) # Should return set(set(1, 2))

这是我发现的一篇论文:

【问题讨论】:

    标签: python algorithm math logic


    【解决方案1】:

    我音译了伪代码。毫无疑问,你可以让它变得更好——我非常仔细地观察以显示这种联系。

    我确实修复了一个错误(Val(C') + Val(C \ C') > v(C) 应该是 Val(C') + Val(C \ C') > Val(C),否则我们可能会用一个仅比所有 C 更好的分区覆盖最佳分区)和两个拼写错误(C / C' 应该是 C \ C';而CS* 是一个集合,而不是一棵树)。

    import itertools
    
    
    def every_possible_split(c):
        for i in range(1, len(c) // 2 + 1):
            yield from map(frozenset, itertools.combinations(tuple(c), i))
    
    
    def optimal_coalition(v):
        a = frozenset(x for c in v for x in c)
        val = {}
        part = {}
        for i in range(1, len(a) + 1):
            for c in map(frozenset, itertools.combinations(tuple(a), i)):
                val[c] = v.get(c, 0)
                part[c] = {c}
                for c_prime in every_possible_split(c):
                    if val[c_prime] + val[c - c_prime] > val[c]:
                        val[c] = val[c_prime] + val[c - c_prime]
                        part[c] = {c_prime, c - c_prime}
        cs_star = {a}
        while True:
            for c in cs_star:
                if part[c] != {c}:
                    cs_star.remove(c)
                    cs_star.update(part[c])
                    break
            else:
                break
        return cs_star
    
    
    print(
        optimal_coalition({frozenset({1}): 30, frozenset({2}): 40, frozenset({1, 2}): 69})
    )
    

    【讨论】:

    • 嘿!感谢您实现伪代码!无论如何,我需要它来做小例子,所以这里不需要性能。祝你有美好的一天!!! :)
    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多