2024国赛数学建模备赛|30种常用的算法模型之最优算法,线性规划

1.最优化理论基础

1.1 最优化问题的数学模型

通俗地说,所谓最优化问题,就是求一个多元函数在某个给定集合上的极 值. 几乎所有类型的最优化问题都可以用下面的数学模型来描述:

这里,𝐾 是某个给定的集合 (称为可行集或可行域),𝑓(𝑥) 是定义在集合 𝐾 上 的实值函数. 此外,在模型 (1.1) 中,𝑥 通常称为决策变量, s.t. 是 subject to (受 限于) 的缩写.

人们通常按照可行集的性质对最优化问题 (1.1) 进行一个大致的分类: ∙

线性规划和非线性规划. --- 可行集是有限维空间中的一个子集; ∙

组合优化或网络规划. --- 可行集中的元素是有限的; ∙

动态规划. --- 可行集是一个依赖时间的决策序列;

∙ 最优控制. --- 可行集是无穷维空间中的一个连续子集.

其中,𝑓(𝑥), ℎ𝑖(𝑥) (𝑖 = 1, · · · , 𝑙) 及 𝑔𝑖(𝑥) (𝑖 = 1, · · · , 𝑚) 都是定义在 R 𝑛 上连续可 微的多元实值函数, 且至少有一个是非线性的. 记

若指标集 𝐸 ∪ 𝐼 = ∅, 称之为无约束优化问题,否则称为约束优化问题. 特别 地, 把 𝐸 ̸= ∅ 且 𝐼 = ∅ 的优化问题称为等式约束优化问题; 而把 𝐼 ̸= ∅ 且 𝐸 = ∅ 的优化问题称为不等式约束优化问题. 𝑓(𝑥) 称为目标函数, ℎ𝑖(𝑥), 𝑔𝑗 (𝑥) (𝑖 = 1, · · · , 𝑙; 𝑗 = 1, · · · , 𝑚) 称为约束函数. 此外,通常把目标函数为二次函数而 约束函数都是线性函数的优化问题称为二次规划;而目标函数和约束函数都是 线性函数的优化问题称为线性规划.

1、最优化理论和方法是近二十多年来发展十分迅速的一个数学分支。 2、在数学上,最优化是一种求极值的方法。 3、最优化已经广泛的渗透到工程、经济、电子技术等领域。

在实际生活当中,人们做任何事情,不管是分析问题,还是进行决策,都要用一种标准衡量一下是否达到了最优。 (比如基金人投资) 在各种科学问题、工程问题、生产管理、社会经济问题中,人们总是希望在有限的资源条件下,用尽可能小的代价,获得最大的收获。(比如保险)

数学家对最优化问题的研究已经有很多年的历史。

以前解决最优化问题的数学方法只限于古典求导方法和变分法(求无约束极值问题),拉格朗日(Lagrange)乘数法解决等式约束下的条件极值问题。

计算机技术的出现,使得数学家研究出了许多最优化方法和算法用以解决以前难以解决的问题。

1.2几个概念

最优化是从所有可能方案中选择最合理的一种以达到最优目标的学科。

最优方案是达到最优目标的方案。

最优化方法是搜寻最优方案的方法。

最优化理论就是最优化方法的理论

1.3无约束问题的最优性条件及算法流程

讨论无约束优化问题

的最优性条件, 它包含一阶条件和二阶条件. 首先给出极小点的定义, 它分为全 局极小点和局部极小点。

一般采用迭代法求解无约束优化问题,

求极小点. 迭代法的基本思想是: 给定一个初始点 𝑥0, 按照某一迭代规则产生一 个迭代序列 {𝑥𝑘}. 使得若该序列是有限的, 则最后一个点就是问题 (1.18) 的极小 点; 否则, 若序列 {𝑥𝑘} 是无穷点列时, 它有极限点且这个极限点即为问题 (1.18) 的极小点

设 𝑥𝑘 为第 𝑘 次迭代点, 𝑑𝑘 为第 𝑘 次搜索方向, 𝛼𝑘 为第 𝑘 次步长因子, 则第 𝑘 次迭代完成后可得到新一轮 (第 𝑘 + 1 次) 的迭代点

算法 1 ( 无约束问题的一般算法框架 )

步 0 给定初始化参数及初始迭代点 𝑥0. 置 𝑘 := 0.

