a和b构成约束条件,用来约束决策变量。
一般求解线性规划问题采用 matlab中的linprog函数。基本函数形式为 linprog(c,A,b),它的返回值是
向量x 的值。还有其它的一些函数调用形式(在 Matlab 指令窗运行 help linprog 可以看到所有的函数调
用形式),如:
这里fval 返回目标函数的值,LB 和UB 分别是变量x 的下界和上界,x 0 _{0} 0 是x 的初始值,
OPTIONS 是控制参数。
通常的回归问题会采用最小二乘法解决。但是最小二乘法的有时候并不理想
其中 ϵ \epsilon ϵ为拟合值与真实值的偏差的大小。
为了建立线性规划模型,我们引入绝对离差的概念 。用d 1 i _{1i} 1i表示正离差,d 2 i _{2i} 2i表示负离差
(离差值均大于0)。则我们可以得到如下线性规划约束等式:
可以很容易推知,d 1 i _{1i} 1i+d 2 i _{2i} 2i就是第i组观测值y i _{i} i与拟合值之间的绝对离差。因此可以用线性规划问题解决绝对离差和的最小估计问题。
I n _{n} n为n阶单位矩阵
MATLAB代码求解如下:
clear all
x=[143,145,146,147,149,150,153,154,155,156,157,158,159,160,162,164]';
y=[88,85,88,91,92,93,93,95,96,98,97,96,98,99,100,102]';
n=ones(size(x));
Aeq=[n,x];
beq=y;
A=[];b=[];
k=length(x);
f=[0 0];
lb=[-100,-100];ub=[100,100];
for i=1:k%构造约束条件,和决策变量
p=zeros(k,2);
f=[f,1,1];
lb=[lb,0,0];
ub=[ub,100,100];
p(i,:)=[1,-1];
Aeq=[Aeq,p];
end
[d,fval]=linprog(f,A,b,Aeq,beq,lb,ub)
h=140:0.1:164;
g=d(1)+d(2).*h;
X=[n,x];
b=regress(y,X);%调用线性回归的regress函数
g1=b(1)+b(2).*h;
plot(x',y','*',h,g,'-',h,g1,'-','LineWidth',1);
legend('实际投点','绝对值偏差','regress函数')
grid on
x和y的值是网上找的一个线性回归问题的数据。决策变量一共有34个,前两个为我们所需要的拟合直线
的系数,后面的变量均为正负离差值。就是b 0 _{0} 0,b 1 _{1} 1,d 11 _{11} 11,d 21 _{21} 21,d 12 _{12} 12,d 22 _{22} 22,…
这是Aeq的数据结构如下:
这是f的数据结构:
前两位归为0,是因为我们的目标函数中没有用到拟合直线的系数。
结果如下:
这个题目的约束条件比较明了,关键是构造目标函数。从题意得出,一共有8种选择,记每种选择的成功概率为a i _{i} i,则根据概率论中独立事件的计算公式我们可以得到目标函数:
然而,线性规划只能接受线性的目标函数和约束条件,所以我们还要进一步将目标函数线性化。
这样就将问题转化为可以用matlab标准型求解的问题了。
代码如下:
pro=[0.1 0.08 0.2 0.16 0.15 0.12 0.25 0.2];
dist=[450 480 540 600];
oil=zeros(1,8);
for i=1:4
oil(2*i-1)=dist(i)/2+dist(i)/4+200;%算出每种选择的耗油量
oil(2*i)=dist(i)/3+dist(i)/4+200;
end
%[1重,1轻,2重,2轻。。。。]
pro1=log(1-pro);
f=pro1;
A=[1 0 1 0 1 0 1 0;
0 1 0 1 0 1 0 1;
oil];
b=[48;32;48000];
lb=zeros(1,8);
ub=100*ones(1,8);
[x,fval]=intlinprog(f,1:8,A,b,[],[],lb',ub')
k=1;
for i=1:8
k=k*(1-pro(1))^x(i);
end
realpro=1-k;
本文给出了线性规划的基本模型,和简单的求解方法。第一道例题侧重于约束函数的构造以及决策变量的构造技巧,第二道例题侧重于将非线性问题线性化。
参考文献:【1】线性规划在多元线性回归中的解法及应用。张爱兰,唐虹。昆明理工大学学报(自然科学版)39卷第1期,2014年2月。