前言
- 本文总结了优化类常见模型,包括:线性规划、非线性规划、多目标规划
- 涉及优化常见方法,包括:linprog函数,fmincon函数,蒙特卡罗法,序贯算法,optimvar和optimproblem函数等
- 缺点:没有实际例子
- 可以作为初学者的数模优化模型学习提纲
一、线性规划
三要素
- 决策变量:x,y…
- 目标函数:
max y=40x1+30x2
- 约束条件:
s.t....
,注意非负数
简介
- 适用:在一组线性约束条件下,求线性目标函数的最大值或最小值
- 条件:变量关系都是线性的,即不存在X2,ex,1/x,sinx,log2x等等
- 多目标线性规划模型:如果目标函数多个,则是多目标线性规划模型
适用赛题
- 生产安排
- 原材料、设备有限制,原利润最大
- 投资收益
- 涉及资产配置、收益率、损失率、组合投资,总收益最大
- 公式:风险率=投资额*损失率/总资产,收益率=收益/成本
- 辨析:如果要求“总收益最大”,一般可以用线性规划,如果要求“总收益率最大”,一般是非线性规划(c是负一次方 )(不绝对)。判断标准:看所有变量是否一次方
- 合理简化:对“总风险尽可能小”进行定值,转化为不等式,最后再模型改进,多次设定值;投资都大于额定投资费。
- 常见思路:固定收益,极小化风险;固定风险,极大化收益;赋予风险和收益相应权重
- 销售运输
- 产地、销地、产量、销量、运费,总运费最省
- 车辆安排
- 路线、起点终点、承载量、时间点,车次安排最合理
代码求解
- linprog函数
- 形式:
[x,fal]=linprog(f,A,b,Aeq,beq,lb,ub)
-
名称 含义 f 目标函数的系数向量 A,b 不等式约束条件的变量系数矩阵和常数项矩阵 Aeq,beq 等式约束条件的系数矩阵和常数项矩阵 lb,ub 决策变量的最小取值和最大取值 x 返回最优解的变量取值 fval 返回目标函数的最优值 - matlab标准型:模型的目标函数是求最小值、约束条件都是小于等于号或者等号(如果求最大值w,则是求-w的最小值,化为标准型)
二、蒙特卡罗法
简介
- 随机抽样,统计试验:当无法求精确解时,进行随机抽样,根据统计试验求近似解
- 适用:可行域过大,没有通用方法求出精确解
- 构成统计意义:抽样越多,越接近。
- 不同问题有不同的概率分布
- 如果有求精确解的方法,不要用该方法
代码求解
- 求pi的近似解思路
- 随机投点(循环)在2*2的正方形中(中间有半径为1的圆形),看在半径为1的圆形中点所占比例,4乘以比例即为pi
- 常用rand产生随机数
三、非线性规划
简介
- 适用:模型中至少一个变量是非线性
- 形式与线性规划类似
- 一般来说,只能求近似解:线性规划的最优解只存在于可行域的边界上;非线性规划的最优解则可能在可行域内的任意一点
适用赛题
- 比值问题
- 投资收益率,病毒传播率,经济增长率等
- 空间问题
- 空间运动:曲线、角度变换。常用三角函数、指数函数和变量比值等
- 角度选择:电影院最佳视角问题等
- 选址问题
- 已知坐标、运送物品,求如何设置新位置使运量最多/最省等等
- 点与点的距离公式属于非线性关系
- 合理假设:任意两点可以直达
代码求解
- fmincon函数
- 形式:
[x,fal]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nunlcon)
-
名称 含义 fun 单独脚本文件里定义的目标函数 x0 决策变量的初始值(影响最终结果) A,b 线性约束的不等式变量系数矩阵和常数项矩阵(<= Aeq,beq 线性约束的等式变量系数矩阵和常数项矩阵 lb,ub 决策变量的最小取值和最大取值 nonlcon 非线性约束,包括不等式和等式 x 返回理想的变量取值 fval 返回目标函数的理想值 - fun如果是同一文件的函数,写成:
@+函数名
- 可多次设不同初始值分别求多个解
- 蒙特卡罗法
- 选址问题的思路:在一定范围生成随机数(所有决策变量),判断是否近似满足约束条件,满足的和前一个满足的比较,循环取最值的x,以该x矩阵为初始x0带入fmincon函数,可以的到比单独使用fmincon函数更精确
- 其他方法:二次规划、罚函数法、梯度法等等
四、多目标规划
简介
- 适用:既要…,又要…,还要…等等
- 需要衡量每个目标的完成情况,如果存在冲突,要在主观上区分三个目标的重要性,使得整体的完成情况尽量好(确定优先因子pk)
- 约束分为:绝对约束、目标约束。目标约束允许有偏差
代码求解
- 正偏差变量:di+=max{fi-di0,0} 为实际值超过目标值的部分
- 负偏差变量:di-=-min{fi-di0,0} 为实际值未达到目标值的部分
- 运用偏差变量
- 不超过:min di+
- 不超过又不少于(且等权):min (di++di-)
- 不超过又不少于(且不等权):例min (2di++di-)
- 目标函数可以转化成为:偏差变量在优先因子加权下的和
- 多退少补:x1+x2>=18 等价于 x1+x2+di--di+=18,这样就可以把不等式化为等式,作为约束条件
- 优先因子
- 序贯算法中,优先因子只是用来区分目标的相对重要性,不需要具体数值
- 线性加权法中,需要确定具体数值,该方法过于简单、适用性小,不建议用
- 序贯算法
- 根据模型中各个目标的优先级(优先因子),确定各目标的求解次序
- 求第一级单目标规划的最优值
- 以第一级单目标等于最优值为新的约束,求第二级目标最优值
- 递推,直到所有目标都求完,或者不存在可行解为止
- 注意:优先因子只是用于确定求解次序,而非数值,防止主观性过大
- 使用matlab中的优化变量optimvar和优化问题optimproblem