前言:规划问题分为线性规划和非线性规划两大类,其中线性规划采用cvxpy库就可以解决;非线性规划分为凸规划和非凸规划,做题时应先判断是否是凸规划。对于凸规划采用cvxpy可以解决,非凸规划采用scipy.optimize中的minimize函数解决。每一个小节的实例及代码在参考书籍上都有,文章中就没有打出。
当然对于规划类问题,首推的还是lingo:lingo可以解决所有的规划问题,对于多目标规划化和Python一样无法直接求解,化成单目标即可。推荐学习视频:b站up:爆肝杰哥
Lingo建模基础入门_Savanna07的博客-CSDN博客_lingo中if函数的用法例题
参考书籍:《python数学建模算法与应用》 司守奎 孙玺菁 (强烈推荐!)
具体代码书上有写我就没有再敲出来
1、线性规划模型:求解优化问题(LP)
库:cvxpy numpy pandas
cvxpy是用于求解凸规划问题的库,在使用前必须要验证目标函数和约束条件都是凸函数,但对于线性规划可以直接使用。
步骤:
1、构造目标函数的系数向量、约束矩阵、常数向量(如果这三个都十分简单也可以不用构造矩阵,直接在下面的表达式中表达)
2、未知数:x=cp.Variable(n,pos/integer=True) pos/integer设置是小数还是整数
cvxpy中有三种数据类型,标量、向量和矩阵。n可以是数字,也可以是矩阵,
矩阵的行和列都是从0开始计数的。
3、目标函数:obj=cp.Maximize/Minimize(expression)
矩阵乘法用x@y,矩阵对应元素相乘用cp.multiply(x,y)
cp.sum()可以在里面包含有未知数,常常obj=cp.Minimize(cp.sum(cp.multiply(x,y)))
cp.quad_form(x,p):求x’px的函数,x’表示x的转置
4、约束条件:支持多个约束条件放在一起 cons=[expression1,expression2…]
5、求解:prob=cp.Problem(obj,cons)
prob.solve(solver=”GLPK_MI”) solver=”GLPK_MI”:求解线性规划
x.value:最优解 prob.value:最优值
6、灵敏度分析
数学建模评价类方法01——灵敏度分析_显然易证的博客-CSDN博客_数学建模灵敏度分析
灵敏度分析:将模型中一个容易受到外界影响的参数(该参数在模型中已经有确定的值)未知数化,分析他变化时的各种结果的变化。
分析方法:1、求偏导法:对目标函数中的决策变量求偏导(适用于简单函数,复杂函数一般不连续)
2、蒙特卡洛技术
2、整数规划:要求一部分或全部决策变量必须取整数值的规划问题成为整数规划(IP)
如果一个线性规划模型中的部分或全部决策变量取整数值,则该线性规划模型为整数线性规划模型。
常见的有:背包问题,指派问题(两者均为0-1规划),旅行商问题(TSP)
算法和线性规划一致,只需要在设置未知数时integer=True
0-1规划在构造约束条件时可以用cp.sum(x,axis=0/1)来表示0-1变量的值
3、非线性规划:在目标函数或约束条件中至少有一个表达式是非线性的函数
线性规划问题的最优解只能在可行域的边界上取得(特别是在可行域的顶点处取得),求出的解也是全局最优解。而非线性规划的最优解可能在可行域的任意一点取得,且一般求出的最优解也只是局部最优解。
因为cvxpy只能求解凸规划问题,所以遇到非线性规划一定要先判断是否是凸规划,如果不是则采用scipy.optimize模块解决。(但有些非凸规划中我用cvxpy也能解出答案,不是很懂为什么?)
凸规划有以下性质:
1、局部最优解就是全局最优解
2、当目标函数是严格凸函数时,最优解唯一
凸函数:f(x1+x2)<=f(x1)+f(x2) 严格凸函数:f(x1+x2)<f(x1)+f(x2)
如何判断凸规划:对目标函数和约束条件求Hesse矩阵,Hesse矩阵半正定(各阶顺序主子式>=0),如果全部正定(各阶顺序主子式>0)则为严格凸规划。线性函数不用求。
Hesse矩阵:函数对各个变量的二阶偏导数矩阵,如下图所示。
步骤:和线性规划一致,但在解题步骤时solver要进行改变
比如在非线性规划中无整数时可以用CVXOPT,有整数时可以使用CPLEX
注:LP代表线性规划,无论是否有整数都用GLPK_MI;MIP代表就是含有整数的规划问题
4、二次规划模型:特殊的非线性规划模型(QP)
目标函数是决策向量的二次函数,约束条件都是线性的
步骤:和非线性模型的解题步骤相同
5、非凸规划问题
非凸规划问题采用scipy.optimize模块中的minimize函数求解,求出的只是局部最优解
python 非线性规划(scipy.optimize.minimize)_ronaldo2018的博客-CSDN博客_scipy.optimize.minimize
函数解释:minimize(fun,x0,constraints=con,bounds=bd)
fun:求最小值的目标函数,如果是求最大值则取负号
x0:变量的初始猜测值,如果有多个变量需要每个都有。常见的可以用np.random.randon(n)来设置
constraints:约束条件
bounds:决策向量的界限
因为是局部最优解,如果想要得到全局最优解可以多设置几组初始猜测值,将得到的结果进行对比,找出最小的那个就可能是全局最优解。
6、多目标规划:同时希望每个目标都尽可能大(或小)
在多目标规划问题中一般不能求出绝对最优解,求的是满意解或有效解。
满意解:决策者给每个目标函数一个上限(或下限),当在这个范围内时就是满意的,对应的解为满意解
准备工作:因为目标函数的不可公度性,在求解前需要对目标函数进行预处理
(1)无量纲化处理
(2)数量级归一化处理:数量级大的目标容易在决策时占优,从而影响决策结果
解题方法:
1、线性加权法
根据目标的重要性确定一个权重,以目标函数的加权平均值为评价函数,求评价函数的最优解。
该方法具有较强的主观性,重要程度高的权重大,重要程度低的权重小。权重可以在网上查找相关论文,根据他人给出的权重来作为参考。
2、理想点法
将每个单目标最优值求出,使每个目标函数与理想值得差的平方和最小
第一步:求出每个目标函数的理想值(单目标规划问题)
第二步:构造每个目标函数与理想值差的平方和
第三步:求构造后的函数的最优解
3、优先级法(序贯解法)
根据目标重要性分先后级,先求优先级高的目标函数的最优值,将求出的最优值作为条件求下一级目标函数的最优值,依次类推
第一步:确定优先级
第二步:求第一级单目标最优值
第三步:以第一级单目标等于最优值为约束,求第二级目标最优
第四步:以第一、第二级单目标等于其最优值为约束,求第三级目标最优。以此类推
例如动态规划等其他规划问题就不在此讲述了