参考内容:
GNU Octave(version 6.4.0): Linear Programming
CVXPY/Scipy/Octave线性规划问题求解
线性规划问题的基本概括:在自变量有一条或多条限制时,求解一个含有该自变量的函数的最大值或最小值。
从这个概括中我们可以得到:线性规划问题要由一个目标函数和多个约束组成。我们要求解的就是目标函数在自变量受到各种约束时的最大值和最小值。
在我所学习的博客当中,博主举了这样的一个例子:
令目标函数是
下面给出约束:
(等式约束)
(不等式约束)
(不等式约束)
(变量约束)
(变量约束)
Octave可以通过glpk函数求解线性规划问题,即在约束的限制下,求解。其中和都是n×1的矩阵,是n×n的矩阵,n为自变量的个数。
函数格式:
[xopt, fmin, errnum, extra] = glpk(c, A, b, lb, ub, ctype, vartype, sense, param)
目标函数中自变量的系数,是一个n×1的矩阵。
如上述例子中,目标函数为,则
c = [-4, 1, 7]';
Octobe里面用’来表示转置。
多个约束中自变量的系数,是一个m*n的矩阵,其中m为约束的个数。
如上述例子中,约束为:
,则
A = [1, 1, -1;
3, -1, 1;
1, 1, -4];
行与行之间用分号分隔开。
多个约束中约束式右侧的值,是一个m×1的矩阵,要注意加转置。
如上述例子中:
b = [5, 4, -7]';
一个包含每个自变量下限的n×1的矩阵。如果没有提供lb,则所有变量默认的下限是0。
lb = [0, 0, 0]';
一个包含每个自变量上限的n×1的矩阵。如果没有提供ub,则所有变量默认的下限是无穷大。
(下面这个就是不提供的例子)
ub = [];
ctype共有五种限制表示方法,是一个长度为m(约束的数量)的字符串,从左到右依次表示第1,2,……m个约束中的符号。
F 一个自由(无界)的约束。(好像一般情况下用不到)
U 符号对应,如。
S 符号对应,如。
L 符号对应,如。
D 符号对应同时具有对称的上下限的不等式,如。
代表自变量的变量类型。
C 连续型变量。
I 整数型变量。
默认值为1。
sense = 1 取最小值,即求。
sense = -1 取最大值,即求。
一个包含以下参数的结构,用于定义解算器的行为。该结构中缺失的元素采用默认值,因此我们只需要设置我们希望从默认值中改变的元素。
个人认为,目前只有一个参数用得上,就是itlim。
单纯运算迭代限制。当进行了一次单纯的迭代后,它每次减少一个,达到零值时,求解器就会停止搜索。
单纯理解,我认为可以理解成一个精度的衡量标准。这个可以按照需求进行调整。
以itlim为例,调整参数的语句如下:
param.itlim = 10000;
优化器(决策变量在最佳状态下的值),即在最佳状态下,各个自变量的取值。
目标函数的最佳值,即我们所求的结果。
返回的错误代码。其中没有错误则返回0,有错误则会返回相应的代码,详见octave.org (v6.4.0) Linear-Programming。
一些我们所求的答案以外的辅助信息,详见octave.org (v6.4.0) Linear-Programming。
使用的例子为学习博客中所参考的例子,即最开始引用的那个例子。
c = [-4, 1, 7]';
A = [ 1, 1, -1;
3, -1, 1;
1,1,-4];
b = [5, 4, -7]';
lb = [0, 0, 0]';
ub = [];
ctype = "SUU";
vartype = "CCC";
s = 1;
param.itlim = 10000;
[xmin, fmin, status, extra] = glpk (c, A, b, lb, ub, ctype, vartype, s, param);
引用官方文档中的例子:
c = [10, 6, 4]';
A = [ 1, 1, 1;
10, 4, 5;
2, 2, 6];
b = [100, 600, 300]';
lb = [0, 0, 0]';
ub = [];
ctype = "UUU";
vartype = "CCC";
s = -1;
param.msglev = 1;
param.itlim = 100;
[xmin, fmin, status, extra] = glpk (c, A, b, lb, ub, ctype, vartype, s, param);