Система целочисленных неравенств: подсчет решений - PullRequest
0 голосов
/ 21 марта 2012

У меня есть система неравенств и ограничений:

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).

Я хочу просто посчитать количество целочисленных решений для моих переменных (я не хочу на самом деле их решать). Я знаю, как использовать решатели для вычисления систем уравнений в матрицах, но обычно предполагается, что эти уравнения используют =, а не> =,>, <или <=. </p>

1 Ответ

0 голосов
/ 21 марта 2012

Вот удар.

Это ужасно неэффективно, так как я вычисляю декартово произведение двух векторов, а затем сравниваю каждую комбинацию кортежей.Это также не масштабируется за 2 измерения.

Кроме того, я беспокоюсь, что это не совсем то, что вы ищете, потому что я решаю каждое уравнение независимо.Если вы ищете все целочисленные значения, которые удовлетворяют 3-мерному пространству, ограниченному системой неравенств, то для меня это немного запутывает мозг, хотя и очень интересно.

Кто-нибудь на 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> Cval для Cval только на 100.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...