步 1 若 𝑥𝑘 满足某种终止准则, 停止迭代, 以 𝑥𝑘 作为近似极小点.

步 2 通过求解 𝑥𝑘 处的某个子问题确定下降方向 𝑥𝑘.

步 3 通过某种搜索方式确定步长因子 𝛼𝑘, 使得 𝑓(𝑥𝑘 + 𝛼𝑘𝑑𝑘) < 𝑓(𝑥𝑘).

步 4 令 𝑥𝑘+1 := 𝑥𝑘 + 𝛼𝑘𝑑𝑘, 𝑘 := 𝑘 + 1, 转步 1

为了方便, 通常称上述算法中的 𝑠𝑘 = 𝛼𝑘𝑑𝑘 为第 𝑘 次迭代的位移. 从算法 1 可以看出, 不同的位移 (不同的搜索方向及步长因子) 即产生了不同的迭代算法. 为了保证算法的收敛性, 一般要求搜索方向为所谓的下降方向:

例如:无约束极值问题的求解

例1:求函数y=2x^3+3x^2-12x+14在区间[-3,4]上的最大值与最小值。

解:令f(x)=y=2x^3+3x^2-12x+14

f'(x)=6x2+6x-12=6(x+2)(x-1)

解方程f'(x)=0,得到x1= -2,x2=1,

又 由于f(-3)=23,f(-2)=34,f(1)=7,f(4)=142,

综上得, 函数f(x)在x=4取得在[-3,4]上得最大值f(4)=142,在x=1处取得在[-3,4]上取得最小值f(1)=7

1.4用MATLAB解无约束优化问题

常用格式如下:

  1. fminsearch:基于单纯形法(Nelder-Mead算法),用于求解无约束优化问题,适合于目标函数没有梯度信息的情况。

    options = optimset('fminsearch'); [x, fval] = fminsearch(@myObjectiveFunction, x0, options);

  2. patternsearch:使用模式搜索算法来进行无约束优化,适合于处理复杂的目标函数,并且不依赖于梯度信息。

    options = optimoptions('patternsearch', 'Display', 'iter'); [x, fval] = patternsearch(@myObjectiveFunction, x0, [], [], [], [], lb, ub, options);

  3. simulannealbnd:模拟退火算法,用于全局优化,适合处理目标函数中可能存在多个局部最优解的情况。

    复制代码
    options = optimoptions('simulannealbnd', 'Display', 'iter'); [x, fval] = simulannealbnd(@myObjectiveFunction, x0, lb, ub, options);
  4. ga:遗传算法,用于全局优化,适合处理复杂的目标函数和高维问题。

    复制代码
    options = optimoptions('ga', 'Display', 'iter'); [x, fval] = ga(@myObjectiveFunction, nvars, [], [], [], [], lb, ub, [], options);
  5. fmincon :尽管fmincon主要用于有约束优化,它也可以用来解决无约束优化问题,只需将约束参数设置为空即可。

    options = optimoptions('fmincon', 'Algorithm', 'interior-point'); [x, fval] = fmincon(@myObjectiveFunction, x0, [], [], [], [], lb, ub, [], options);

在选择方法时,需要根据具体问题的特点(如是否有梯度信息、问题的规模、是否有多个局部最优解等)来决定最合适的优化算法。

例2 有边长为3m的正方形铁板,在四个角剪去相等的正方形以制成方形无盖水槽,问如何剪法使水槽的容积最大?

解:设剪去的正方形的边长为x,则水槽的容积为(3-2x)^2x的容积为:

建立无约束优化模型为:min y=-(3-2x)x,0<x<1.5

先编写M文件fun0.m如下: function f=fun0(x) f=-(3-2*x).^2*x;

主程序为wliti2.m: [x,fval]=fminbnd('fun0',0,1.5); xmax=x fmax=-fval

运算结果为: xmax = 0.5000,fmax =2.0000.即剪掉的正方形的边长为0.5m时水槽的容积最大,最大容积为2m3.

% 目标函数
function y = myObjectiveFunction(x)
    y = (x - 2)^2; % 示例目标函数
end

% 区间范围
xLower = 0;
xUpper = 4;

% 调用 fminbnd
[xMin, fval] = fminbnd(@myObjectiveFunction, xLower, xUpper);

% 输出结果
disp(['最小值点: ', num2str(xMin)]);
disp(['目标函数值: ', num2str(fval)]);

