首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据个人的健康值从个人名单中选择

根据个人的健康值从个人名单中选择
EN

Code Review用户
提问于 2018-05-26 00:01:06
回答 2查看 98关注 0票数 1

我有这样一种方法,它获取我的个人列表(类有公共字段fitnessValue)。我把所有的fitnessValue和起来,然后在fitnessValue和0之间画一个随机值。最后,我检查fitnessValue累积和超过我之前计算的点的每一个个体,并返回第一个通过的点。

代码语言:javascript
运行
复制
public Individual pickRandomIndividual(List<Individual> pool) {
    Double totalScore = 0d;
    Double runningScore = 0d;
    for (Individual ind : pool) {
        totalScore += ind.fitnessValue;
    }

    Double rnd = Math.random() * totalScore;

    for (Individual ind : pool) {
        if (rnd >= runningScore &&
                rnd <= runningScore + ind.fitnessValue) {
            return ind;
        }
        runningScore += ind.fitnessValue;
    }
    return null;
}  

我想用Java 8流重构这个函数。你知道我怎么能做到吗?

我把它改了一点,变成:

代码语言:javascript
运行
复制
Double fitnessSum = genePool.stream()
                .mapToDouble(individual -> individual.fitnessValue)
                .sum();
Double runningScore = 0d;

Double rnd = random() * fitnessSum;

for (Individual g : genePool) {
    if (rnd >= runningScore && rnd <= runningScore + g.fitnessValue) {
            return g;
    }
    runningScore += g.fitnessValue;
}
return null;

不过,我不知道如何把累积和部分变成一条小溪。也许整个逻辑实现得不好?我只想从列表中画一个Individual,这取决于个人的fitnessValue有多大。

EN

回答 2

Code Review用户

回答已采纳

发布于 2018-05-26 10:52:19

你必须记住,流并不是解决一切问题的方法。例如,在这种情况下,您需要跟踪多个值,即当前个体,以及累积和(并且必须在满足某个条件后立即返回一个值)。是的,有一些方法可以用流来实现这一点,但是我认为在这种情况下最好用一个简单的循环来实现它,就像您已经拥有的那样。

几个边注:

  • 使用原语类型double而不是包装类。
  • 尽可能晚地声明变量。
  • 也许允许用户传递一个Random实例。
  • 我认为您的实现可以通过减法来简化,这意味着您只需要检查< 0,例如: double fitnessSum = genePool.stream() .mapToDouble(个人-> individual.fitnessValue) .sum();double余数= Math.random() * fitnessSum;}返回genePool.get(genePool.size() - 1);
票数 3
EN

Code Review用户

发布于 2018-05-26 13:38:48

在只迭代一次的情况下,从Iterator中选择随机元素的经典解决方案也有这种变化:

代码语言:javascript
运行
复制
Double fitnessSum = 0.0;
Individual chosen = null;
for (Individual g : genePool) {
  fitnessSum += g.fitnessValue;
  if (Math.random() * fitnessSum < g.fitnessValue) {
    chosen = g;
  }
}
return g;
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/195191

复制
相关文章

相似问题

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