DOcplex复现CPLEX ILOG目标函数遇IndexError问题求助
DOcplex复现CPLEX ILOG目标函数报错排查求助
问题背景
尝试在DOcplex中复现CPLEX ILOG的目标函数,但运行时持续报错,因不明确type_of_next()函数与索引的配合逻辑,调试受阻。目标是构建可添加至模型的目标函数表达式,后续将执行DARP_cp.add(DARP_cp.minimize(totDistance))。
CPLEX ILOG原代码
dexpr int totDistance = (sum(j in Jobs, v in Vehicles) Dist[j.id][typeOfNext(seqVeh[v], itvJ2V[j][v], j.id, j.id)]) ;
DOcplex复现代码
totDistance = DARP_cp.sum(distance_matrix[i][DARP_cp.type_of_next(x[k], zeta[(i,k)], i, i)] for i in range(nrows) for k in range(1, no_vehicles + 1))
错误信息
Traceback (most recent call last): File "C:\Users\bsraf3\OneDrive - Loughborough University\CPLEX TUTORIALS\DOcplex Tutorials\DARP\DARP_CP.py", line 115, in for i in range(nrows) for k in range(1, no_vehicles + 1)) File "C:\ProgramData\Anaconda3\lib\site-packages\docplex\cp\modeler.py", line 567, in sum_of arr = build_cpo_expr(x) File "C:\ProgramData\Anaconda3\lib\site-packages\docplex\cp\expression.py", line 2390, in build_cpo_expr return build_cpo_expr_array(val) File "C:\ProgramData\Anaconda3\lib\site-packages\docplex\cp\expression.py", line 2420, in build_cpo_expr_array cpval = _CPO_VALUES_FROM_PYTHON.get_or_create('array', val, normalize_value, _create_cpo_array_expr) File "C:\ProgramData\Anaconda3\lib\site-packages\docplex\cp\expression.py", line 2300, in get_or_create kval = kbldr(pexpr) File "C:\ProgramData\Anaconda3\lib\site-packages\docplex\cp\expression.py", line 2409, in normalize_value return _CacheKeyTuple(val) File "C:\Users\bsraf3\OneDrive - Loughborough University\CPLEX TUTORIALS\DOcplex Tutorials\DARP\DARP_CP.py", line 115, in for i in range(nrows) for k in range(1, no_vehicles + 1)) IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices
错误原因排查与修正建议
- 索引类型不匹配:
DARP_cp.type_of_next()返回的是CPO决策变量表达式,而非Python整数。直接用它作为distance_matrix的索引会触发错误,因为Python列表/数组仅接受整数类索引。 - ILOG与DOcplex逻辑差异:ILOG OPL会自动处理决策变量表达式与数组索引的绑定,但DOcplex中需要显式使用
element()函数关联决策变量索引和数组值。 - 代码修正示例:
totDistance = DARP_cp.sum( DARP_cp.element(distance_matrix[i], DARP_cp.type_of_next(x[k], zeta[(i,k)], i, i)) for i in range(nrows) for k in range(1, no_vehicles + 1) ) - 参数验证:确保
zeta[(i,k)]是对应任务的区间变量(与ILOG中itvJ2V[j][v]语义一致),x[k]是车辆的序列变量(对应ILOG的seqVeh[v]),且type_of_next()的参数完全符合type_of_next(sequence, interval, type, default)的签名要求。
内容的提问来源于stack exchange,提问作者Richlove Frimpong
相关产品推荐
相关产品推荐

