多目标工作

多目标工作

当然,指定一组目标只是解决多目标优化问题的第一步。下一步是指出应该如何结合目标。如前所述,我们支持两种方法:混合和分层。

混合目标

混合方法通过对目标进行线性组合来创建单个目标。为每个目标提供权重作为参数setObjectiveN.或者,您可以使用ObjNWeight属性,一起ObjNumber.目标的默认权重是1.0。

举个例子,如果你的模型有两个目标,<span>$</span>1 + x + 2y<span>$</span>< span > < /美元跨度> y + 2 z < span > < / span >美元,如果你给权重< span > < / span > 1美元美元< span > < / span >< span > < / span > 2美元美元< span > < / span >,那么Gurobi会用一个混合的目标来解决您的模型< span > < / span > 1美元\ cdot (1 + x + 2) + 2 \ cdot (y + 2 z) = 1 - x + 4 z < span > < / span >美元

你应该避免过大或过小的重量。一个非常大的重量(即大于< span > < / span > 10 ^ 6美元美元< span > < / span >)可能会导致非常大的客观系数,这可能会造成数值上的困难。非常小的重量(即小于< span > < / span > 1美元e-6 < span > < / span >美元)可能导致该目标对整体混合目标的贡献小于公差,从而可能导致该目标被有效忽略。

分级目标

层次或字典方法为每个目标分配一个优先级,并按优先级递减的顺序对目标进行优化。在每一步,它都为当前的目标找到最佳的解决方案,但只从那些不会降低高优先级目标的解决方案质量的方案中寻找。提供每个目标的优先级作为参数setObjectiveN.或者,您可以使用ObjNPriority属性。优先级是整体的,而不是连续的。值越大表示优先级越高。objective的默认优先级是0。

举个例子,如果你的模型有两个目标,有优先级< span > < span > < / span > 10美元< / span >< span > < / span > 5美元美元< span > < / span >,且第一个目标的最优解是有价值的< span > < /美元跨度> 100 < span > < / span >,求解器将从所有带目标手机万博登录的解中找到最优第二个目标的解< span > < /美元跨度> 100 < span > < / span >对于第一个目标。

允许多目标退化

默认情况下,我们的分层方法不允许后期目标降低早期目标,这取决于用户给出的优化问题的结束间隙条件。更准确地说,用于确定较低优先级目标- -就最小化问题而言- -可接受的解决办法的基本值计算如下:

\begin{displaymath}\ mathm {base\_value} = max\{bestsol, bestbound\vert bestbound\vert*rgap, bestbound + agap\},\end{displaymath}

在哪里< span > < /美元跨度> bestsol < span > < / span >美元是最佳现有解决方案的价值,< span > < /美元跨度> bestbound < span > < / span >美元是问题的最佳证明下界的值,< span > < /美元跨度> rgap < span > < / span >美元相对MIP差距,< span > < /美元跨度> agap < span > < / span >美元绝对MIP差距,下一个目标的可行解集将考虑其目标值不大于该值的解。

对于MIPs,这种行为可以通过一对容差来放松:一个相对容差和一个绝对容差。这些是作为参数提供的setObjectiveN,也可以使用属性来设置ObjNRelTolObjNAbsTol.通过为特定的目标设置其中一个,您可以指示以后的目标可以分别通过指定的相对或绝对数量来降低该目标。在前面的例子中,如果第一个目标的最佳值是< span > < /美元跨度> 100 < span > < / span >,如果我们ObjNAbsTol为了达到这个目标< span > < / span > 20美元美元< span > < / span >,则第二次优化步骤从所有有目标解中找出第二个目标的最优解< span > < /美元跨度> 120 < span > < / span >或者对第一个目标更好。注意,如果您同时修改两个公差,那么以后的优化将使用两个值中较松的那个(即允许较大的降级的那个)。

多目标LP模型的客观降解处理不同。对于LP模型,较高优先级目标的解决方案质量是通过将一些变量固定到以前最优解中的值来维持的。这些固定是用可变的降低成本来决定的。价值ObjNAbsTol参数表示允许固定变量的降低成本违反双重可行性的数量,而ObjNRelTol参数被简单地忽略。如果您想要更直接地控制降级的MIP行为,您可以向模型添加一个虚拟二进制变量,从而将其转换为MIP。求解得到的多目标最优解比求解原多目标最小二乘要费时得多。

结合混合和层次目标

实际上,你可以为每个目标都设定一个权重和优先级。这允许您组合混合和分层方法。为了理解这是如何工作的,我们应该首先提供关于层次目标是如何处理的更多细节。

当您为每一个指定不同的优先级时< span > < / span > n < span >美元< / span >目标,求解器执行手机万博登录< span > < / span > n < span >美元< / span >单独的优化步骤。在每一步中,优先级依次降低,它针对当前目标进行优化,同时施加约束以确保高优先级目标的质量不会下降超过指定的公差。

如果你给多个目标相同的优先级,那么它们将在相同的优化步骤中处理,从而导致少于< span > < / span > n < span >美元< / span >全部步骤< span > < / span > n < span >美元< / span >目标。更准确地说,按照优先级递减的顺序,对每个不同的优先级值执行一个优化步骤,并使用这些目标的权重将具有相同优先级的所有目标混合在一起。这为您在组合混合和分层方法时提供了相当大的灵活性。

在分层方法中将多个目标混合到单个级别时,一个微妙的问题与处理低优先级级别的降级有关。混合优化步骤后允许的目标退化是每个参与目标允许的最大绝对和相对退化。例如,如果我们有三个目标ObjNPriority等于< span > < /美元跨度> \ {2 2 1 \}< span > < / span >美元,ObjNRelTol等于< span > < /美元跨度> \ {0.10,0.05,0.00 \}< span > < / span >美元ObjNAbsTol等于< span > < /美元跨度> \ {0 1 2 \}< span > < / span >美元,以及对于第一优先目标的最佳解决方案是< span > < span > < / span > 10美元< / span >,则允许的第一个优先级目标的降级是< span > < /美元跨度> \马克斯\ {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() #确保状态最优维护m.Status = = GRB.Status.OPTIMAL #查询多个目标的数量,和解决方案的数量nSolutions = m.SolCount nObjectives = m.NumObj打印(nObjectives“问题”,#对于每个解决方案,打印前三个变量的值,并且# value For每个目标函数solutions = [] For s in range(nSolutions):#集解决方案,我们将查询从现在起m.params.SolutionNumber = s #打印这个解决方案的客观价值在每个目标打印(“解决方案”,年代,“:”,结束= ")o的范围(nObjectives): #集目标我们将查询m.params.ObjNumber = o #查询o-th客观价值打印(“,m。ObjNVal, end= ") # print the first three variables in the solution n = min(len(x),3) for j in range(n):VarName x [j]。Xn, end= ") print(") # query the full vector of the o-th solution solutions.append(m.getAttr('Xn',x)) #查询第o个解的完整向量