C 加权区间调度问题&;动态程序
我的问题是关于 我正在尝试将动态程序用于递归调用来实现该算法 问题陈述: 作业j开始于C 加权区间调度问题&;动态程序,c,algorithm,sum,max,intervals,C,Algorithm,Sum,Max,Intervals,我的问题是关于 我正在尝试将动态程序用于递归调用来实现该算法 问题陈述: 作业j开始于sj,结束于fj,并具有权重或值vj 如果两个作业不重叠,则可以兼容 目标:找到相互兼容作业的最大权重子集 books提出的解决方案是使用一个解决方案表来存储所有超问题,这些超问题在递归o迭代调用过程中需要时将被重用 解决问题的步骤如下: Input: n, s1,...,sn , f1,...,fn , v1,...,vn Sort jobs by finish times so that f1 >
sj
,结束于fj
,并具有权重或值vj
如果两个作业不重叠,则可以兼容
目标:找到相互兼容作业的最大权重子集
books提出的解决方案是使用一个解决方案表来存储所有超问题,这些超问题在递归o迭代调用过程中需要时将被重用
解决问题的步骤如下:
Input: n, s1,...,sn , f1,...,fn , v1,...,vn
Sort jobs by finish times so that f1 > f2 >... > fn.
Compute p(1), p(2), ..., p(n)
Where p(j) = largest index i < j such that job i is compatible with j.
for j = 1 to n
M[j] = empty <-- solution table
M[j] = 0
M-Compute-Opt(j) {
if (M[j] is empty)
M[j] = max(wj + M-Compute-Opt(p(j)), M-Compute-Opt(j-1))
return M[j]
}
-按完成时间对作业排序,以便f1>f2>…>fn
int compare(const void * a, const void * b) {
const job *ad = (job *) a;
const job *bd = (job *) b;
return (ad->stop - bd->stop);
}
//Jobs is filled above by parsing a datafile
qsort(jobs, njobs, sizeof(job), compare);
计算p(1),p(2),…,p(n)
其中p(j)=最大指数i/*bsearch for finding P(J) */
int jobsearch(int start, int high){
if (high == -1) return -1;
int low = 0;
int best = -1;
int mid;
int finish;
while (low <= high){
mid = (low + high) /2 ;
finish = jobs[mid].stop;
if (finish >= start){
high = mid-1;
}else{
best = mid;
low = mid + 1;
}
}
return best;
}
int best;
for (i = 0; i < njobs; i++){
solutions[i] = -1l; //solutions table is initialized as -1
best = jobsearch(jobs[i].start,i-1);
if (best != -1)
P[i] = best;
else
P[i] = 0;
}
我用大数据(从10k到1m随机生成的作业集)对几个测试用例运行我的程序,将我的输出与预期结果进行比较。在某些情况下,它失败了。有时我的输出比预期结果大一点,有时比预期结果小一点。我显然错过了一些东西。请注意,在大多数情况下,我的输出是正确的,因此我认为有一些特殊情况我无法正确处理
我找不出问题出在哪里
谢谢你的帮助
更新:
我将递归函数更改为迭代函数,现在所有测试文件的结果都是正确的。
我再也不明白为什么递归的一个不起作用让我们考虑琐碎的情况,一个工作。你会打电话的
long res = computeOpt(njobs-1); // computeOpt(0)
那么,你有
if (j == 0)
return 0;
内部computeOpt
。所以,你不能从一份工作中赚取任何东西
在一般情况下,你似乎忽略了第一份工作,由于上述行<代码>如果(j<0)应该工作得更好
PS在进入“10k到1m随机生成的作业集”之前,始终测试简单和琐碎的情况。它们更容易验证和调试。TNX!我从头开始重写我的程序。结束是的。最后问题得到了解决。如果我们使用递归方法,有必要在完成时对输入进行排序。我编写了一个递归解决方案,它要么接受作业,要么不接受作业,而不排序输入作业。
long res = computeOpt(njobs-1); // computeOpt(0)
if (j == 0)
return 0;