【问题标题】:Subset Sum Problem with constraints and multiple inputs具有约束和多个输入的子集和问题
【发布时间】:2021-07-09 20:51:37
【问题描述】:

我正在尝试找出一种方法来在 python 中实现子集和问题,其约束条件是必须始终包含 Fixed 变量中的数字。

例如: 给定以下列表:

变量 = [1,2,3,4,5]

固定 = [6,7]

目标 = [20]

我需要知道 Variable 中哪个数字组合最接近目标 20(但不超过它),同时 Fixed 列表中的数字必须始终包含在总和中。

Variable 中的值的任意组合 + Fixed 中最接近 Target 的所有值

如果有多个组合与目标完全匹配或非常接近(具有相同的值),那么我可以只查看与条件匹配的第一个组合。

在上面的示例中,解决方案应该是 6+7+3+4 = 20

我已经尝试了下面的示例,它应该返回 3,但我没有得到。诚然,我是 python 新手,任何对我出错的地方的解释都将受到高度赞赏。

import pandas as pd

Fixed = pd.Series([3,2])
Variable = pd.Series([15,1,4,6,3,10])
Target = 8


def subsetsum(Variable,Target,Fixed):

    if Target == 0 or Target < 1:
        return None
    elif len(Variable) == 0:
        return None
    else:
        if Variable.iloc[0] == Target:
            return [Variable.iloc[0]]
        else:
            with_v = subsetsum(Variable.iloc[1:], (Target - (Variable.iloc[0]+Fixed.sum())),Fixed)
            if with_v:
                return [Variable.iloc[0]] + with_v
            else:
                return subsetsum(Variable.iloc[1:],Target,Fixed)

【问题讨论】:

  • 您能分享一下您尝试过的方法以及遇到问题的地方吗?
  • 我已经用我使用的代码编辑了我的原始问题。谢谢!
  • 这根本不是 pandas 的问题。您可以使用itertools.permutations 来返回您的Variable 列表的所有子集,然后它只是一个简单的sum20-sum(Fixed) 进行比较

标签: python constraints subset-sum


【解决方案1】:

这是一个不使用 pandas 的解决方案,在这里对您没有任何帮助:

import itertools

Fixed = [3,2]
Variable = [15,1,4,6,3,10]
Target = 8

def findAllSubsets( array, target ):
    answers = []
    for i in range(len(array)):
        for subset in itertools.combinations(array,i+1):
            if sum(subset) == target:
                answers.append( subset )
    return answers

print(findAllSubsets( Variable, Target-sum(Fixed)))

输出为 [3],这是您输入集的唯一答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多