Как установить четырехмерную переменную в Docplex с Python? - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу установить двоичную четырехмерную переменную, например, X [a] [b] [c] [d], но в Bur docplex есть только функция binary_var_cube для установки трехмерности.Как я могу создать четырехмерность?Я обнаружил, что кто-то использует это для создания трехмерного и сказал, что он может распространяться на большее количество измерений. Но это бесполезно.

binary_var_dict((a,b,c) for a in ... for b in ... for c in ...)

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Вот ответ Даниэля Юнгласа, почти дословно скопированный из https://developer.ibm.com/answers/questions/385771/decision-matrices-with-more-than-3-variables-for-d/

Вы можете использовать кортежи любой арности в качестве ключей для доступа к переменным из словаря:

 x = m.binary_var_dict((i, l, t, v, r)
                       for i in types
                       for l in locations
                       for t in times
                       for v in vehicles
                       for r in routes)

Вызатем можно получить доступ к переменным с помощью:

for i in types:
    for l in locations:
       for t in times:
          for v in vehicles:
             for r in routes:
                print x[i, l, t, v, r]

Вы также можете использовать:

 x = [[[[[m.binary_var('%d_%d_%d_%d_%d' % (i, l, t, v, r))
          for r in routes]
         for v in vehicles]
        for t in times]
       for l in locations]
      for i in types]

 for i in types:
    for l in locations:
       for t in times:
          for v in vehicles:
             for r in routes:
                print x[i][l][t][v][r]

, но этот метод не поддерживает разреженные измерения и требует много дополнительных скобок для выражения.

2 голосов
/ 24 апреля 2019

Позвольте мне поделиться крошечным примером:

from docplex.mp.model import Model

# Data

r=range(1,3)

i=[(a,b,c,d) for a in r for b in r for c in r for d in r]

print(i)

mdl = Model(name='model')

#decision variables
mdl.x=mdl.integer_var_dict(i,name="x")

# Constraint
for it in i:
    mdl.add_constraint(mdl.x[it] == it[0]+it[1]+it[2]+it[3], 'ct')

mdl.solve()

# Dislay solution
for it in i:
    print(" x ",it," --> ",mdl.x[it].solution_value); 

, который дает

[(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 2, 1), (1, 1, 2, 2), (1, 2, 1, 1), (1, 2, 1, 2), (1, 2, 2, 1), (1, 2, 2, 2), (2, 1, 1, 1), (2, 1, 1, 2), (2, 1, 2, 1), (2, 1, 2, 2), (2, 2, 1, 1), (2, 2, 1, 2), (2, 2, 2, 1), (2, 2, 2, 2)]
 x  (1, 1, 1, 1)  -->  4.0
 x  (1, 1, 1, 2)  -->  5.0
 x  (1, 1, 2, 1)  -->  5.0
 x  (1, 1, 2, 2)  -->  6.0
 x  (1, 2, 1, 1)  -->  5.0
 x  (1, 2, 1, 2)  -->  6.0
 x  (1, 2, 2, 1)  -->  6.0
 x  (1, 2, 2, 2)  -->  7.0
 x  (2, 1, 1, 1)  -->  5.0
 x  (2, 1, 1, 2)  -->  6.0
 x  (2, 1, 2, 1)  -->  6.0
 x  (2, 1, 2, 2)  -->  7.0
 x  (2, 2, 1, 1)  -->  6.0
 x  (2, 2, 1, 2)  -->  7.0
 x  (2, 2, 2, 1)  -->  7.0
 x  (2, 2, 2, 2)  -->  8.0
...