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
相关产品推荐
相关产品推荐

