numpy pymoo中的动态列表作为决策变量

8e2ybdfx  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(174)

我想在pymoo中定义并行机调度问题,即我已经给出:

  • n_machines:表示机器数量的整数。
  • processing_times:数组,其中processing_time[i]是作业i的处理时间。
  • release_dates:Array其中release_dates[i]是作业i的发布日期。
  • due_dates:数组,其中due_dates[i]是作业i的到期日。

结果应该是一个列表的列表,每个列表都显示了相应机器上的作业顺序。
这是我目前掌握的情况:
类ParallelScheduling(ElementwiseProblem):

def __init__(self, n_machines, processing_times, release_dates, due_dates, **kwargs):

    self.n_jobs = processing_times.shape[0]
    self.n_machines = n_machines
    self.processing_times = processing_times
    self.release_dates = release_dates
    self.due_dates = due_dates
    
    super(ParallelScheduling, self).__init__(
        n_var=??,
        n_obj=2,
        xl=??,
        xu=??,
        vtype=int,
        **kwargs
    )

def _evaluate(self, X, out, *args, **kwargs):
    out["F"] = sum(np.sum(get_tardiness(x)) for x in X)
    out["G"] = -sum(np.sum(get_intime_jobs(x)) for x in X)

现在,决策变量是可变长度的列表,因为理论上每台机器可以有不同数量的作业,但我不确定如何实现这一点。
我提出的另一种解决方案是使用长度为n_jobs的数组,并将机器分配给其作业的索引(因此具有n_jobs决策变量,边界为0到n_machines),但这不包括作业在机器上执行的顺序,这与此相关。
这里的编码通常有点问题,因为我在所有地方都使用了numpy.array,但我现在才意识到,我不能用它们来创建包含不同大小数组的数组。
任何帮助都将不胜感激,无论是如何使用我已经使用的方法来做到这一点,还是如何在pymoo中使用更自由选择的编码来定义问题。

相关问题