【问题标题】:Mixed-integer linear programming: How to generate constraints?混合整数线性规划:如何生成约束?
【发布时间】:2018-03-25 17:27:42
【问题描述】:

我有一个目标函数,例如

(为简单起见,我省略了系数)。

我想使用 intlinprog 最小化此功能,并具有以下约束:

所有 x 二进制文件。这些总和导致这 4 个不等式:

很明显,containts矩阵是

如果我手动创建此矩阵,则效果很好。现在假设我的目标函数和约束中有 6 个或 8 个或 10 个变量而不是 4 个(相同的模式)。如何使用 Matlab 为这些较大的问题生成这个约束矩阵?

【问题讨论】:

  • 对于更复杂的模型来说不是那么容易(例如参见[link])。

标签: matlab matrix optimization constraints mathematical-optimization


【解决方案1】:

我建议写一些其他的案例。因此,您似乎想约束所有行和和所有列和:

对于 N=3,有 9 个变量(我在这里假设为方形;您没有提供完整信息):

x00 x01 x02
x10 x11 x12
x20 x21 x22

现在约束矩阵如下:

x00 x01 x02 | x10 x11 x12 | x20 x21 x22
---------------------------------------
1   1   1
              1   1   1
                            1   1   1
1             1             1
    1             1             1
        1             1             1

这很正常。现在不是检查 matlab 的矩阵创建函数的时候了。可悲的是,我不是一个 matlab 用户,但是:

行的下半部分包括:

  • 水平堆叠 N 个单位矩阵,每个单位矩阵大小为 N

行的上半部分由组成:

  • 由 N 个 1 行向量组成的块对角矩阵,每个向量的大小为 N

最终的矩阵是两个组件的垂直堆叠

一个完整的稀疏矩阵 python 示例(抱歉,这里没有 matlab;但应该有接近 1:1 的映射),更清楚的是:

import numpy as np
import scipy.sparse as sp

N = 3
component_a = sp.hstack([sp.eye(N) for i in range(N)])
row_full_1 = sp.csr_matrix(np.ones(N))
component_b = sp.block_diag([row_full_1 for i in range(N)])  # matlab: blkdiag?
matrix = sp.vstack((component_b, component_a))

print(matrix.todense())

输出:

[[ 1.  1.  1.  0.  0.  0.  0.  0.  0.]
 [ 0.  0.  0.  1.  1.  1.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.  0.  1.  1.  1.]
 [ 1.  0.  0.  1.  0.  0.  1.  0.  0.]
 [ 0.  1.  0.  0.  1.  0.  0.  1.  0.]
 [ 0.  0.  1.  0.  0.  1.  0.  0.  1.]]

备注:取决于N,您需要考虑使用密集或稀疏矩阵。给定N,矩阵中非零的比例将为1/N

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多