matlab与常见算法_线性规划
开设新版块,关于matlab的一些常见问题解决,很多东西都是边学边整理的,大神勿喷求指导,3ks。
线性规划是规划类问题里面相对最简单的问题,如果你懒得听我啰嗦,google matlab函数“linprog”即可,它是解决线性规划问题的关键。
说简单是最优解的问题,经常遇到的工厂利益最大化,抽象出来约束条件和目标函数,求最优解。
matlab求解线性规划问题,在模型抽象好了,约束条件目标函数确定之后,用linprog这样的函数来完成求最优解,那先介绍一下这个函数。
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
函数的作用是用来求目标函数的最小解(注意是最小解min,matlab标准式规定求最小解,最大解问题须事先转换),参数由向量和矩阵组成(实际上这也是matlab最喜欢的)。
x:返回的最优x解向量,n维的。
fval:返回目标函数的值。
c:n维列向量,目标函数的表达式由c的转置与个未知数组成的列向量乘积组成。
A:适当维数的矩阵,每一行都是由一个不等式的未知数系数组成的向量。
b:适当维数的列向量,与A匹配,描述所有的不等式约束。
Aeq:适当维数的矩阵,区别于A,每一行由等式未知数系数组成的向量。
beq:适当维数的列向量,与Aeq匹配,描述所有的等式约束。
LB:x的下界 ; UB:x的上界。
OPTIONS:控制参数。
以上是linprog的完全体(数码宝贝?),平常的基本函数形式用的参数少,如:x = linprog(c,A,b)。matlab命令窗口输入help linprog 可看到详细解释。
简单举例:
求线性规划问题:
max y = 2a+3b-5c //目标函数 可得c'=[2,3,-5] x'=[a,b,c] 注意我用的是转置,因为c,x都是列向量。
a + b + c = 7 //等式约束条件可得Aeq=[1,1,1] beq=7 因为只有一个等式,Aeq只是一个行向量。
2a - 5b + c >=10 //不等式约束条件,需要化成<=的形式,下一个式子也是不等式约束条件。
a + 3b + c <= 12 //可得A=[-2,5,-1;1,3,1] b=[-10,12] A是两行三列的矩阵 b是列向量
a,b,c>=0
可编写简单的exercise.m文件实现:
c=[2;3;-5];
a=[-2,5,-1;1,3,1]; b=[-10;12];
aeq=[1,1,1];
beq=7;
x=linprog(-c,a,b,aeq,beq,zeros(3,1)); //zeros(m,n)是生成m行n列0矩阵 初始化用
value = c'*x ; // y最小值 c'为c的转置
disp(x);
disp(value); //打印
命令窗口执行文件即可。
线性规划的问题如果做到抽象出约束条件了,基本就等于完成了,难点在问题的转换上,不过以上是解决问题的基础必备。