Matlab 混合整数线性规划:如何生成约束?
我有一个目标函数,比如 为简单起见,我省略了系数 我希望使用具有以下约束的intlinprog最小化此函数: 及 用所有的x二进制。这些总和导致以下4个不等式: 很明显,Constants矩阵是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
如果我手动创建此矩阵,则效果良好。现在假设我的目标函数中有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。对于更复杂的模型来说不太容易,例如参见]。