最优化方法

在人们的实际生活中,解决同一个问题常常有多种方案。最优化方法就是研究如何从这多个方案中选出最优方案的数学分支。使用Python的SciPy包可以实现部分最优化方法的运算。Excel内置Python提供了对SciPy包的支持。使用SciPy包之前,需要先导入它。[大谦Excel,dqexcel点com]

单变量最小化

单变量最小化问题在某些情况下可以直接用于求解实际问题,但大多数情况下它是作为多变量最优化方法的基础进行使用,因为进行多变量优化要用到单变量最小化。SciPy中单变量最小化使用黄金分割法和Brent法。

考虑下面的单变量最小化问题:对边长为3m的正方形铁板,在4个角处剪去相等的正方形以制成方形无盖水槽,问如何剪法使水槽的容积最大?

假设剪去的正方形的边长为x,则水槽的容积为

现在要求在区间(0,1.5)上确定一个x,使最大化。因为SciPy要求目标函数最小化,所以需要对目标函数进行转换,即要求最小化。

如图6-12所示,首先打开Excel 365,用鼠标单击A5单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:

code.python
def f(x):
    return –(3-2*x)**2*x
from scipy.optimize import minimize_scalar
minimize_scalar(f,bounds=(0,1.5),method=’bounded’)

单击Ctrl+Enter键,A5单元格中输出问题求解的结果如图6-12所示。代码首先用一个函数f(x)定义目标函数,注意通过加负号将目标最大化问题转化为目标最小化问题。从scipy.optimize子包中导入minimize_scalar函数,设置该函数的method参数,可以设置单变量最小化的算法,可取的值包括”golden”,”brent”和”bounded”三种,用bounds参数指定取值区间。

Document Image

图6-12 单变量最小化

图6-12中给出了单变量最小化的求解信息。success参数的值为True,表示算法成功收敛。fun参数表示最终的目标函数值,这里因为前面加了负号,目标值为负,去掉负号即表示水槽的最大容积为2m3。x参数对应的是问题的解,即4个角处正方形的边长为0.5m。nit和nfev两个参数分别表示迭代次数和目标函数计算次数。

线性规划

线性规划要求目标函数和约束条件都是线性的,目前已经广泛应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。

考虑下面的线性规划问题:某厂生产甲、乙两种产品,已知制成一吨产品甲需用资源A 3吨,资源B 4m3;制成一吨产品乙需用资源A 2吨,资源B 6m3,资源C 7个单位。若一吨产品甲和乙的经济价值分别为7万元和5万元,三种资源的限制量分别为90吨、200m3和210个单位。试决定应生产这两种产品各多少吨才能使创造的总经济价值最高?

令生产产品甲的数量为x1,生产产品乙的数量为x2。由题意可以建立下面的模型:

该模型要求使目标函数最大化,需要按照Python的要求进行转换,即目标函数为

如图6-13所示,首先打开Excel 365,用鼠标单击A8单元格,在公式文本框中输入“=PY(”进入Python模式。在公式文本框中输入下面的代码:

code.python
from scipy.optimize import linprog
c=[-7,-5]
A=[[3,2],[4,6],[0,7]]
b=[90,200,210]
x1_bounds=(0,None)
x2_bounds=(0,None)
linprog(c,A_ub=A,b_ub=b,bounds=[x1_bounds,x2_bounds])

单击Ctrl+Enter键,A8单元格中输出问题求解的结果如图6-13所示。代码首先从scipy.optimize子包中导入linprog函数,设置该函数的第1个参数为目标函数的系数组成的向量,注意要求目标函数最小化,A_ub和b_ub参数指定系数矩阵和右端项,用bounds参数指定自变量的取值区间,取值为无穷时用None表示。

Document Image

图6-13 线性规划

图6-13中给出了模型的求解信息。success参数的值为True,表示算法成功收敛。问题的解为x=[14,24],目标值为218,所以生产甲种产品14吨、乙种产品24吨可使创建的总经济价值最高。最高经济价值为218万元。