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

Python中OR-Tools求解0-1背包问题时目标函数报错如何修正?

报错原因

OR-Tools的Objective.SetCoefficient方法的系数参数仅支持Python原生的整数、浮点类型,你从pandas DataFrame中直接取出的字段值为numpy数值类型(如numpy.int64、numpy.float64),底层C++接口无法识别该类型,因此抛出类型错误。此前单系数版本正常运行是因为你当时使用的是Python原生数值,没有从pandas读取数据。

修复方案

你可以选择任意一种方式解决:

  • 方案一:直接修改目标函数代码,计算系数时做类型转换
# 修正后的目标函数部分
objective = solver.Objective()
for i in data['items']:
    for j in data['knapsacks']:
        # 转为Python原生浮点类型,整数系数也可以用int()转换
        coeff = float(data['days'][i] + data['time'][i] + data['priority'][i] + data['canc'][i])
        objective.SetCoefficient(x[(i,j)], coeff)                       
objective.SetMaximization()
  • 方案二:初始化数据字典时就将pandas列转为原生列表,从根源避免类型问题
# 修改data字典初始化部分的代码
data['ID'] = df.ID.tolist()
data['time'] = df.Time.tolist()
data['days'] = df.Days.tolist()
data['canc'] = df.Canc.tolist()
data['hdu'] = df.HDU.tolist()
data['priority'] = df['Priority'].tolist()

另外你代码中solver = solver = pywraplp.Solver.CreateSolver('SCIP')属于笔误,可以去掉重复的赋值,改为solver = pywraplp.Solver.CreateSolver('SCIP')即可。

内容的提问来源于stack exchange,提问作者JGW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:09:06