这个例子展示了如何使用半无限规划来研究不确定性对优化问题模型参数的影响。我们将用这个函数来制定和解决一个优化问题 这个例子中所说明的问题涉及到空气污染的控制。具体来说,一套烟囱将在一个特定的地理区域内建造。随着烟囱高度的增加,来自烟囱的污染物的地面浓度降低。然而,每个烟囱的建造成本随着高度的增加而增加。在地面污染浓度不超过法定上限的情况下,我们会解决一个问题,尽量减少烟囱的累积高度,从而降低建筑成本。这一问题概述在以下参考文献中: 半无限规划的空气污染控制,A.I.F. Vaz和E.C. Ferreira,第二十八届全国环境调查行动大会,2004年10月 在本例中,我们将首先解决上述文章中发布的问题 然后我们扩展了原来的问题,允许风速和方向参数在给定范围内变化。这将允许我们分析这些参数的不确定性对这个问题的最优解的影响。 考虑一个20km×20km的区域R,其中将放置十个烟囱。这些烟囱向大气中释放了几种污染物,其中之一就是二氧化硫。堆栈的x、y位置是固定的,但堆栈的高度可能会有所不同。 栈的构造函数希望最小化栈的总高度,从而最小化构建成本。然而,这被一个相互矛盾的要求所平衡,即R地区地面上任何一点的二氧化硫浓度不得超过法定的最大值。 首先,我们画出烟囱初始高度。请注意,我们放大了R的一个4公里乘4公里的子区域,其中包含烟囱。 在这个问题中有两个与环境相关的参数,风速和风向。在本例的后面,我们将允许这些参数变化,但对于第一个问题,我们将把这些参数设置为典型值。 现在让我们绘制整个区域R的地面二氧化硫(SO2)浓度(记住烟囱图是在一个更小的区域)。二氧化硫浓度是在烟囱设定其初始高度时计算出来的。 我们可以看到,二氧化硫的浓度在感兴趣的区域是不同的。二氧化硫图有两个特点值得注意: SO2浓度在(x,y)平面的左上角上升 该地区大部分地区的SO2浓度约为零 简单来说,第一个特征是由于盛行风,在本例中,盛行风将SO2吹向(x,y)平面的左上角。第二个因素是由于二氧化硫通过扩散被输送到地面。与盛行风相比,这是一个较慢的过程,因此SO2仅到达感兴趣区域左上角的地面。 有关烟囱大气扩散的更详细的讨论,请参阅导言中所引用的参考资料。 粉色的平面表示二氧化硫浓度为 检查MATLAB文件 在我们解决最小堆栈高度问题之前,我们将概述如何解决
这样
(线性不等式约束)
(线性等式约束)
(非线性不等式约束)
(非线性等式约束)
(界限) 和
,在那里 该算法允许你为非线性优化问题指定约束条件,这些约束条件必须在一个辅助变量的区间内得到满足, 这个函数 该算法的关键部分是处理“半无限”约束, 正如我们稍后将看到的,您将在约束函数中创建这个网格。你应该为每一个使用的间距 在算法的每次迭代中,执行以下步骤: 评估 的所有局部最大值的近似值 替换每个 检查在新点是否满足SQP算法的任何停止标准 更新步骤1中用于评估半无限约束的网格间距。 在我们打电话之前 这是一个半无限约束,约束函数的实现将在本节中解释。对于最小堆栈高度问题,我们在MATLAB文件中实现了约束 此函数说明了半无限规划问题的约束函数的一般结构。特别是 1.定义约束评估的初始网格尺寸 回想一下, 2.定义将用于约束评估的网格 需要创建一个用于约束评估的网格。在注释“定义将对“无限”约束进行计算的网格”后面的三行代码 3.计算网格上的约束条件 一旦定义了网格,就可以计算它的约束条件。然后将这些约束返回到 注意,在这个问题中,我们还重新缩放了约束条件,使它们在更接近目标函数的尺度上变化。这可以帮助 我们现在可以调用 计算得到的最小累积高度 检查MATLAB文件 回想一下, 注意,二氧化硫浓度可能在(x, y)平面的左上角达到最大值,即在x = -20000m, y = 20000m处。这一点由下图中的蓝点标记,并通过计算这一点的二氧化硫浓度来验证。 检查MATLAB文件 二氧化硫浓度取决于几个环境因素,在上述问题中,这些因素被保持在固定值。其中两个环境因素是风速和风向。有关所有问题参数的详细讨论,请参阅引言中引用的参考文献。 我们可以调查系统在风速和风向方面的行为变化。在本示例的这一部分中,我们希望确保即使风向从3.82 rad变为4.18 rad,平均风速在5到6.2 m/s之间变化,也能满足二氧化硫限值。 我们需要实现一个半无限约束,以确保二氧化硫浓度不超过r区域的极限。这个约束要求对所有风速和风向对都是可行的。 这样的约束将有四个“无限”变量(风速、方向和地面的x-y坐标)。然而,给定的任意半无限约束 以合适的形式实现此约束 这意味着这个问题的“无限”变量是风速和方向。要查看这个约束是如何实现的,请查看MATLAB文件 这个约束函数可以像之前一样分为三个部分: 1.定义约束评估的初始网格尺寸 注释“初始采样间隔”后面的代码初始化了网格大小。 2.定义将用于约束评估的网格 代码的下一部分将使用与初始问题中使用的构造类似的构造创建网格(现在处于风速和方向)。 3.计算网格上的约束条件 代码的其余部分计算风速/方向网格中每个点上的SO2浓度。然后将这些约束返回到 我们现在可以调用 现在,我们可以查看有参数不确定性和无参数不确定性问题的最小计算累积烟囱高度之间的差异。您应该能够看到,当不确定性添加到问题中时,最小累积高度会增加。高度的预期增加允许SO2浓度保持在立法规定的以下指定范围内所有风速/风向对的最大值。 我们可以通过检查二氧化硫检查点来检查二氧化硫浓度是否超过有关区域的限制。对于给定的(x, y)点,我们在指定范围内绘制风速和风向的最大SO2浓度。注意,我们已经放大了X-Y平面的左上角。 当问题定义存在不确定性时,我们最终绘制烟囱在其最佳高度处的图。 半无限规划算法有很多选择,最小堆栈高度问题
h0 = (210; 210; 180; 180; 150; 150; 120; 120; 90; 90);plotChimneyStacks (h0
风向,以弧度计
plotSulfurDioxide (h0 theta0情况,
怎么
费塞米夫
非线性约束函数的书写
类型
function [c, ceq, K, s] = airPollutionCon(h, s, theta, U) %空气污染演示的约束函数% %这个%函数首先使用提供的网格%间距s创建一个(X, Y)点的网格。然后在网格的每个点%上计算以下约束:% %二氧化硫浓度在指定风向,THETA和%风速U <= 1.25e-4 g/m^3 % %参见AIRPOLLUTION % Copyright 2008 the MathWorks, Inc. % Initial sampling interval if nargin < 2 || isnan(s(1,1)) s = [1000 4000];定义网格,“无限”约束将被计算在w1x = -20000:s(1,1):20000;w1y = -20000: s(1、2):20000;(t1, t2) = meshgrid (w1x w1y);%最大允许二氧化硫maxsul = 1.25e-4;计算网格上的约束K = concsulphdioxide (t1, t2, h, theta, U) - maxsul;%缩放约束使其为0(1)K = 1e4*K%无有限约束c = []; ceq = [];
求解优化问题
lb=10*one(大小(h0));[hsopt,sumh,exitflag]=fsemif(@(h)和(h),h0,1,
局部最小值。约束满足。Fseminf停止是因为目标函数中预测的变化小于函数公差的值,约束条件满足到约束公差的值之内。
fprintf(
烟囱计算的最小累积高度:3667.22米
plotChimneyStacks (hsopt
检查优化结果
titleStr =
SO2Max=浓度二氧化硫(-20000,20000,hsopt,θ0,U0);fprintf(
x = -20000m, y = 20000m处二氧化硫浓度:1.25000e -04 g/m^3
考虑环境因素中的不确定性
类型
[c, ceq, K, s] = uncertainAirPollutionCon(h, s) % uncertainAirPollutionCon for air pollution demo % %这个%函数首先使用提供的网格间距s创建一个风速/方向点网格,然后在网格的每个点上计算%以下约束:% %二氧化硫浓度在x = -20000m, y = 20000m <= 1.25e-4 % g/m^3 % %参见AIRPOLLUTIONCON, AIRPOLLUTION % Copyright 2008 The MathWorks, Inc. % Maximum allowed二氧化硫maxsul = 1.25e-4;%初始采样间隔if nargin < 2 || isnan(s(1,1)) s = [0.02 0.04];定义“无限”约束将在w1x = 3.82:s(1,1):4.18上被计算的网格;%风向w1y = 5.0:s(1,2):6.2;%风速[t1,t2] =网格(w1x,w1y);对于所有风速/风向对,我们假设最大SO2浓度在[x, y] =[-20000, 20000] %。我们在这一点上计算SO2约束在[,U]网格上的百分比。K =二氧化硫(-20000,20000,h, t1, t2) - maxsul; % Rescale constraint to make it 0(1) K = 1e4*K; % No finite constraints c = []; ceq = [];
[hsopt2, sumh2, exitflag2] = fseminf(@(h)sum(h), h0, 1, ' ')
局部最小值。约束满足。Fseminf停止是因为目标函数中预测的变化小于函数公差的值,约束条件满足到约束公差的值之内。
fprintf(
计算不确定烟囱的最小累积高度:3812.17米
titleStr =
plotChimneyStacks (hsopt2
相关的话题