0

pymoo で多目的最適化問題を実装しようとしています。現在、それはパルプにおける単一目的の最適化問題です。

問題は、次の制約に従ってスコアの合計を最大化することです。

  • 100 項目の組み合わせを取得 (決定変数の合計 == 100)
  • 項目は 40 を超える組み合わせで表示することはできません (各項目について、項目の合計 * 決定変数 <= 40)
prob = pulp.LpProblem('ScoreOptimization', pulp.LpMaximize)

# items is a 2D array of 0 and 1
# each row reflects a combination of items
# each column is a distinct item
decision_vars = pulp.LpVariable.dicts('Item', range(items.shape[0]), cat='Binary')

# objective function - sum of scores
# scores is a 1D array, one score for each row in items
prob += pulp.lpSum([score * item for score, item in zip(decision_vars.values(), scores)])

# constraint - only want 100 item combinations
prob += pulp.lpSum(lineup_vars.values()) == 100

# constraint - no item appears more than 40 times
for column in np.arange(items.shape[1]):
    prob += pulp.lpSum([items[row, column] * decision_var for row in items[:, column]]) <= 40

Pymoo のドキュメントに従って、ベクトル化された評価を使用しようとしています。スコア配列に加えて、0 と 1 の間の float で構成される多様性配列もあります。両方の値を最大化するためのパレート フロントを特定したいと考えています。

class MyProblem(Problem):

    def __init__(self):
        super().__init__(n_var=2,
                         n_obj=2,
                         n_constr=2,
                         xl=np.array([-2,-2]),
                         xu=np.array([2,2]))

    def _evaluate(self, X, out, *args, **kwargs):
        f1 = X[:,0]**2 + X[:,1]**2
        f2 = (X[:,0]-1)**2 + X[:,1]**2

        g1 = 2*(X[:, 0]-0.1) * (X[:, 0]-0.9) / 0.18
        g2 = - 20*(X[:, 0]-0.4) * (X[:, 0]-0.6) / 4.8

        out["F"] = np.column_stack([f1, f2])
        out["G"] = np.column_stack([g1, g2])

この問題をどのように設定するかは、ドキュメントから明らかではありませんか? n_var は項目の行数に等しいと仮定しています。n_obj は 2 になります。制約の数を事前に計算する必要がありますか (ここでは 1 + 項目の列数になります)、それとも 2 だけですか? 決定変数はバイナリなので、xl=0 と xu=1 でしょうか?

評価については、目的関数の計算方法を理解しています。ただし、制約の計算には暗黙の <= 0 があるようで、100 個のアイテムの組み合わせの個々のアイテムの合計が <= 40 でなければならないことをどのように指定するかは不明です。

ご提案いただきありがとうございます。私は経験豊富な python プログラマーですが、最適化ライブラリの経験は限られています。

4

0 に答える 0