工作执行时间,截止日期和处罚的工作顺序

时间:2018-05-13 12:54:14

标签: scheduling sequencing

如果工作未到期,有N个工作有执行时间,截止日期和处罚。每项工作的执行时间,截止日期和处罚可能有所不同。当时只能完成一项工作。所有工作都必须完成。任务是对工作(时间表)进行排序,惩罚将是最小的。

您对算法有什么想法,甚至可以分享一些代码示例吗?我真的很难接受这个任务。

2 个答案:

答案 0 :(得分:0)

问题的名称是"作业排序问题"虽然我没有自己的例子可以分享,但您可以查看此https://www.geeksforgeeks.org/job-sequencing-problem-set-1-greedy-algorithm/

答案 1 :(得分:0)

我认为当一个工作错过最后期限时的惩罚是一个常数w_j,它取决于工作j而不是它的迟到值。 在一般情况下,问题是NP Hard(在经典1||sum_j w_j U_j符号中为alpha|beta|gamma)。在特殊情况下,它是多项式,所有权重w_j都相等(最小化后期作业的数量)。

您可能会发现许多非常有效的特定于问题的算法来解决此特定问题。如果您对通用配方感兴趣可以解决这个问题,可以试试CP Optimizer [1],在OPL中解决它的公式如下:

int n = ...;
int  dd[j in 1..n] = ...; // Deadline for job j
int  pt[j in 1..n] = ...; // Processing time for job j
float w[j in 1..n] = ...; // Penalty for late job j

dvar interval job[j in 1..n] size pt[j]; // Decision variables

minimize sum(j in 1..n) ( w[j]*(endOf(job[j])>=dd[j]) );
subject to {
  noOverlap(all(j in 1..n) job[j]);
}

这是CP Optimizer中一个更好的公式,它利用了可选区间变量的概念:最大化等待在截止日期之前结束的已执行区间/活动的等待总和:

int n = ...;
int  dd[j in 1..n] = ...; // Deadline for job j
int  pt[j in 1..n] = ...; // Processing time for job j
float w[j in 1..n] = ...; // Penalty for late job j

dvar interval job[j in 1..n] optional in 0..dd[j] size pt[j]; // Decision variables

minimize n - sum(j in 1..n) ( w[j]*presenceOf(job[j]) );
subject to {
 noOverlap(all(j in 1..n) job[j]);
}

[1] P. Laborie,J。Rogerie,P。Shaw,P。Vilím。用于调度的IBM ILOG CP优化器。约束期刊。 2018年4月,第23卷,第2期,第210-250页。 http://ibm.biz/Constraints2018