You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:17:13