【发布时间】:2012-12-21 14:07:09
【问题描述】:
我正在尝试使用动态编程对间隔调度问题进行编程。所有工作都有不同的(正)权重并且不重叠。这些权重代表不同的运行时间。作业之间可能存在三个“间隙”的空闲时间。此外,每个作业的每个时间单位(以秒为单位)占用一个资源。资源都可以具有不同的值。我想使用动态编程算法(递归)找到所有作业的最小资源总和。
举个例子可能会更清楚:
假设您有三个time units { 2, 2, 3 } 的工作,并且您有一个包含八个长 { 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];
}
有人可以给我一些建议吗?
【问题讨论】:
标签: algorithm dynamic recursion scheduling intervals