我有一个不平等和约束的系统:
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; =。
答案 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。