首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中使用递归的加权间隔调度

问在java中使用递归的加权间隔调度
EN

Stack Overflow用户
提问于 2013-10-28 06:23:56
回答 2查看 2.4K关注 0票数 1

加权区间调度问题是这样的:给定一组加权区间,选择一组不重叠的区间,使得总权重最大。加权间隔x可以由三元组x = (s,f,v)来表示,其中x的时间、x的时间、v=weight或x的值这些加权间隔可以由三元组(0,3,3) (1,4,2) (0,5,4) (3,6,1) (4,7,2) (3,9,5) (5,10,2) (8,10,1)来表示。这是该图的图片:http://imgur.com/vZn04xn

程序应打印出最优解的总权重值和选定区间的指标。在上述情况下,输出将类似于(此输出不正确)最优值:7间隔序列:2 5程序必须使用递归。

计算最优值的算法为: Input: n,s1,...,sn,f1,...,fn,v1,...,vn

按完成时间对作业进行排序,以便f1 > f2 >... > fn。计算p(1),p(2),…,p(n),其中p( j ) =最大索引i

代码语言:javascript
复制
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]
}

我已经创建了一个包含3个int的Job类: start、finish和weight。我有一个job类型的数组,在大小为8的数组中,每个点都有不同的间隔。问:如何计算每个作业间隔的p?

EN

回答 2

Stack Overflow用户

发布于 2013-10-28 21:49:19

听起来像是一个可以用动态编程解决的问题。

对于从1到n的每个i,保存可以计划的最大权重,以及用于这些权重的最后间隔的结束日期。您只存储可能感兴趣的权重。例如,区间1+4 (w=4)不如区间3 (w=4)有趣,因为后者在前者之前结束,并且总权重相同。

动态编程的诀窍是逐项移动,从1移动到n。在每一步,计算出在该步骤中可用的新数据是否会导致更好的答案、不同的可能答案或更差的答案。在进入下一步之前,只需要保存更好和不同的答案。

代码语言:javascript
复制
date    max weight  last interval
1       0           0
2       0           0
3       3           1
4       3           1
5       3 or 4      1 or 3 
6       4           3
7       4 or 5      3 or 5
8       4 or 5      3 or 5
9       5 or 8      5 or 6 
10      last step is for you, if I did not make mistakes in other rounds...
票数 0
EN

Stack Overflow用户

发布于 2015-11-05 10:36:45

这可能会有帮助……

代码语言:javascript
复制
public static int p(int index){
    for(int i=(index-1); i >=0; i--){
        if(f[i] <= s[index-1])  return i;
    }
    return -1;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19624369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档