2.多元函数无约束优化问题

命令格式为:

(1)x= fminunc(fun,X0 );或x=fminsearch(fun,X0 )

(2)x= fminunc(fun,X0 ,options); 或x=fminsearch(fun,X0 ,options)

(3)[x,fval]= fminunc(...); 或[x,fval]= fminsearch(...)

(4)[x,fval,exitflag]= fminunc(...); 或[x,fval,exitflag]= fminsearch

(5)[x,fval,exitflag,output]= fminunc(...); 或[x,fval,exitflag,output]= fminsearch(...)

例 用fminsearch函数求解

输入命令:

f='100*(x(2)-x(1)^2)^2+(1-x(1))^2';

[x,fval,exitflag,output]=fminsearch(f,[-1.2 2])

运行结果:

x =1.0000 1.0000

fval =1.9151e-010 exitflag = 1

output= iterations: 108

funcCount: 202

algorthm: 'Nelder-Mead simplex direct search '

1.5最优化方法分类

(一)

线性最优化:目标函数和约束条件都是线性的则称为线性最优化。

非线性最优化:目标函数和约束条件如果含有非线性的,则称为非线性最优化。

(二)

静态最优化:如果可能的方案与时间无关,则是静态最优化问题。

动态最优化:如果可能的方案与时间有关,则是动态最优化问题

1.6 最优化方法的主要内容

根据目标函数,约束条件的特点将最优化方法包含的主要内容大致如下划分:

(1)线性规划

(2)整数规划

(3)非线性规划

(4)动态规划

(5)多目标规划

(6) 对策论

2.约束条件下的优化

2.1 线性规划

在人们的生产实践中,经常会遇到如何利用现有资源来安排生产,以取得最大经济 效益的问题。此类问题构成了运筹学的一个重要分支---数学规划,而线性规划(Linear Programming 简记 LP)则是数学规划的一个重要分支。自从 1947 年 G. B. Dantzig 提出 求解线性规划的单纯形方法以来,线性规划在理论上趋向成熟,在实用中日益广泛与深 入。特别是在计算机能处理成千上万个约束条件和决策变量的线性规划问题之后,线性 规划的适用领域更为广泛了,已成为现代管理中经常采用的基本方法之一

2.1.1具体例子:

例 1 某机床厂生产甲、乙两种机床,每台销售后的利润分别为 4000 元与 3000 元。 生产甲机床需用 A、B 机器加工,加工时间分别为每台 2 小时和 1 小时;生产乙机床 需用 A、B、C 三种机器加工,加工时间为每台各一小时。若每天可用于加工的机器时 数分别为 A 机器 10 小时、B 机器 8 小时和C 机器 7 小时,问该厂应生产甲、乙机床各 几台,才能使总利润最大?

上述问题的数学模型:设该厂生产 x_1 台甲机床和 x_2 乙机床时总利润最大,则 x_1 , x_2 应满足:

这里变量 x 1, x2 称之为决策变量,(1)式被称为问题的目标函数,(2)中的几个不等式 是问题的约束条件,记为 s.t.(即 subject to)。

由于上面的目标函数及约束条件均为线性 函数,故被称为线性规划问题。

总之,线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最 小的问题。 在解决实际问题时,把问题归结成一个线性规划数学模型是很重要的一步,但往往 也是困难的一步,模型建立得是否恰当,直接影响到求解。而选适当的决策变量,是我们建立有效模型的关键之一.

2.1.2线性规划的 Matlab 标准形式

线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以 是小于号也可以是大于号。为了避免这种形式多样性带来的不便,Matlab 中规定线性 规划的标准形式为

其中 c 和 x 为 n 维列向量, A 、 Aeq 为适当维数的矩阵,b 、beq 为适当维数的列向 量

例如线性规划

的 Matlab 标准型为

2.1.3 线性规划问题的解的概念

一般线性规划问题的(数学)标准型为

可行解 满足约束条件(4)的解x= ( x1 x2 ··· xn) ,称为线性规划问题的可行解, 而使目标函数(3)达到最大值的可行解叫最优解。

可行域 所有可行解构成的集合称为问题的可行域,记为 R 。

2.1.4 图解法

