🐙

Pythonアルゴリズム(線形緩和法)

2024/10/17に公開

線形緩和法(もしくは緩和問題)は、貪欲法と似ているが、目的は「上界」を計算すること

def optimizeRelaxedKP(c, w, b):
    # 価値/重量の比率を計算し、この比率でアイテムを降順にソート
    ratio = c / w
    sorted_indices = np.argsort(-ratio)
    c, w = c[sorted_indices], w[sorted_indices]

    x = np.zeros(c.shape, dtype=np.float64)  # 解ベクトル
    w_sum = 0  # 現在の総重量
    ub = 0  # 上界(緩和問題における目的関数値)

    for i in range(c.shape[0]):
        # 現在のアイテムを追加すると容量を超える場合は、部分的に追加
        if w_sum + w[i] > b:
            x[i] = (b - w_sum) / w[i]
            ub += c[i] * x[i]
            break
        # それ以外の場合はアイテム全体を追加
        w_sum += w[i]
        x[i] = 1
        ub += c[i]
    
    return x, ub

貪欲法と線形緩和法の違い
目的の違い:
貪欲法は近似的な解を求めるために使用される。このため、実行される結果はすぐに使える(実行可能)解であり、選ばれたアイテムの総価値の下界を示す。

線形緩和法は、理論的に取り得る最大の価値を求めるために使用されれる。このため、実行される結果は上界を示し、部分的に選んだアイテムも含める。得られた解は実行可能ではない場合もある(緩和された理論上の最大値であり、実際に全てのアイテムを入れられない可能性がある)。

変数名の違い:
貪欲法の結果として得られるのは「下界」 (lb) であり、近似的な解の価値
緩和問題の結果として得られるのは「上界」 (ub) であり、理論上取り得る最大の価値

使用される場面
貪欲法:
近似解を迅速に得たい場合や、最適解でなくても良い状況(特に制限された計算リソースで)。計算量が膨大な場合など

線形緩和法:
分枝限定法などで「上界」を計算する必要がある場合。これにより、探索を効率化し、不要な分枝を早期に刈ることができる。

Discussion