首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenetics中具有非本原型的多目标问题

Jenetics中具有非本原型的多目标问题
EN

Stack Overflow用户
提问于 2018-11-16 15:54:49
回答 1查看 263关注 0票数 2

我想用Jenetics中的两个背包实现一个多目标背包问题,但我很难解决一些打字问题。我看了一下DTLZ1问题,据我所知,Jenetics手册-which是唯一可用的MOO示例,并将其映射到Problem类:

代码语言:javascript
复制
public class DTLZ1 implements Problem<double[], DoubleGene, Vec<double[]>> {

    // Constants...

    public static void main(String[] args) {
        // Engine setup and evolution stream execution...
    }

    @Override
    public Function<double[], Vec<double[]>> fitness() {
        // Original fitness function...
    }

    @Override
    public Codec<double[], DoubleGene> codec() {
        // Original codec...
    }

}

我以前使用以下类型的签名(转换为Scala中的单目标背包问题 )实现了一个:

代码语言:javascript
复制
Problem<ISeq<BitGene>, BitGene, Integer>

其中:

  • <ISeq<BitGene>:作为(不可变的)位序列的背包。
  • BitGene:进化引擎的基因类型。
  • Integer:背包的适配性,即它的利润。

使用两个背包,我想到了(基于DTLZ1示例)这样的东西:

代码语言:javascript
复制
Problem<ISeq<BitGene>[], BitGene, Vec<int[]>>

其中:

  • ISeq<BitGene>[]:多个背包,作为(不变的)位序列,包装在一个数组中。
  • BitGene:进化引擎的基因类型(与上面相同)。
  • int[]:背包的适配,也就是他们的利润。

除了需要一些时间习惯的ISeq<BitGene>[] (我还可以使用List或类似的东西吗?)之外,我不知道如何创建一个合适的编解码器:

代码语言:javascript
复制
@Override
public Codec<ISeq<BitGene>[], BitGene> codec() {
    return Codecs.ofVector(
            () -> {
                // What kind of supplier do I need?
            },
            NUMBER_OF_KNAPSACKS);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-16 17:29:32

如果我正确理解了您的问题,编解码器将如下所示:

代码语言:javascript
复制
public static <T> Codec<ISeq<ISeq<T>>, BitGene>
codec(final ISeq<? extends T> items, final int knapsackCount) {
    return Codec.of(
        Genotype.of(
            BitChromosome.of(items.length()).instances()
                .limit(knapsackCount)
                .collect(ISeq.toISeq())
        ),
        gt -> gt.stream()
            .map(ch -> ch.as(BitChromosome.class))
            .map(ch -> ch.ones()
                .<T>mapToObj(items)
                .collect(ISeq.toISeq()))
            .collect(ISeq.toISeq())
    );
}

我使用的不是ISeq<T>[]数组,而是ISeq<ISeq<T>>,但是第一个序列的大小将是knapsackCount,嵌套序列的大小是itmes.length()。您的问题的签名将是Problem<ISeq<ISeq<T>>, BitGene, Vec<double[]>>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53341316

复制
相关文章

相似问题

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