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 之间的浮点数组成。我想确定帕累托前沿以最大化这两个值。

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