线性规划
本文中,主要介绍基于matlab软件,解决数学建模或者生活学习中遇到的线性规划问题。
线性规划的定义
线性规划问题是一种数学优化问题,它的目标是在满足一系列线性不等式或等式的约束条件下,找到一个线性目标函数的最大值或最小值。线性规划问题通常可以用以下的标准形式来定义:
目标函数
一个线性函数,需要被最大化或最小化。在这个函数中,有且仅有一次函数,且不包含sin(),log(),1/x等,具体实例如下:
求最大与最小值是线性规划中最常见的问题
决策变量
决策变量为一组实数,即x1,x2,…,xn,如果在有非负性约束的情况下,比如工程完成的日期,购买物品的数量等,决策变量是非负实数。
约束条件
一组线性不等式或等式,这些约束条件定义了决策变量的可行域。约束条件通常由读者在题干中进行列举。
基于matlab求解
在matlab内,对于线性规划问题通常有两种求解方式,基于求解器求解和基于问题求解,下面对两种方法进行介绍
基于求解器求解–linporg()函数
下面,列举一个线性规划问题,基于求解器进行求解,题目如下
linprog函数
标准型
对于此问题,基于求解器求解时,需要注意将所有形式转化为标准型,标准型的含义为,目标函数求其最小值,约束条件均为小于等于,如果所得目标函数和约束条件并不是标准型,只需要加符号即可
在matlab内,基于求解器求解时应用linporg()函数,该函数参数如下
[
x
,
f
v
a
l
,
e
x
i
t
f
l
a
g
,
o
u
t
p
u
t
]
=
l
i
n
p
r
o
g
(
f
,
a
,
b
,
a
e
q
,
b
e
q
,
l
b
,
u
b
)
[x,fval,exitflag,output]=linprog(f,a,b,aeq,beq,lb,ub)
[x,fval,exitflag,output]=linprog(f,a,b,aeq,beq,lb,ub)
输入侧
符号 | 符号含义 |
---|---|
f | 目标函数的系数向量 |
a | 线性不等式约束的系数矩阵,每一行代表一个约束,列数与 f 向量相同 |
b | 线性不等式约束的右侧常数向量,与 a 的行数相同 |
aeq | 线性等式约束的系数矩阵,形式与 a 相同 |
beq | 线性等式约束的右侧常数向量,与 aeq 的行数相同 |
lb | 决策变量的下界,可以是向量或单个值,默认情况下所有变量的下界是 0 |
ub | 决策变量的上界,用法与 lb 相同 |
输出侧
符号 | 符号含义 |
---|---|
x | 优化问题的解,即决策变量的值 |
fval | 目标函数在 x 处的值,即最小化或最大化的目标函数值 |
exitflag | 表示算法的退出状态,1 表示算法成功找到了解,0 表示算法没有收敛,-1 表示迭代次数超过了预设的限制. |
output | 一个结构体,包含了算法的额外信息 |
下面利用求解器进行求解
clc; clear; % 界面初始化
f=[-2;-3;5]; % 目标函数系数,化为标准型
a=[-2,5,-1;1,3,1]; % 线性不等式约束的系数矩阵
b=[-10;12]; % 线性不等式约束右侧常数向量
aeq=[1,1,1]; % 线性等式约束的系数矩阵
beq=7; % 线性等式约束右侧的常数向量
[x,y]=linprog(f,a,b,aeq,beq,zeros(3,1)); % 最小是为0,即zeros(3,1)
x, y=-y %目标函数最大化
读者可根据所需解决问题对函数内的系数进行更改,但需要注意标准化。