首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中执行约束-满意度

在Python中执行约束-满意度
EN

Stack Overflow用户
提问于 2014-08-31 15:28:35
回答 1查看 2.2K关注 0票数 2

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

我想得到最小的用户数,如果我把他们的集合合并起来,我将得到0n之间的所有数字集。

如果你想出了一种方法,让我给每个用户分配一个可变的价格(而不是像上面那样使用1 ),那么算法就会找到用户和最小总价的组合。

我见过在Python (就像这个)中处理约束满足的包,但是我不知道如何使用它们。如果他们能被用来做这个的话,太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-01 18:58:04

以下是PuLP/GLPK的解决方案。我以前从未使用过PuLP,但它在PyPI上,而且似乎完成了这项工作。GLPK是相当好和免费的。

代码语言:javascript
复制
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))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25593452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档