如果工作未到期,有N个工作有执行时间,截止日期和处罚。每项工作的执行时间,截止日期和处罚可能有所不同。当时只能完成一项工作。所有工作都必须完成。任务是对工作(时间表)进行排序,惩罚将是最小的。
您对算法有什么想法,甚至可以分享一些代码示例吗?我真的很难接受这个任务。
答案 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