mathematical-optimization - 如何计算不同数量的决策变量 - 线性规划
问题描述
我有 5 个决策变量(比如)x1 - x5,每个的下限 = 5,每个的上限 = 30,它们只允许采用整数值。这些决策变量被用来计算毛利率(通过一些函数),目标函数是最大化毛利率。
现在,在为 x1 - x5 选择最佳值时,我有一个约束,即我不应该有超过 2 个(比如)x1 - x5 的不同值。
任何人都可以帮助我如何制定上述约束,即不同决策变量值的计数<= 2。我正在尝试在pyomo中构建程序。
谢谢你。
解决方案
有不同的方法可以对此进行建模。这是一个简单的方法。首先引入二进制变量:
y(i,k) = 1 if x(i)=k i=1,..,5, k=5,...,30
0 otherwise
这意味着我们可以写:
x(i) = sum(k, k*y(i,k))
sum(k, y(i,k)) = 1 for all i
链接 x 和 y。现在引入二进制变量:
z(k) = 1 if some x(i)=k
0 otherwise (actually we will allow 0 or 1 when all x(i)<>k, see below)
我们希望其中最多 2 个为 1。这可以简洁地表述为:
z(k) >= y(i,k) for all i,k
sum(k, z(k)) <= 2
请注意,这只是一个界限。我们有
y(i,k) = 1 ==> z(k) = 1
但实际上我们不需要:
y(i,k) = 0 ==> z(k) = 0
但这对于这种特殊情况来说已经足够了。因此,当打印 z 时,请注意它的值可能有点难以解释。
一些变量可以放宽为连续的。这可能会节省一些整数/二进制变量的数量。这是否对求解器有利并不总是很清楚,可能需要一些实验。
*更新:添加了缺少的约束
推荐阅读
- python - TypeError:无法将 str 连接到 google indexing API 的字节
- sql-server - 为什么 SQL Server UPDATE 查询只从源复制第一行,而不是从源复制所有行?
- javascript - Chrome 扩展如何使用列表/数组?
- gnu-make - 也在标准输出上显示 $(shell xx ) 命令的输出
- docker - 在生产环境中使用 Ubuntu 操作系统运行 docker for windows 进行本地开发
- html - 使用剪辑路径的弯曲背景图像
- sql - 不存在的多个连接和子查询
- go - 如何从 linux 交叉编译到 darwin 386?
- nginx - 通过 nginx 的 grpc_pass 的并发请求失败
- javascript - 如何在chrome中填写输入类型=范围?