最优联盟结构

2024-07-03 07:37:28 发布

您现在位置:Python中文网/ 问答频道 /正文

问题如下:如果有一个集合S = {x1, ..., x_n}和一个函数f:set->;数字,它以一个集合作为输入并返回一个数字作为输出,什么是最好的联盟结构(联盟结构是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))

这是我发现的一篇论文: enter image description here


Tags: 函数gt模板returnisvaluedefoptimal
1条回答
网友
1楼 · 发布于 2024-07-03 07:37:28

我翻译了伪代码。毫无疑问,你可以做得更好。我正在仔细地挖掘,以显示这种联系

我确实修复了一个bug(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})
)

相关问题 更多 >