图解法简单直观,有助于了解线性规划问题求解的基本原理。我们先应用图解法来 求解例 1。对于每一固定的值 z ,使目标函数值等于 z 的点构成的直线称为目标函数等 位线,当 z 变动时,我们得到一族平行直线。对于例 1,显然等位线越趋于右上方,其 上的点具有越大的目标函数值。不难看出,本例的最优解为 T x* = (2,6) ,最优目标值 z* = 26

从上面的图解过程可以看出并不难证明以下断言:

(1)可行域 R 可能会出现多种情况。R 可能是空集也可能是非空集合,当 R 非空 时,它必定是若干个半平面的交集(除非遇到空间维数的退化)。R 既可能是有界区域, 也可能是无界区域。 (2)在 R 非空时,线性规划既可以存在有限最优解,也可以不存在有限最优解(其 目标函数值无界)

(3)若线性规划存在有限最优解,则必可找到具有最优目标函数值的可行域 R 的 "顶点"。

2.1.5 求解线性规划的 Matlab 解法

单纯形法是求解线性规划问题的最常用、最有效的算法之一。这里我们就不介绍 单纯形法,有兴趣的读者可以参看其它线性规划书籍。下面我们介绍线性规划的 Matlab 解法

Matlab 中线性规划的标准型为

基本函数形式为 linprog(c,A,b),它的返回值是向量 x 的值。还有其它的一些函数调用形 式(在 Matlab 指令窗运行 help linprog 可以看到所有的函数调用形式),如:

[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS) 

这里 fval 返回目标函数的值,LB 和 UB 分别是变量 x 的下界和上界, 0 x 是 x 的初始值, OPTIONS 是控制参数

例 2 求解下列线性规划问题

解 (i)编写 M 文件

c=[2;3;-5];

a=[-2,5,-1;1,3,1];

b=[-10;12];

aeq=[1,1,1];

beq=7;

x=linprog(-c,a,b,aeq,beq,zeros(3,1))

value=c'*x

(ii)将M文件存盘,并命名为example1.m。

(iii)在Matlab指令窗运行example1即可得所求结果。

例3 求解线性规划问题

解 编写Matlab程序如下:

