数学规划模型
运筹学的一个重要分支,主要研究在给定的约束条件下,如何优化一个或多个目标函数的数学理论和方法。
数学规划的一般形式:
min/max z=f(x)
s.t. g(xi) <=0/g(xi)== 0........
x是决策变量,要求我们在约束的x的条件下求出一个满足要求的特定值
数学规划的分类
线性规划:目标函数和约束条件都是线性函数的数学规划问题。例如,在资源有限的情况下,合理安排生产计划以最大化利润,可表示为线性规划问题。
非线性规划:目标函数或约束条件中至少有一个是非线性函数的数学规划问题。比如,在设计一个化工反应过程时,由于反应速率等因素与变量之间可能存在非线性关系,就需要用非线性规划来优化设计。
整数规划:决策变量要求取整数值的数学规划问题。比如在人员分配、项目调度等问题中,人员数量、项目个数等通常是整数。若所有决策变量都要求是整数,称为纯整数规划;部分决策变量要求是整数,称为混合整数规划。
这里的整数规划还可以更进一步的分为线性整数规划和非线性整数规划
0-1规划:整数规划的特例,值只能取0或1
动态规划:用于解决多阶段决策过程最优化的数学规划方法。它把一个复杂的问题分解为一系列相互关联的子问题,通过求解子问题的最优解来得到原问题的最优解。例如,在资源分配、生产库存管理等问题中,可根据不同阶段的状态和决策来确定最优策略。
线性规划问题的求解:
第一步:数据转化为matlab的标准型:
C和x分别是系数和未知数的列向量
求的只能是最小值,如果原本是求最大值,就取负号
不等式约束:只能是AX<=b ,如果是大于等于就要取个负号
等式约束:lb<=下<=ub,这两个都是列向量
练习题"
第一题:
转换为如下的表示
没有等式约束
第二题
(注意这里的Aeq是横向向量)
第三题:
这里原本是求最大值,需要取反后去求最小值
第二步:matlab的函数求解
[x,fval]=linprog[C,A,b,Aeq,beq,lb,ub,X0]
线性规划的X0一般不用给,如果不存在等式/不等式约束,可以用[]代替字母
上下界约束如果没有可以不写,自动设置为对应的inf
这里的如果一个x没有上下界,那就设置为±inf
返回的x是取最小值的时候的X取值,fval是最小值
不是所有的解都是有无穷多的解的,可能无解/无穷多解
经典例题:
制定计划,让我们从两个料场向各个工地送多少的水泥使得我们的总的吨千米数最小
从A运往6个工地,共6个决策变量,从B运往工地,共6个决策变量
我们的目标函数是min Z=ΣX(i->j)* d(i->j) ,这里的i取A/B,j取[1,6]
这里的X(i->j)表示从i运往j的吨数,d(i->j) 表示距离,这里明显是已知的
a=[1.25 8.75 0.5 5.75 3 7.25]; % 工地的横坐标
b=[1.25 0.75 4.75 5 6.5 7.25]; % 工地的纵坐标
x = [5 2]; % 料场的横坐标
y = [1 7]; % 料场的纵坐标
c = []; % 初始化用来保存工地和料场距离的向量 (这个向量就是我们的系数向量)
for j =1:2
for i = 1:6
c = [c; sqrt( (a(i)-x(j))^2 + (b(i)-y(j))^2)]; % 每循环一次就在c的末尾插入新的元素
end
end
约束条件是 X(A->j)+X(B->j) =day j (这里的day j 表示j地的日需求量(等式约束)
Aeq = zeros(6,12);
for i = 1:6
Aeq(i,i) = 1; Aeq(i,i+6) = 1;
end
% Aeq = [eye(6),eye(6)] % 两个单位矩阵横着拼起来
beq = [3 5 4 7 6 11]'; % 每个工地的日需求量
同时ΣX(A->j) <= 20 ;ΣX(B->j)<=20 //表示各个料场的日储量(不等式约束)
A =zeros(2,12);
A(1,1:6) = 1;
A(2,7:12) = 1;
b = [20,20]';
上下界约束 决策变量非0
lb = zeros(12,1);
最后的求解
[x fval] = linprog(c, A, b, Aeq, beq, lb)
表示6个地方对应6行,第一列是从A运送的,第二列从B运送的
整数规划:
一类特殊的数学规划问题 ,在运筹学和优化理论中占据重要地位
定义与特点
定义:规划中的变量(部分或全部)限制为整数的数学规划问题。如果所有变量都限制为整数,则称为纯整数规划;如果仅部分变量限制为整数,则称为混合整数规划。
特点:与一般线性规划相比,整数规划增加了变量取整的约束条件,这使得问题的求解变得更加复杂。因为整数的离散性,不能简单地应用线性规划的方法求解。例如,在资源分配问题中,如果资源的分配数量必须是整数单位(如机器台数、人员数量等),就需要使用整数规划模型。
一个特殊的整数规划:0-1规划
分为线性整数规划和非线性整数规划
线性整数规划可以使用matlab进行求解
非线性整数规划只能使用近似算法求解如:蒙特卡洛模拟和一些智能算法
下面进行线性整数规划的问题
matlab的函数:
[x,fval]=intlinprog[c,intCon,A,b,Aeq,beq,lb,ub]
发现多一个intcon,而且不用指定初始值
intcon来决定那些变量是整数比如intcon=[1,3]就代表第一个和第三个是整数
如果是0-1规划,就在lb和ub上进行限制就好了
典型例题:0-1背包问题
很明显这里的变量只有0(不运)-1(运送)这两个变量,明显的0-1规划问题
所以我们的目标就是Max ΣXi*Pi
约束条件就是Σti*Xi<=30
变量的上下界是1和0,而且必须是整数
代码:
%% 背包问题(货车运送货物的问题)
c = -[540 200 180 350 60 150 280 450 320 120]; % 目标函数的系数矩阵(最大化问题记得加负号)
intcon=[1:10]; % 整数变量的位置(一共10个决策变量,均为0-1整数变量)
A = [6 3 4 5 1 2 3 5 4 2]; b = 30; % 线性不等式约束的系数矩阵和常数项向量(物品的重量不能超过30)
Aeq = []; beq =[]; % 不存在线性等式约束
lb = zeros(10,1); % 约束变量的范围下限
ub = ones(10,1); % 约束变量的范围上限
%最后调用intlinprog()函数
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
fval = -fval
fval=2410