python - 如何使用 CPLEX Solver 定义具有 3d 成本矩阵的 CVRP 目标函数?
问题描述
以下是摘自https://medium.com/cmsa-algorithm-for-the-service-of-the-capacitated/using-cplex-and-python-for-finding-an-exact-solution-for- the-cvrp-ac789ee0d8c4,当然,在使用二维成本矩阵时可以正常工作:
#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>
有人可以帮我定义我的目标函数吗?任何帮助将不胜感激。谢谢!
解决方案
看来您在此语句中放错了括号:
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))
推荐阅读
- python - Web3.eth:溢出错误:Python int 太大而无法转换为 C ssize_t
- linux - Linux 文件命令使用哪个系统调用?
- flutter - 颤振图表处理图例新闻
- ruby-on-rails - Rails reverse proxied by Nginx: change of origin problem
- node.js - Nodejs-cron for logging
- svelte - Svelte 获取当前 svelte 文件的所有属性
- android - 流星移动应用程序不适用于 android 9 和 10
- cmake - 如何使用命令行(CMake)跳过一些目标
- asp.net-core - child relationship not available in parent object
- ios - Apple App Site Association File for Multiple Apps