c=[2;3;1]; 
a=[1,4,2;3,2,0]; 
b=[8;6]; 
[x,y]=linprog(c,-a,-b,[],[],zeros(3,1)

2.1.6 可以转化为线性规划的问题

很多看起来不是线性规划的问题也可以通过变换变成线性规划的问题来解决。如:

例4 规划问题为

要把上面的问题变换成线性规划问题,只要注意到事实:对任意的x_i 存在ui,vi>0 蛮子

2.1.6.1 运输问题(产销平衡)

例6 某商品有m 个产地、n个销地,各产地的产量分别为a1,,a_m,各销地的需求量分别为b1,,bn。若该商品由i产地运到j销地的单位运价为c,问应该如何调运才能使总运费最省?

显然是一个线性规划问题,当然可以用单纯形法求解。 对产销平衡的运输问题,由于有以下关系式存在:

其约束条件的系数矩阵相当特殊,可用比较简单的计算方法,习惯上称为表上作业法(由 康托洛维奇和希奇柯克两人独立地提出,简称康---希表上作业法)。

2.1.6.2 指派问题的数学模型

例 7 拟分配n 人去干n 项工作,每人干且仅干一项工作,若分配第i 人去干第 j 项工作,需花费 ij c 单位时间,问应如何分配工作才能使工人花费的总时间最少? 容易看出,要给出一个指派问题的实例,只需给出矩阵 C =Cij ,C 被称为指派 问题的系数矩阵

上述指派问题的可行解可以用一个矩阵表示,其每行每列均有且只有一个元素为 1,其余元素均为 0;可以用1,L,n 中的一个置换表示。 问题中的变量只能取 0 或 1,从而是一个 0-1 规划问题。一般的 0-1 规划问题求解 极为困难。但指派问题并不难解,其约束方程组的系数矩阵十分特殊(被称为全单位模 矩阵,其各阶非零子式均为 ±1),其非负可行解的分量只能取 0 或 1,故约束xij = 0或1 可改写为 xij ≥ 0而不改变其解。此时,指派问题被转化为一个特殊的运输问题,其中 m = n ,ai = bj =1。

2.1.6.2.1 求解指派问题的匈牙利算法

由于指派问题的特殊性,又存在着由匈牙利数学家 Konig 提出的更为简便的解法 ---匈牙利算法。算法主要依据以下事实:如果系数矩阵 C = cij 一行(或一列)中每 一元素都加上或减去同一个数,得到一个新矩阵 B = bij ,则以C 或 B 为系数矩阵的 指派问题具有相同的最优指派

例 8 求解指派问题,其系数矩阵为

解 将第一行元素减去此行中的最小元素 15,同样,第二行元素减去 17,第三行 元素减去 17,最后一行的元素减去 16,得

再将第 3 列元素各减去 1,得

B2 为系数矩阵的指派问题有最优指派

2.1.6.3灵敏度分析

在以前讨论线性规划问题时,假定 aij ,bi ,cj 都是常数。但实际上这些系数往往是估 计值和预测值。如市场条件一变, c_j值就会变化;aij 往往是因工艺条件的改变而改变; bi 是根据资源投入后的经济效果决定的一种决策选择。因此提出这样两个问题:当这 些系数有一个或几个发生变化时,已求得的线性规划问题的最优解会有什么变化;或者 这些系数在什么范围内变化时,线性规划问题的最优解或最优基不变。这里我们就不讨 论了

2.1.6.4投资的收益和风险

市场上有n种资产s(i=1,2,...·,n)可以选择,现用数额为M 的相当大的资金作一个时期的投资。这n种资产在这一时期内购买s的平均收益率为,,风险损失率为9,投资越分散,总的风险越少,总体风险可用投资的s中最大的一个风险来度量。

购买s,时要付交易费,(费率p,),当购买额不超过给定值u,时,交易费按购买u计算。另外,假定同期银行存款利率是",既无交易费又无风险。(n=5%)已知n=4时相关数据如表1。

试给该公司设计一种投资组合方案,即用给定资金 M ,有选择地购买若干种资产 或存银行生息,使净收益尽可能大,使总体风险尽可能小。

模型简化

5.4 模型一的求解 模型一为:

由于 a 是任意给定的风险度,到底怎样没有一个准则,不同的投资者有不同的风险 度。我们从 a = 0 开始,以步长Δa = 0.001进行循环搜索,编制程序如下:

clc,clear
a=0;
hold on
while a<0.05
 c=[-0.05,-0.27,-0.19,-0.185,-0.185];
 A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];
 b=a*ones(4,1);
 Aeq=[1,1.01,1.02,1.045,1.065];
 beq=1;
 LB=zeros(5,1);
 [x,Q]=linprog(c,A,b,Aeq,beq,LB);
 Q=-Q;
 plot(a,Q,'*r');
 a=a+0.001;
end
xlabel('a'),ylabel('Q')

5.5 结果分析

  1. 风险大,收益也大。

2.当投资越分散时,投资者承担的风险越小,这与题意一致。即: 冒险的投资者会出现集中投资的情况,保守的投资者则尽量分散投资。

3.在 a = 0.006 附近有一个转折点,在这一点左边,风险增加很少时,利润增长 很快。在这一点右边,风险增加很大时,利润增长很缓慢,所以对于风险和收益没有特 殊偏好的投资者来说,应该选择曲线的拐点作为最优投资组合,投资方案为

风险度a=0.006,收益Q=0.2019,x=0,x=0.24,x,=0.4,x=0.1091,x=0.2212。

最新的优化问题可以参考:

相关推荐
pianmian12 分钟前
完全平方数
数据结构·算法
A_Tai23333334 分钟前
贪心算法解决用最少数量的箭引爆气球问题
算法·贪心算法
唐叔在学习15 分钟前
【唐叔学算法】第19天:交换排序-冒泡排序与快速排序的深度解析及Java实现
java·算法·排序算法
_nirvana_w_15 分钟前
C语言实现常用排序算法
c语言·算法·排序算法
唐叔在学习23 分钟前
【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析
数据结构·算法·排序算法
Kenneth風车1 小时前
【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)11
算法·机器学习·分类
最后一个bug1 小时前
rt-linux中使用mlockall与free的差异
linux·c语言·arm开发·单片机·嵌入式硬件·算法
蹉跎x2 小时前
力扣1358. 包含所有三种字符的子字符串数目
数据结构·算法·leetcode·职场和发展
rainoway2 小时前
CRDT宝典 - yata算法
前端·分布式·算法
巫师不要去魔法部乱说3 小时前
PyCharm专项训练4 最小生成树算法
算法·pycharm