Как определить целевую функцию CVRP с трехмерной матрицей затрат с помощью CPLEX Solver?

Ниже приводится выдержка из https://medium.com/cmsa-algorithm-for-the-service-of-the-capacitated/using-cplex-and-python-for-finding-an-exact.-solution-for-the-cvrp-ac789ee0d8c4, что, конечно же, отлично работает при использовании 2-мерной матрицы стоимости:

#Intializing the set of arcs A.
A = [(i,j) for i in V for j in V if i!=j]
#Calculating the distance between each node.
c= {(i,j):np.hypot(loc_x[i]-loc_x[j],loc_y[i]-loc_y[j]) for i,j in A}
#Importing the docplex.mp.model from the CPLEX as Model
from docplex.mp.model import Model
mdl = Model('CVRP')
#Initializing our binary variable x_i,j
x=mdl.binary_var_dict (A,name='x')
#Initializing our cumulative demand u
u=mdl.continuous_var_dict (N,ub=Q ,name = 'u')
#Initializing the objectif function
mdl.minimize(mdl.sum(c[i,j]*x[i,j]for i,j in A))

Однако для моего подхода к решению я хочу использовать трехмерную матрицу стоимости, т.е. каждый элемент обозначается c [i, j, k], и я хочу минимизировать сумму:

c[i,j,k]*x[i,j]*x[j,k]

(Долгая история. Мои затраты на то, чтобы добраться до k из j, зависят от того, откуда прибыло транспортное средство (узел i); но я все же хочу, чтобы переменные решения были x_ij вместо x_ijk, потому что я хочу иметь ограничения как есть, т. Е. определен для x_ij.)

Я пробовал следующее:

# objective function    
mdl.maximize(mdl.sum(c[i,j,k])*x[i,j]*x[j,k] for i,j in A for j,k in A if i!=j)

Но я получаю следующее сообщение об ошибке.

DOcplexException: cannot convert to expression: <generator object <genexpr> at 0x000001BE51777348>

Может ли кто-нибудь помочь мне определить мою целевую функцию? Любая помощь будет оценена по достоинству. Спасибо!


person rc97496    schedule 18.11.2019    source источник
comment
Было бы намного проще помочь вам, если бы вы предоставили минимальный воспроизводимый пример.   -  person rkersh    schedule 18.11.2019


Ответы (1)


Похоже, в этом утверждении вы ошиблись круглыми скобками:

mdl.maximize(mdl.sum(c[i,j,k])*x[i,j]*x[j,k] for i,j in A for j,k in A if i!=j)

Первая закрывающая скобка не должна стоять сразу после c[i,j,k], а должна стоять в конце строки. Я думаю, что правильное утверждение таково:

mdl.maximize(mdl.sum(c[i,j,k]*x[i,j]*x[j,k] for i,j in A for j,k in A if i!=j))
person Daniel Junglas    schedule 19.11.2019
comment
Действительно! Извините, я был неосторожен, потому что не был уверен в своем подходе. Так что, видимо, все было правильно, за исключением неуместных скобок. Я уже пробовал дюжину способов сделать это, и каждый из них не удался, поэтому я так рад, что этот сработал. Большое спасибо!! - person rc97496; 19.11.2019