数学规划是统筹学的一个分支,用来研究:在给定条件下(约束条件),如何按照某一行衡量指标(目标函数)来寻求计划、管理工作中的最优方案。
通俗的讲,就是求目标函数在一定约束条件下的极值问题。
min(或max):z = f(x)
x:决策变量(一般有多个自变量)
f(x):目标函数
不等式约束、等式约束、整数约束:约束条件
线性规划
非线性规划
整数规划
0-1规划
目标函数f(x)和约束条件均是决策变量的线性表达式。
注:linprog函数 只能求解最小值问题,最大值问题要在目标函数前加负号,转化为最小值问题,将结果 fval = - fval 即可。
目标函数f(x) 和 约束条件中存在决策变量的非线性表达式。
注:解决起来比线性规划困难,目前没有通用的算法,大多数算法都是在选定决策变量的初始之后通过一定的收索方法寻求最优的决策变量。
存在变量要求取整数值的数学规则,分为 线性整数规划 和 非线性整数规划 。
注:目前所流行的求解整数规划的算法往往只适用于线性整数规划。
[x,fval] = intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
% Matlab线性整数规划求解
% intcon 参数可以指定哪些决策变量是整数(行向量)。
0-1规划(0-1 programming)
整数规划的特例,整数变量的取值只能为0和1。
[x,fval] = intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
% 仍然使用线性整数规划的 intlinprog 函数,只不过在lb和ub上做文章。
% 0-1变量的 lb = 0, ub = 1。
在最不利的的条件下,寻求最有利的策略。
[x,feval] = fminimax(@Fun,x0,A,b,Aeg,beg,lb,ub,@nonlfun,option)
max(feval)
% 目标函数 Fun 用一个函数向量表示
% 其他变量与非线性规划相同
一个规划问题中有多个目标。
解决方案:对多目标函数进行加权组合将问题变为单目标规划。
[x fval] = linprog(c, A, b, Aeq, beq, lb,ub, x0)
% 仍然使用线性规划的 linprog 函数
% c中系数乘上了相应权重,并除以某一个常数(做标准化)
注:
多个目标函数统一为最大化或最小化问题后才可以进行加权组合。
如果目标函数量纲不相同,则需要对其进行标准化后再进行加权。标准化的方法一般是由目标函数除以某一个常数,该常数是指目标函数某个取值具体取值可根据经验确定。
对多目标函数进行加权求和时,权重需要由该问题领域的专家给定。实际建模比赛中若无特殊要求我们可另权重相同。
通过逐一改变相关变量数值的方法来解释关键指标受这些因素变动影响大小规律。
某化工厂今年拟生产两种新产品 A 和 B,其生产费用分别为 2 万元/吨和 5 万元/吨。这两种产品均将造成环境污染,每生产一吨 A 产品会产生 0.4 吨的污染,每生产一吨 B产品会产生 0.3 吨的污染。由于条件限制,工厂生产产品A和B的最大生产能力各为每月5吨和 6 吨,而市场需要这两种产品的总量每月不少于7 吨。该工厂决策认为,这两个目标中环境污染应优先考虑,且根据经验生产费用的参考值为 30 万元,污染量参老缜园试问工厂如何安排生产计划,在满足市场需要的前提下,使设备的花费和产生的污染均达最小。
%% 多目标规划
w1 = 0.4; w2 = 0.6; % 两个目标函数的权重 x1 = 5 x2 = 2
% w1 = 0.5; w2 = 0.5; % 两个目标函数的权重 x1 = 5 x2 = 2
% w1 = 0.3; w2 = 0.7; % 两个目标函数的权重 x1 = 1 x2 = 6
c = [w1/30*2+w2/2*0.4 ;w1/30*5+w2/2*0.3]; % 线性规划目标函数的系数
A = [-1 -1]; b = -7; % 不等式约束
lb = [0 0]'; ub = [5 6]'; % 上下界
[x,fval] = linprog(c,A,b,[],[],lb,ub) % 求解线性规划时使用 —— 目标函数和约束条件都是线性的
f1 = 2*x(1)+5*x(2)
f2 = 0.4*x(1) + 0.3*x(2)
%% 敏感性分析
clear;clc
W1 = 0.1:0.001:0.5; W2 = 1- W1;
n =length(W1);
F1 = zeros(n,1); F2 = zeros(n,1); X1 = zeros(n,1); X2 = zeros(n,1); FVAL = zeros(n,1);
A = [-1 -1]; b = -7; % 不等式约束
lb = [0 0]; ub = [5 6]; % 上下界
for i = 1:n
w1 = W1(i); w2 = W2(i);
c = [w1/30*2+w2/2*0.4 ;w1/30*5+w2/2*0.3]; % 线性规划目标函数的系数
[x,fval] = linprog(c,A,b,[],[],lb,ub);
F1(i) = 2*x(1)+5*x(2);
F2(i) = 0.4*x(1) + 0.3*x(2);
X1(i) = x(1);
X2(i) = x(2);
FVAL(i) = fval;
end
% 「Matlab」“LaTex字符汇总”讲解:https://blog.csdn.net/Robot_Starscream/article/details/89386748
% 在图上可以加上数据游标,按住Alt加鼠标左键可以设置多个数据游标出来。
figure(1)
plot(W1,F1,W1,F2)
xlabel('f_{1}的权重')
ylabel('f_{1}和f_{2}的取值')
legend('f_{1}','f_{2}')
figure(2)
plot(W1,X1,W1,X2)
xlabel('f_{1}的权重')
ylabel('x_{1}和x_{2}的取值')
legend('x_{1}','x_{2}')
figure(3)
plot(W1,FVAL) % 看起来是两个直线组合起来的下半部分
xlabel('f_{1}的权重')
ylabel('综合指标的值')