Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 混合整数线性规划:如何生成约束?_Matlab_Matrix_Optimization_Constraints_Mathematical Optimization - Fatal编程技术网

Matlab 混合整数线性规划:如何生成约束?

Matlab 混合整数线性规划:如何生成约束?,matlab,matrix,optimization,constraints,mathematical-optimization,Matlab,Matrix,Optimization,Constraints,Mathematical Optimization,我有一个目标函数,比如 为简单起见,我省略了系数 我希望使用具有以下约束的intlinprog最小化此函数: 及 用所有的x二进制。这些总和导致以下4个不等式: 很明显,Constants矩阵是 如果我手动创建此矩阵,则效果良好。现在假设我的目标函数中有6个、8个或10个变量,而不是4个,并且约束模式相同。如何使用Matlab为这些较大的问题生成约束矩阵?我建议写下一些其他情况。因此,似乎要约束所有行和和和所有列和: 对于N=3,这里假设有9个变量为正方形;您没有提供完整的信息: x00 x0

我有一个目标函数,比如

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

我希望使用具有以下约束的intlinprog最小化此函数:

用所有的x二进制。这些总和导致以下4个不等式:

很明显,Constants矩阵是


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

我建议写下一些其他情况。因此,似乎要约束所有行和和和所有列和:

对于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个大小为N的1行向量的块对角矩阵 最后一个矩阵是两个组件的垂直堆叠

一个完整的稀疏矩阵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。

对于更复杂的模型来说不太容易,例如参见]。