如何定义二进制变量Y,使其在base达379900时从1切换为0?
解决二进制变量Y与base的约束问题及模型不可行修复
核心问题分析
你当前的base ≤ M * Y约束完全写反了逻辑:当Y=0时,这个约束要求base ≤0,但你需要的是base≥379900时Y=0,这直接导致矛盾,触发模型不可行。同时,你还缺少另一方向的约束来强制Y=1时base<379900。
正确的Y与base约束定义
要实现base≥379900 → Y=0且base<379900 → Y=1,需要添加两个大M约束,替换原来的base ≤ M * Y:
# 约束1:当Y=1时,强制base < 379900(连续变量用ε=1e-6,整数变量用379899) base ≤ 379900 - ε + M*(1 - Y) # 约束2:当Y=0时,强制base ≥ 379900 base ≥ 379900 - M*Y
参数说明
ε:极小正数(如1e-6),用于处理连续变量的严格小于;如果base是整数变量,直接将379900 - ε替换为379899即可。M:足够大的常数,需大于base的最大可能取值(比如假设salary最大为1e6,M=1e6 - 89700=910300即可,确保约束在不需要生效时自动满足)。
Supp约束的验证与调整
你的supp约束逻辑本身没问题,但需确保M取值足够大:
当Y=0时,第二个supp约束变为supp ≤ 89700 - base*0.309 + M,此时supp=0(由supp ≤89700*Y=0和supp≥0确定),只要M大于base*0.309 -89700的最大值(当base=379900时,这个值≈27689,所以M取1e5完全足够),该约束就会自动满足,不会触发不可行。
测试用例验证
- salary <89700:
base=salary-89700<0,触发Y=1,supp的约束简化为supp≤89700且supp≤89700 - base*0.309(base为负,右侧大于89700),结合supp≥0,最优解为supp=89700,符合预期。 - salary=220000:
base=130300<379900,Y=1,supp约束为supp≤89700 -130300*0.309≈50437,允许supp=49437的取值,符合测试用例。 - salary>399700:若
base=salary-89700≥379900,则Y=0,supp被约束为0,模型可行。
内容的提问来源于stack exchange,提问作者godfin
相关产品推荐
相关产品推荐

