我正在尝试使用动态编程对间隔调度问题进行编程。所有工作都有不同的(正)权重并且不重叠。这些权重代表不同的运行时间。作业之间可能存在三个“间隙”的空闲时间。此外,每个作业的每个时间单位(以秒为单位)占用一个资源。资源都可以具有不同的值。我想使用动态编程算法(递归)找到所有作业的最小资源总和。
举个例子可能会更清楚:
假设您有 3 个工作,time units { 2, 2, 3 }
并且您有一个 8 长的资源列表{ 2, 5, 1, 8, 4, 1, 1, 5 }
。作业一需要两个时间单位,因此需要两个资源,因为它是第一个作业,它将占用资源列表的前 2 个资源。工作二不必在工作一之后立即开始,它也可以从接下来的三个“间隙”之一开始。第二个工作也需要两个资源,因为它可以从三个差距之一开始,而不是第一个工作,所以它可以利用的资源的可能性是(1,8) (8,4) (4,1) (1,1) = 9 12 5 2
(可用资源的不同总和)。所有工作的总和当然小于资源的数量。
这一直持续到所有作业完成。我想使用动态编程算法(递归)找到所有作业的最小资源总和。
我尝试了不同的求解方法,但我发现在没有任何其他函数的情况下很难递归求解。
我确实编写了以下代码,但没有按预期执行:
public static double getCost(int t, int q, int r, int[] jobs, double[] resources){
double table[][] = new double[t+1][r+1];
for(int i = 0;i < t;i++){
for(int j = 0;j < r;j++){
double cost = 0;
for(int k = j-jobs[i] + 1;k <= j;k++){
if(k < 0){
break;
}
cost = cost + resources[k];
}
double min = Double.POSITIVE_INFINITY;
for(int l = 1;l <= q;l++){
if(i == 0 && l == 1){
min = cost+j-jobs[0]-l;
}
else{
double neww = cost+j-jobs[i]-l;
if(neww < min){
min = neww;
}
}
}
table[i+1][j+1] = min;
}
}
return table[t][r];
}
有人可以给我一些建议吗?