使用多种目标

使用多种目标

Of course, specifying a set of objectives is only the first step in solving a multi-objective optimization problem. The next step is to indicate how the objectives should be combined. As noted earlier, we support two approaches: blended and hierarchical.

混合目标

A blending approach creates a single objective by taking a linear combination of your objectives. You provide a weight for each objective as an argument tosetobjectiven.。另外,您can use theObjNWeightattribute, together withobjnumber.。目标的默认重量为1.0。

举个例子,如果您的模型有两个目标,<span> $ </ span> 1 + x + 2y <span> $ </ span><span> $ </ span> y + 2z <span> $ </ span>,如果你给予重量<span> $ </ span> -1 <span> $ </ span><span> $ </ span> 2 <span> $ </ span>分别对他们来说,Gurobi将用混合目标来解决你的模型<span> $ </ span> -1 \ cdot(1 + x + 2y)+ 2 \ cdot(y + 2z)= -1  -  x + 4z <span> $ </ span>

您应该避免非常大或非常小的重量。一个非常大的重量(即大于<span> $ </ span> 10 ^ 6 <span> $ </ span>)可能导致非常大的物镜系数,这可能导致数值困难。一个非常小的重量(即,小于<span> $ </ span> 1e-6 <span> $ </ span>)可能导致对整体混合目标的贡献,以小于公差,这可能导致其有效忽略该目标。

分层目标

分层或词典方法为每个目标分配优先级,并以减少优先顺序的目标优化目标。在每个步骤中,它找到了当前目标的最佳解决方案,而是只能从那些不会降低更高优先级目标的解决方案质量的解决方案。您为每个目标提供优先级作为争论setobjectiven.。另外,您can use theobjnpriority.属性。优先事项是一体的,而不是连续的。更大的值表示更高的优先级。目标的默认优先级为0。

为一个例子,如果您的模型有两个目标,则具有优先事项<span> $ </ span> 10 <span> $ </ span><span> $ </ span> 5 <span> $ </ span>,客观重量1.0和-1.0。假设第一个目标的最佳解决方案具有值<span> $ </ span> 100 <span> $ </ span>然后,求解器将找到优化手机万博登录与所有解决方案中的第二个目标的解决方案<span> $ </ span> 100 <span> $ </ span>for the first objective.

允许多目标退化

默认情况下,我们的分层方法不会允许稍后的目标来降低早期目标,但在优化问题的用户给定的结束间隙条件下。更精确地,用于定义哪种解决方案的基本值对于较低的优先级目标是可接受的 - 对于最小化问题 - 被计算为:

<span> $ </ span> \ mathrm {base \ _value} = \ max \ {bestsol,bestbound + \ vert bestbound \ vert * rgap,bestbound + Agap \},<span> $ </ span>

在哪里畅销书是最好的现任解决方案的价值,最好的问题的最佳证明下限的价值是问题的,RGAP.is the相对覆盖差距, 和一个沟is the绝对壁巴差距此外,下一个目标的可行解决方案集将考虑客观价值最多的解决方案。

通过一对公差可以放宽这种行为:相对和绝对容差。这些是作为论点提供的setobjectiven.,或者可以使用属性设置objnreltol.objnabstol.。通过将其中一个用于特定目标,您可以指示稍后的目标分别通过指定的相对或绝对量降低此目标。在我们之前的示例中,如果第一个目标的最佳值是<span> $ </ span> 100 <span> $ </ span>,如果我们设置objnabstol.为了这个目标<span> $ </ span> 20 <span> $ </ span>然后,第二优化步骤将在所有解决方案中找到第二个目标的最佳解决方案<span> $ </ span> 120 <span> $ </ span>或者更好的第一个目标。请注意,如果您修改了这两种公差,稍后的优化将使用两个值的宽松者(即,允许较大的降级的宽度)。

对于多目标LP模型,不同地处理客观的降级。对于LP模型,通过将一些变量固定到以前的最佳解决方案中的值来维护更高优先级目标的解决方案质量。这些固定定义使用可变降低的成本。的价值objnabstol.参数表示固定变量降低成本允许违反双重可行性的金额,而objnreltol.参数简单地忽略。如果您想要MIP行为,如果更直接控制劣化,则可以将虚拟二进制变量添加到模型中,从而将其转换为MIP。解决所得到的多目标MIP比解决原始多目标LP更耗时。

结合混合和分层目标

实际上,始终为每个目标指定重量和优先级。这允许您无缝地结合混合和分层方法。要了解这项工作,我们应该首先提供更多关于如何处理分层目标的详细信息。

当您为每个的每个优先级指定不同的优先级时<span> $ </ span> n <span> $ </ span>目标,求解器执行手机万博登录<span> $ </ span> n <span> $ </ span>单独的优化步骤。在每个步骤中,在降低优先顺序的情况下,它优化了当前目标乘以其ObjNWeight属性,同时强加约束,以确保更高优先级目标的质量不会被规定的公差更加劣化。

如果您对多个目标的优先级相同,那么它们将在相同的优化步骤中处理,从而少于<span> $ </ span> n <span> $ </ span>总步骤<span> $ </ span> n <span> $ </ span>目标。更精确地,按照减少优先级的顺序执行一个优先优先级值的一个优化步骤,并且使用相同优先级的所有目标使用这些目标的权重混合在一起。在结合混合和分层方法时,这为您提供了相当多的灵活性。

在分层方法中混合多个目标时的一个微妙点涉及从较低优先级的降级处理。混合优化步骤之后允许的客观降解是每个参与目标所允许的最大绝对和相对降级。例如,如果我们有三个目标objnpriority.等于<span> $ </ span> \ {2,2,1 \} <span> $ </ span>, 和objnreltol.等于<span> $ </ span> \ {0.0,0.05,00.00 \} <span> $ </ span>objnabstol.等于<span> $ </ span> \ {0,1,2 \} <span> $ </ span>,如果是第一个优先权目标的最佳解决方案<span> $ </ span> 10 <span> $ </ span>,然后是第一优先级目标的允许的劣化是<span> $ </ span> \ max \ {10 \ cdot 0.10,10 \ cdot 0.05,0,1 \}〜=〜1 <span> $ </ span>

查询多目标结果

可以在所有API中以编程方式查询多个客观值。基本概念是您必须指定要查询信息的多目标(通过设置参数objnumber.)。此外,您还可以指定要查询此信息的哪个解决方案(通过设置参数solutionnumber.)。例如,在Python中,您可以执行以下操作:

#读取并解决具有多个目标的模型m =读取('input.mps')m.optimize()#获取变量集x = m.getvars()#确保状态为最佳Assert M.Status == GRB。status.optimal#查询多个目标的数量,以及解决方案数量nsolutions = m.solcount noblements = m.numobj print('问题有',nobleves,'目标')打印('gurobi找到',nsolutions,'solutions')#对于每个解决方案,前三个变量的打印值,以及每个目标函数solutions = []的#值(nsolutions):#设置哪个解决方案我们将在M.Params.SolutionNumber = S#打印上查询在每个目标打印('解决方案',s,':',end ='')中的本解决方案的客观价值为O在范围内(nobleves):#设置我们将查询m.params.objnumber = O#查询的目标O-TH客观价值打印('',m.objnval,end ='')#在solution n = min(len(x),3)范围内的第一个三个变量(n):print(x [j] .varname,x [j] .xn,end ='')打印('')#查询O-Th Solutions.Append(m.getattr('xn',x))的完整向量)