【问题标题】:How to add a constraint to my optimization?如何为我的优化添加约束?
【发布时间】:2018-05-21 09:03:34
【问题描述】:
我正在制定一个优化问题,其中我有一个二维矩阵 A。
A= [0 f1 0 f2]
[f3 f3 0 0]
.........
我还有另一个二维矩阵 B 需要填充。 B 的大小与 A 相同。如果 a_ij=0(A 的元素),我需要 b_ij(B 的元素)为零,如果 a_ij 不为零,我需要 b_ij 大于零且小于或等于 a_ij。
我如何在我的公式中表示这一点?我已经添加了这个约束/条件:
b_ij<=a_ij
但这不满足当a_ij 不等于0 时b_ij 不等于0 的条件。有什么帮助吗?
【问题讨论】:
标签:
matlab
optimization
mathematical-optimization
linear-programming
【解决方案1】:
你想实现这个含义
a = 0 => b = 0
a <> 0 => 0 < b <= a
如果a 是(常量)数据,这是微不足道的。如果a 是一个变量,那么事情就不那么容易了。
您将部分含义实现为
b <= a
这意味着a 是非负数:a>=0。这也意味着b 是非负数。剩下的含义a>0 => b>0 现在可以实现为
a <= δ * 1000
b >= δ / 1000
δ in {0,1}
许多 MIP 求解器都支持指标约束。这会让你说:
δ = 0 -> a = 0
δ = 1 -> b >= 0.001
δ in {0,1}
【解决方案2】:
如果所有元素都是正数,则通过逐个元素比较来保留每个矩阵的最小元素:
B2 = min(A,B)
或者,创建一个逻辑矩阵,指示是否满足条件,并将元素与矩阵 B 相乘,只保留满足条件的元素,其他元素设置为零:
B = B.*(A~=0)
然后保留B中小于或等于A元素的元素,否则用A的值替换。
B = B.*(B<=A) + A.*(B>A) )
此选项可让您概括您的约束。
如果 a_ij 的元素大于零,您表示需要 b_ij 的元素大于零。一种选择是使用函数max 来确保B 的所有元素都是正数。
B = max(1e-2,B); % exact value is yours to set.
这一步取决于您,取决于您的问题。