system: [SYSTEM]

user: 2. 优化模型 最优化方法 [ 5 ] ，也称做运筹学方法，是数学的一个分支，是上世纪二次大战前后慢慢累积成的一门学科。最优化方法最核心的内容是通过运用数学方法来对各种系统的优化途径以及方案进行研究，为决策者提供科学决策依据，以便做出合理科学的决策。 从数学角度上来说，最优化方法的本质就是一种求极值的方法，具体的说就是在一组约束条件为等式或者不等式的情形下，使得系统的目标函数要么达到最大值，要么达到最小值。常用的优化方法有线性、非线性以及整数规划模型。 2.1. 线性规划模型 线性规划 [ 6 ] 是探究由线性等式或不等式构成的约束条件下的极值题目，可以解决种种规划、出产、运输等科学解决与工程范畴方面的问题。它的主要算法是单纯形法。 线性规划问题的特点：第一，题目都是用代表性的变量表现一个方案，这组代表性变量的值就代表详细的方案，这些变量的取值是不能为负数的。第二，存在必然的约束前提，该前提可以用线性函数来表现。第三，都有一个要求到达的目标，他可以用决策变量的线性函数来表现，这个函数称为目标函数，按题目的差别，要求目标函数实现最大化或者最小化。下面，通过几个例子来说明一下。 2.1.1. 数学表示 在线性规划的一般形式中，有n个变化的量，m个约束前提，这个前提是等式，变化的量非负，要求函数的最小值，这个表达式为： min f = c 1 x 1 + c 2 x 2 + ⋯ + c n x n s . t . { a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2                                         ⋮ a m 1 x 1 + a m 2 x 2 + ⋯ + a m n x n = b m x 1 ， x 2 ， ⋯ ， x n ≥ 0 ; b i ≥ 0 ( i = 1 ， 2 ， ⋯ ， m ) (1) 在这个表达式中，满足各约束前提的右端项 b i ≥ 0 ，不然两边乘以“−1”，可简写为 min f = C T X s . t . { A X = B x i ， b j ≥ 0 ( i = 1 ， 2 ， ⋯ ， n ; j = 1 ， 2 ， ⋯ ， m ) (2) A = ( a i j ) m × n 约束前提的系数矩阵，一般 n ≥ m > 0 ， C = ( c 1 ， c 2 ， ⋯ ， c n ) T 为价值向量， B = ( b 1 ， b 2 ， ⋯ ， b m ) T 称为资源向量， X = ( x 1 ， x 2 ， ⋯ ， x n ) T 为决策向量。 知道了标准型之后，任意一个形式的数学模型都可以转化为标准型来求解 [ 7 ] 。 2.1.2. MATLAB实现 这个模型的MATLAB命令是linprog，假设该规划题目的数学模型 [ 8 ] 为 min f T x s . t . { A ∗ x ≤ b A e q ∗ x = b e q l b ≤ x ≤ u b (3) 式中， f ， x ， b ， b e q ， l b 和 u b 为向量， A 和 A e q 为矩阵。这里，须要指出的是，MATLAB中给的量和矩阵的值是从上往下进行的，行中间用“;”离隔每行元素可用“，”也可用空格，矩阵右上角用“’”表现转置运算。 Linprog函数 [ 9 ] 的调用格式如下： 1) [ x ， f v a l ] = l i n p r o g ( f ， A ， b ) ，解线性规划题目的 min f T x ，前提为 A ∗ x ≤ b ，返回解 x 处所要求解的值 f v a l 。 2) [ x ， f v a l ] = ( f ， A ， b ， A e q ， b e q ) ，解线性规划题目的 min f T x ，前提为 A ∗ x ≤ b ，但增加了一个前提，即 A e q ∗ x = b e q ；若不等式不存在，则令A = ，、b = ，，同时返回解 x 处的目标函数值 f v a l 。 3) [ x ， f v a l ] = l i n p r o g ( f ， A ， b ， A e q ， b e q ， l b ， u b ) ，求解线性规划题目的 min f T x ，约束前提为 A ∗ x ≤ b 及 A e q ∗ x = b e q ，并定义变量 x lb(下界)和ub(上界)，使 x 一直在该范畴内，若不存在，则令A = ，、B = ，，即令返回解 x 处的所求函数值 f v a l 。 4) [ x ， f v a l ] = l i n p r o g ( f ， A ， b ， A e q ， b e q ， l b ， u b ， x 0 ) ，求该题的 min f T x ，有一个前提是 A ∗ x ≤ b ，和 A e q ∗ x = b e q ，同样也有下界和上界，有一个初始 x 0 ，同时执行上一环中的最后一步。 5) [ x ， f v a l ] = l i n p r o g ( f ， A ， b ， A e q ， b e q ， l b ， u b ， x 0 ， o p t i o n s ) ，求该题的 min f T x ，也有前提是 A ∗ x ≤ b ，以及 A e q ∗ x = b e q ，同样有上下界和初始值 x 0 ，不同的是用 o p t i o n s 使指定的参数到达最小化，同时执行上一环中的最后一步。 6) x = l i n p r o g ( ... ) ，仅输出解 x 的值，不输出所求的函数值 f v a l 。 2.1.3. 运输问题 某工场出产甲、乙两种产物，有要求：1 kg产物甲须要用材料A 5 kg，材料B 6 kg；生产1 kg产物乙需要材料A 3 kg，材料B 7 kg，材料C 5 kg。若1 kg产物甲和乙的价钱划分为6万和5万，三种材料的限制分别为100 kg、160 kg、180 kg。试求出使得总销售达到最高的方法？ 解：令出产产物甲的数目为 x 1 ，出产产物乙的数目为 x 2 ，由要求可得模型： max 6 x 1 + 5 x 2 s . t . { 5 x 1 + 3 x 2 ≤ 100 6 x 1 + 7 x 2 ≤ 160 5 x 2 ≤ 180 x ， x 2 ≥ 0 (4) 这个题目要使所求的函数值达到最大，则根据MATLAB的标准 [ 10 ] 进行转化，即让所求函数最小，即： min − 6 x 1 − 5 x 2 s . t . { 5 x 1 + 3 x 2 ≤ 100 6 x 1 + 7 x 2 ≤ 160 5 x 2 ≤ 180 x ， x 2 ≥ 0 (5) MATLAB求解程序清单为： » f = [ − 6 ， − 5 ] ′ A = [ 5 ， 3 ; 6 ， 7 ; 0 ， 5 ] ′ ； b = [ 100 ， 160 ， 180 ] ′ ； (6) l b = [ 0 ， 0 ] ′ ； [ x ， f v a l ] = l i n p r o g ( f ， A ， b ，   □ ，   □ ，   l b ) 结果输出为： x = 12.9412 11.7647 (7) f v a l = − 136.4706 说明生产产品甲、乙的数量分别为12.9 kg、11.76 kg时，创造的最高总售价为136.47万元。 2.2. 整数规划模型 在之前所说的线性题目中，有时候解是分数有时候却是小数，也有时会出现针对一些的题目要求解不能是上述情况(称为整数解)。例如，要求机器的台数、工场的人数或卸货的车辆数等。通常称这种题目为整数规划(Integer Programming)，简称IP，它是规划论中的一个分支。 该规划中，全部的量均取整数时就叫做纯整数规划(Pure Integer Programming)；部分变化的量取整数的称混合整数规划 [ 11 ] (Mixed Integer Programming)；变化的量只取0或1两种值的规划称为0--1规划。 2.2.1. 数学表示 max ( 或 min ) z = ∑ j = 1 n c j x j s . t . { ∑ j = 1 n a i j x i j ≤ ( = ， ≥ ) b i ( i = 1 ， 2 ， ⋯ ， m ) x j ≥ 0 ( j = 1 ， 2 ， ⋯ ， n ) x 1 ， x 2 ， ⋯ ， x n 中 部 分 或 全 部 取 整 数 (8) 2.2.2. MATLAB实现 由于整数规划的解法有很多，所以，用MATLAB实现的方法也有很多，下面将会结合具体的事例来阐述。 2.2.3. 限制问题 某工场打算要出产甲、乙两种衣服，得知制作甲、乙衣服须要耗损A、B两种材料，A、B两种材料的耗损以及进价按下表1所示：(A最多只能用8 m，B最少要用6 m) 试问：工厂应分别生产多少件甲、乙，才能使得所花的钱最少？ 解：设工厂应分别生产甲、乙种衣服 x 1 ， x 2 件，根据题意建立如下数学模型： min z = x 1 + 4 x 2 s . t . { 2 x 1 + x 2 ≤ 8 x 1 + 2 x 2 ≥ 6 x 1 ， x 2 ≥ 0 且 为 整 数 (9) 在MATLAB命令 [ 12 ] 窗口输入： » f = [ 1 ， 4 ] ′ ； A = [ 2 ， 1 ; − 1 ， − 2 ] ； b = [ 8 ， − 6 ] ； (10) l b = [ 0 ， 0 ] ； [ x ， f v a l ] = l i n p r o g ( f ， A ， b ，   □ ，   □ ，   l b ) 结果输出为： x = 3.3333 1.3333 (11) f v a l = 8.6667 不符合题意，确定分支 x 1 ≤ 3 和 x 1 ≤ 3 两部分。 Table 1 The material consumption and purchase price of A， B two kinds material 项目 甲 乙 资源限制/m 材料A 2 1 8 (小于) 材料B 1 2 6 (大于) 进价/元 1 4 表1. A、B两种材料的耗损和进价 1) 先考虑 x 1 ≤ 3 的部分，即求解 min z = x 1 + 4 x 2 s . t . { 2 x 1 + x 2 ≤ 8 x 1 + 2 x 2 ≥ 6 x 1 ≤ 3 x 1 ， x 2 ≥ 0 且 为 整 数 (12) 在MATLAB命令窗口中输入 » f = [ 1 ， 4 ] ′ ; A = [ 2 ， 1 ; − 1 ， − 2 ; 1 ， 0 ] ; b = [ 8 ， − 6 ， 3 ] ； (13) l b = [ 0 ， 0 ] ； [ x ， f v a l ] = l i n p r o g ( f ， A ， b ，   □ ，   □ ，   l b ) 结果为： x = 3.0000 1.5000 (14) f v a l = 9.0000 仍然不满足全部为整数解的要求。 2) 考察分支 x 1 ≤ 3 ，再加上限制 x 2 ≤ 1 ，求解 min z = x 1 + 4 x 2 s . t . { 2 x 1 + x 2 ≤ 8 x 1 + 2 x 2 ≥ 6 x 1 ≤ 3 x 2 ≤ 1 x 1 ， x 2 ≥ 0 且 为 整 数 (15) 在MATLAB命令窗口中输入： » f = [ 1 ， 4 ] ′ ； A = [ 2 ， 1 ; − 1 ， − 2 ; 1 ， 0 ; 0 ， 1 ] ; b = [ 8 ， − 6 ， 3 ， 1 ] ; (16) l b = [ 0 ， 0 ] ； [ x ， f v a l ] = l i n p r o g ( f ， A ， b ，   □ ，   □ ，   l b ) 结果出现错误信息提示，但仍输出为： x = 3.0000 1.5000 (17) f v a l = 9.0000 因为有信息错误，说明该解有问题，而且也不符合整数解要求，继续求解： 3) 考察分支 x 1 ≤ 3 和 x 2 ≥ 2 ，即求解 min z = x 1 + 4 x 2 s . t . { 2 x 1 + x 2 ≤ 8 x 1 + 2 x 2 ≥ 6 x 1 ≤ 3 x 2 ≥ 2 x 1 ， x 2 ≥ 0 且 为 整 数 (18) 在MATLAB命令窗口中输入： » f = [ 1 ， 4 ] ′ ； A = [ 2 ， 1 ; − 1 ， − 2 ; 1 ， 0 ; 0 ， 1 ] ; b = [ 8 ， − 6 ， 3 ， − 2 ] ; (19) l b = [ 0 ， 0 ] ; [ x ， f v a l ] = l i n p r o g ( f ， A ， b ，   □ ，   □ ，   l b ) 结果出现错误信息提示，但仍输出为： x = 2.0000 2.0000 (20) f v a l = 10.0000 此时，解全部为整数，但是否为最优解尚需对其他没有考察的分支进行进一步的计算，最后得到结论，即 x 1 ∗ = x 2 ∗ = 2 ， z ∗ = 10 (21) 2.3. 非线性规划模型 之前所说的这两种规划的目标函数和约束前提中，函数均为线性的，但在现实中另有大量的题目，其目标函数或约束前提很难用线性来表达，其中包括了很多的非线性函数，则称这种规划为非线性规划问题。 2.3.1. 数学表示 实际中所碰到的题目多半是非线性的，其数学表达式 [ 13 ] 为： min ( 或 max ) f ( x 1 ， x 2 ， ⋯ ， x n ) s . t . { g ( x 1 ， x 2 ， ⋯ ， x n ) ≥ ( = ， ≤ 0 ) x j ≥ 0 i = 1 ， 2 ， ⋯ ， m j = 1 ， 2 ， ⋯ ， n (22) 2.3.2. MATLAB实现 当要求的变量只有一个，且没有约束的限制时，常用到的MATLAB函数为 f min b n d 、 f min s e a r c h 、 f min u n c ，用于求多变量无约束非线性规划的MATLAB函数为 f min s e a r c h 、 f min u n c 。 1) f min b n d 命令用 f min b n d 可求区间 [ x 1 ， x 2 ] 内单变量函数的最小值，工程应用中常用的格式如下： ① [ x ， f v a l ] = f min b n d ( f u n ， x 1 ， x 2 ) ，返回区间上最小解 x 及解 x 处的所求函数值。 ② [ x ， f v a l ] = f min b n d ( f u n ， x 1 ， x 2 ， o p t i o n s ) ，采用 o p t i o n s 参数指定的优化参数进行最小化，若没有设置 o p t i o n s 选项，可令 o p t i o n s =   □ ，同时返回最小解 x 及解 x 处的目标函数值。 ③ x = f min b n d ( ... ) ，仅返回解 x 的数值，不返回目标函数值。 2) f min u n c 命令利用 f min u n c 可求解单变量及多变量函数的最小值，工程中常用的格式如下： ① [ x ， f v a l ] = f min u n c ( f u n ， x 0 ) ，给定初始值 x 0 ，返回所求函数极小值 x 和所求函数值。 ② [ x ， f v a l ] = f min u n c ( f u n ， x 0 ， o p t i o n s ) ，给定初始值 x 0 ，用 o p t i o n s 参数指定的优化参数进行最小化，若没有设置 o p t i o n s 选项，可令 o p t i o n s =   □ ，同时返回目标函数的极小值 x 和目标函数值。 ③ x = f min u n c ( ... ) ，仅返回解 x 的数值，不返回目标函数值。 3) f min s e a r c h 命令利用 f min s e a r c h 可求的问题和 f min u n c 一样，工程中常用的格式如下： ① [ x ， f v a l ] = f min s e a r c h ( f u n ， x 0 ) ，给定值 x 0 ，返回所求函数极小值 和所求函数值。 ② [ x ， f v a l ] = f min s e a r c h ( f u n ， x 0 ， o p t i o n s ) ，给定初始值 x 0 ，用 o p t i o n s 参数指定的优化参数进行最小化，若没有设置 o p t i o n s 选项，可令 o p t i o n s =   □ ，同时返回目标函数的极小值 x 和目标函数值。 ③ x = f min s e a r c h ( ... ) 。仅返回解 x 的数值，不返回目标函数值。 4) 参数说明 ① f u n 为目标函数，若对应的函数采用 M 文件表示，即 f u n = ' m y f u n ' ，则 m y f u n . m 必须采用下面的形式，即 f u n c t i o n f = m y f u n ( x ) f = ... ② ，为优化参数选项，可以通过 o p t i m s e t 函数设置或改变这些参数。 5) 注意事项 ① 三个函数均可能只输出局部最优解。 ② 三个函数均只对变量为实数的题目进行优化。 ③ f min b n d 函数和 f min u n c 函数要求目标函数必需连续。 ④ 若变量为复数，对于 f min u n c 函数和 f min s e a r c h 函数来说，需将相应的复数分为实部和虚部两部分分别进行优化计算。 2.3.3. 工程应用实例 某工场有个边长为5 m的正方形铁板，欲制成一个方形无盖水槽，问在它的4个角处剪去多长时，能使水槽的容纳的水最多? 解：设裁去的正方形的边长为 x ，则水槽的容积为 f ( x ) = ( 5 − 2 x ) 2 x ，分析可知，裁去的正方形的边长不超过2.5 m，即 x 位于区间 ( 0 ， 2.5 ) 上。现要求确定该区间上的一个 x ，使 f ( x ) 到达最大，根据MATLAB的要求，将目标函数最小化，即获得如下函数模型 [ 14 ] ： min − f ( x ) = − ( 5 − 2 x ) 2 x 1) MATLAB求解程序清单一： » [ x ， f v a l ] = f min b n d ( ' − ( 5 − 2 ∗ x ) ^ 2 ∗ x ' ， 0 ， 2.5 ) (23) 结果输出为： x = 0.8333 (24) f v a l = − 9.2593 2) MATLAB求解程序清单二： 首先，在 M − f i l e e d i t o r 中编写如下 M 文件： f u n c t i o n f = m y f u n ( x ) f = − ( 5 − 2 x ) ^ 2 ∗ x ; (25) 以文件名字 m y f u n 3 _ 1 存在MATLAB目次下的work文件夹中。然后，在MATLAB命令窗口中调用 f min b n d 函数： » [ x ， f v a l ] = f min b n d ( ' m y f u n 3 _ 1 ' ， 0 ， 2.5 ) 结果同样输出为： x = 0.8333 (26) f v a l = − 9.2593 可见，减掉正方形的边长为0.8333 m时，水槽能容纳的水最多，且最多为9.2593 m 3 。 这篇文章主要总结了数学建模中的优化模型，将常用的优化模型分为了三类：线性规划、整数规划以及非线性规划模型。分成了四大部分来罗列这三种模型，第一，先总结模型的概念，第二，模型一般的表达式，第三模型在MATLAB中的实现，最后，结合实例建立了模型并且用MATLAB求解出最优结果。