如何使用CPLEX Solver使用3d成本矩阵定义CVRP的目标函数?

时间:2019-11-18 16:08:19

标签: python cplex docplex

以下是https://medium.com/cmsa-algorithm-for-the-service-of-the-capacitated/using-cplex-and-python-for-finding-an-exact-solution-for-the-cvrp-ac789ee0d8c4的摘录,使用2d成本矩阵时,当然可以很好地工作:

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

但是,对于我的解决方案方法,我想使用3d成本矩阵,即每个元素都由c [i,j,k]表示,并且我希望将以下各项的总和最小化:

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

(长话长说。我从j到达k的成本取决于车辆来自(节点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>

有人可以帮助我定义目标函数吗?任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分: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))