gpt4 book ai didi

python - 在 Python 中执行约束满足

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:14 28 4
gpt4 key购买 nike

假设我有许多用户,每个用户都有一组介于 0n 之间的数字。例如,一个用户可能有一组 {3, 7},另一个用户可能有 {7, 8, 9},等等。

我想获得最少数量的用户,如果我对他们的所有集合进行并集,我将得到 0n 之间的所有数字的集合>.

如果你想出一种方法让我为每个用户分配一个可变价格(而不是像上面那样使用 1)这样算法会找到具有最小值的用户组合,那么奖励积分总价。

我见过在 Python 中处理约束满足的包 (like this one),但我不知道如何使用它们。如果它们可以用于此,那就太好了。

最佳答案

这是 PuLP 的解决方案/GLPK .我以前从未使用过 PuLP,但它在 PyPI 上并且似乎可以完成这项工作。 GLPK 非常好而且免费。

from collections import defaultdict, namedtuple
from pulp import *


User = namedtuple('User', ('coverage', 'price'))


def solvesetcover(users):
vars = [LpVariable('x{}'.format(i), 0, 1, cat='Binary') for i, user in enumerate(users)]
prob = LpProblem()
totals = defaultdict(int)
for user, var in zip(users, vars):
prob += user.price * var
for elt in user.coverage:
totals[elt] += var
for total in totals.values():
prob += total >= 1
GLPK(msg=0).solve(prob)
return [user for user, var in zip(users, vars) if value(var)]


if __name__ == '__main__':
users = []
users.append(User({1, 2, 3, 4, 5, 6, 7}, 1.16))
users.append(User({8, 9, 10, 11, 12, 13, 14}, 1.08))
users.append(User({1, 8}, 1.04))
users.append(User({2, 3, 9, 10}, 1.02))
users.append(User({4, 5, 6, 7, 11, 12, 13, 14}, 1.01))
print(solvesetcover(users))

关于python - 在 Python 中执行约束满足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25593452/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com