我想在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中使用更自由选择的编码来定义问题。
1条答案
按热度按时间hpxqektj1#
Pymoo提供了这样的功能:https://pymoo.org/customization/custom.html