PuLP如何添加多变量大小关系约束解决类型报错问题
问题原因
- 第一次报错是两个问题叠加导致:一是
LpVariable构造函数的上下界参数仅接受固定数值常量,不支持传入其他决策变量——优化变量在求解前没有确定值,无法作为边界使用;二是代码存在循环前置引用,定义maa_count时引用的archer_count还未完成创建,把LpVariable对象传给要求传入数值的int()函数,必然触发类型错误。 - 第二次报错是因为PuLP没有实现Python原生链式比较的重载,且整数规划建模不支持直接用
>/<这类严格不等运算符写约束,这类运算符无法被解析为合法的线性约束表达式。
修复方案
- 第一步:单独定义所有决策变量,上下界设置为业务场景下的固定常量即可,比如所有兵种数量非负,上界设为你预估的单兵种最大可容纳兵力(例如10000,数值合理就不会影响求解结果)。
- 第二步:针对整数变量的严格大小关系做等价转换:对任意两个整数变量a、b,
a > b和a >= b + 1是完全等价的。把原来的链式比较拆成3个独立的非严格约束,逐个添加到模型中即可。
修复后的可运行代码示例:
# 1. 独立定义所有决策变量,上下界用固定常量,可根据实际业务调整上界值 maa_count = LpVariable("ManAtArmsCount", 0, 10000, LpInteger) archer_count = LpVariable("ArcherCount", 0, 10000, LpInteger) mangonel_count = LpVariable("MangonelCount", 0, 10000, LpInteger) cavalry_count = LpVariable("CavalryCount", 0, 10000, LpInteger) # 2. 拆分链式比较为独立等价约束 prob += maa_count >= archer_count + 1 prob += archer_count >= mangonel_count + 1 prob += mangonel_count >= cavalry_count + 1 # 其余目标函数、约束正常编写即可 army_count = archer_count + maa_count + cavalry_count + mangonel_count
若后续遇到连续变量的严格不等约束场景,线性规划本身不支持开区间约束,需要根据业务要求的精度设置极小偏移量转换为闭区间约束,例如
a > b可转换为a >= b + 1e-6。当前场景全为整数变量,偏移1的转换是完全严谨的,不存在精度损失。
内容的提问来源于stack exchange,提问作者sunnetcikesenmanyakpipi
相关产品推荐
相关产品推荐

