整数不等式系统:计数解

时间:2012-03-20 20:43:28

标签: matrix

我有一个不平等和约束的系统:

Let A=[F1,F2,F3,F4,F5,F6] where F1 through F6 are given.
Let B=[a,b,c,d,e,f] where a<=b<=c<=d<=e<=f.
Let C=[u,v,w,x,y,z] where u<=v<=w<=x<=y<=z.

Equation 1: if(a>F1, 1, 0) + if(a>F2, 1, 0) + ... + if(f>F6, 1, 0) > 18
Equation 2: if(u>a, 1, 0) + if(u>b, 1, 0) + ... + if (z>f, 1, 0) > 18
Equation 3: if(F1>u, 1, 0) + if(F1>v, 1, 0) + ... + if(F6>z, 1, 0) > 18

Other constraints: All variables must be integers between 1 and N (N is given).

我希望只计算变量的整数解的数量(我不想实际解决它们)。我知道如何使用求解器来计算矩阵中的方程组,但这通常假设这些方程使用=而不是&gt; =,&gt;,&lt;,或者&lt; =。

1 个答案:

答案 0 :(得分:0)

这是一个刺痛。

这非常低效,因为我计算两个向量的笛卡尔积,然后比较每个元组组合。这也不会超过2个维度。

另外,我担心这不是你想要的,因为我正在独立地解决每个方程式。如果你正在寻找满足由不等式系统约束的三维空间的所有整数值,那么,这对我来说有点大脑弯曲,虽然非常有趣。

Python有人吗?

#sample data
A =[12,2,15,104,54,20]
B =[10,20,30,40,50,60]
C =[100,200,300,400,500,600]

import itertools
def eq1():
    product = itertools.product(B,A)  #construct Cartesian product of 2 lists

    #list(product) returns a Cartesian product of tuples
    # [(12, 10), (12, 20), (12, 30)... (2, 10), (2, 20)... (20, 60)]

    #now, use a list comprehension to compare the values in each tuple,
    # generating a list of only those that satisfy the inequality...
    #  then return the length of that list - which is the count
    return len([ Bval for Bval, Aval in list(product) if Bval > Aval])


def eq2():
    product = itertools.product(C,B)
    return len([ Cval for Cval, Bval in list(product) if Cval>Bval])

def eq3():
    product = itertools.product(A,C)
    return len([ Aval for Aval, Cval in list(product) if Aval>Cval])


print eq1()
print eq2()
print eq3()

此样本数据返回:
eq1:21
eq2:36
eq3:1

但是不知道如何将这些答案组合成所有3个单个整数计数 - 在列表之间会发生某种联合。

我的理智测试在等式3中,返回'1' - 因为只有当Aval = 104时它才满足Aval&gt; Cval仅适用于Cval。