Python MIP调用Gurobi添加二进制变量时报TypeError错误如何解决
问题原因
- 底层参数类型不匹配:Gurobi的C接口
GRBaddvar要求变量类型参数为单个字符的bytes值(二进制对应b'B'、整数对应b'I'、连续变量对应b'C'),但python-mip适配层直接对传入的BINARY常量做encode,若常量值为字符串"BINARY",encode后得到的是长度为6的bytes,不符合接口要求触发报错。 - 版本兼容bug:该问题为python-mip 1.15.x版本适配Gurobi 9.5及以上版本的已知问题,官方未在该分支修复。
注:报错堆栈指向name参数行是cffi参数校验的顺序显示偏差,实际问题出在vtype参数不符合要求
可行解决方案
- 方案1:替换变量类型入参为单字符
直接传入单字符表示变量类型,无需使用python-mip自带的类型常量,修改后的代码如下:
同理整数变量传m = Model(sense=MAXIMIZE, solver_name=GRB) x = m.add_var() n = 10 # 用单字符'B'代替BINARY常量 y = [ m.add_var(var_type='B') for i in range(n) ]var_type='I',连续变量传var_type='C'即可。 - 方案2:修改本地适配代码
打开报错提示的mip/gurobi.py文件,找到add_var函数中的vtype = var_type.encode("utf-8")行,替换为如下内容:
直接将变量类型映射为Gurobi要求的单字符bytes,无需encode处理。type_mapping = { "BINARY": b"B", "INTEGER": b"I", "CONTINUOUS": b"C", "B": b"B", "I": b"I", "C": b"C" } vtype = type_mapping.get(var_type, b"C") - 方案3:降级python-mip版本
安装无该兼容bug的1.14.0版本:pip install python-mip==1.14.0
内容的提问来源于stack exchange,提问作者beginner_python
相关产品推荐
相关产品推荐

