跳到正文
格致开物MATHWIKI

加权和法

加权和法(weighted-sum method)把多个目标乘以非负权重后相加,形成一个标量目标。它常用于探索帕累托前沿,但权重的意义依赖目标单位,非凸问题的某些有效方案也可能永远选不到。

两个相互牵制的平方距离

设决策为 x∈[0,2],同时希望最小化 f1(x)=x2 和 f2(x)=(x−2)2。第一目标偏好零,第二目标偏好二。取 w1,w2≥0、w1+w2>0,标量目标为 J(x)=w1x2+w2(x−2)2=(w1+w2)(x−2w2w1+w2)2+4w1w2w1+w2. 平方中心总在区间内,故唯一最优点为 x∗=2w2/(w1+w2)。这也证明把所有权重同乘一个正数不改变最优点,通常可归一化为权重和等于一。

令 w1=w, w2=1−w。当 w=1/4,最优点为 x=3/2,目标向量为 (9/4,1/4);等权时得到 x=1 和 (1,1)。有解变式取 w=3/4,得到 x=1/2 和 (1/4,9/4)。权重增加使被重视的第一目标变小,但两目标值的比例不等于权重的反比。

两个平方距离目标的加权最优点沿前沿移动
w为第一目标的权重,三点对应w为0.75、0.5、0.25;连线来自同一连续可行决策。

这整个区间都是帕累托有效的:若 x′<x,第一平方变小而第二平方变大;若 x′>x,变化方向相反。移动权重在本例中能遍历整条前沿,但这一性质需要另作论证,不能由加权定义直接推出。

正权重为何给出有效解

一般地,在非空可行集 X 上最小化目标向量 (f1,…,fm),各 fi 为实值函数。给定所有分量严格为正的权重,假定标量问题确有全局最小点 x∗。若存在 y∈X 使所有 fi(y)≤fi(x∗),且至少一个严格小于,乘以正权重相加便得 ∑iwifi(y)<∑iwifi(x∗),与全局最小矛盾。因此 x∗ 帕累托有效。这一充分性不要求目标或可行集凸。[1]

如果只要求权重非负且不全为零,同一证明只排除所有目标都严格改善的方案,因而保证的是弱有效。反例:可行目标只有 (0,1)、(0,2),用权重 (1,0) 时两者都最优,后者却被前者支配。原问题无最小点时,加权也不会凭空提供解;对非凸目标仅求得局部最小,更不能使用上述全局证明。

选不到的前沿成员

考虑只有三个可行目标向量的另一个问题:A=(0,3), M=(2,2), B=(3,0),两个目标均取小为好。三者都非支配;以 (w,1−w) 加权,三者分数分别为 3(1−w),2,3w。对任意 w∈[0,1],至少一个端点分数不超过 3/2,因此M永远不可能最优。

三个非支配目标中M不能由加权和选出
虚线仅连接两个端点用于比较,线段内部并未列为可行方案;任意权重下至少一个端点优于M。

这类非支配而不能由线性加权支持的目标称为非支持有效目标。三点间的线段在此问题中不可行,不能擅自把它们当成混合决策。对凸问题,有效点可在适当条件下由非负权重支持;该结论仍不能保证每个有效点都对应严格正权重,或每组权重只产生一个解。希望在非凸前沿上覆盖更多方案时,可以把一部分目标变成带阈值的约束,再改变阈值。

单位改变与可运行比较

若第一目标的数值单位变大一百倍,仍用原权重,实际目标变成 100w1x2+w2(x−2)2,解为 2w2/(100w1+w2)。例如等权时由一变成 2/101。为了表示相同偏好,需相应反向调整权重或说明使用的尺度;归一化本身也是建模选择,不能从数据自动推出决策者偏好。

下面使用 Python 3 标准库,按配方公式求连续主例,并逐一比较三点模型;返回点、两个目标值及分数,不改写传入点集。连续公式成本为常数;S个给定目标向量的比较为 O(S) 时间和 O(S) 返回表空间。程序只解决正文模型,没有把有限枚举当成一般多目标求解器。

Python 3
import math

def quadratic_weighted(w1, w2, scale1=1.0):
    if not all(math.isfinite(v) for v in (w1,w2,scale1)):
        raise ValueError("finite inputs required")
    if min(w1,w2) < 0 or w1+w2 <= 0 or scale1 <= 0:
        raise ValueError("nonnegative nonzero weights and positive scale required")
    x = 2*w2/(scale1*w1+w2)
    return x,(x*x,(x-2)**2)

def finite_weighted(points, w):
    if not 0 <= w <= 1:
        raise ValueError("weight must lie in [0,1]")
    table = [(tuple(p),w*p[0]+(1-w)*p[1]) for p in points]
    if not table:
        raise ValueError("nonempty point collection required")
    best = min(v for _,v in table)
    return [p for p,v in table if v == best],table

for w in (.25,.5,.75):
    print("continuous",w,quadratic_weighted(w,1-w))
    print("finite",w,finite_weighted([(0,3),(2,2),(3,0)],w))
print("rescaled",quadratic_weighted(.5,.5,100))
assert math.isclose(quadratic_weighted(.5,.5,100)[0],2/101)

输出三个连续解为1.5、1、0.5;三点模型在权重0.25、0.5、0.75时依次选择B、A与B并列、A,始终不会选择M。两目标方向必须先统一;若一个需要最大化,应先明确取负或另作一致变换。

参考文献

  1. ↑ Boyd and Vandenberghe, Convex Optimization,§4.7.3–4.7.4,支配关系与标量化。