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

如何定义二进制变量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完全足够),该约束就会自动满足,不会触发不可行。

测试用例验证

  1. salary <89700:base=salary-89700<0,触发Y=1,supp的约束简化为supp≤89700且supp≤89700 - base*0.309(base为负,右侧大于89700),结合supp≥0,最优解为supp=89700,符合预期。
  2. salary=220000:base=130300<379900,Y=1,supp约束为supp≤89700 -130300*0.309≈50437,允许supp=49437的取值,符合测试用例。
  3. salary>399700:若base=salary-89700≥379900,则Y=0,supp被约束为0,模型可行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:50:23