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 プログラマーですが、最適化ライブラリの経験は限られています。