【问题标题】: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&gt;=0。这也意味着b 是非负数。剩下的含义a&gt;0 =&gt; b&gt;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.
      

      这一步取决于您,取决于您的问题。

      【讨论】:

        猜你喜欢
        • 2021-09-09
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多