如何使用线性约束找到sum(xi)= b的所有整数解

时间:2016-04-22 11:45:11

标签: algorithm equation-solving integer-programming

假设sum(xi)= 10,0< = xi< = 2,i = 1,2,...,10。如何找到xi的所有整数解。谢谢。我读过关于欧几里德算法的文章,但它看起来只是两个未知变量。这里可以使用哪些算法。

3 个答案:

答案 0 :(得分:2)

如果您真的想拥有所有解决方案:通过一些优化递归枚举所有可能的变量赋值:

  1. 最后一个变量的值可以从总和约束计算
  2. 当您看到部分分配不再导致有效解决方案时(例如,如果总和已经大于10或者如果剩下的变量太少而达到10的总和),则可以修剪搜索< / LI>

答案 1 :(得分:1)

您正在寻找数字100的integer partitions的排列,其中每个整数分区都有

  • 最多10个部分;和
  • 每个部分最多15个。

当然有很多案例,但是10个!他们仍然可以通过电脑管理。

编辑:OP已编辑了问题,因此:数字10应分解为最多10个部分的整数分区,其中每个部分最多为2个。

答案 2 :(得分:1)

递归是最好的。以下是带有生成器的自然Python解决方案:

def solutions(variables, sum_left, max_value):
    if 0 == variables:
        if 0 == sum_left:
            yield []
    else:
        for i in range(0, max_value + 1):
            if sum_left < i:
                break
            else:
                for partial_solution in solutions(variables - 1, sum_left - i,
                                                  max_value):
                    yield [i] + partial_solution

for x in solutions(10, 10, 2):
    print(x)

生成器的好处在于您不必首先在内存中构建长列表。这是一个替代解决方案,它不使用生成器,也避免构建列表。

def do_something_for_solutions(variables, sum_left, max_value, known=None):
    if known is None:
        known = []
    if 0 == variables:
        if 0 == sum_left:
            do_something(known)
    else:
        for i in range(0, max_value + 1):
            if sum_left < i:
                break
            else:
                do_something_for_solutions(variables - 1, sum_left - i,
                                           max_value, known + [i])

def do_something(solution):
    print(solution)

do_something_for_solutions(10, 10, 2)

如果您选择退回解决方案,则可以按如下方式进行:

def solutions(variables, sum_left, max_value):
    if 0 == variables:
        if 0 == sum_left:
            return [[]]
        else:
            return []
    else:
        answer = []
        for i in range(0, max_value + 1):
            if sum_left < i:
                break
            else:
                for partial_solution in solutions(variables - 1, sum_left - i,
                                                  max_value):
                    answer.append([i] + partial_solution)
        return answer

for x in solutions(10, 10, 2):
    print(x)

(请注意,如果更改参数,该列表很容易变得很大......)