Jenetics中非本原类型的多目标问题

时间:2018-11-16 15:54:49

标签: java optimization genetic-algorithm

我想在Jenetics中用两个背包实现一个多目标背包问题,但是我遇到一些打字问题。我查看了https://www.rethinkdb.com/api/javascript/between/中的DTLZ1问题(据我所知,这是唯一可用的MOO示例),并将其映射到Jenetics manual类:

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...
    }

}

我以前使用以下类型签名(转换为Java)实现了Problem

Problem<ISeq<BitGene>, BitGene, Integer>

位置:

  • <ISeq<BitGene>:背包(不可变),按顺序排列。
  • BitGene:进化引擎的基因类型。
  • Integer:背包的适用性,即其利润。

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

Problem<ISeq<BitGene>[], BitGene, Vec<int[]>>

位置:

  • ISeq<BitGene>[]:多个背包(作为不可变的位序列)包裹在一个数组中。
  • BitGene:进化引擎的基因类型(与上面相同)。
  • int[]:背包的适用性,即利润。

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

@Override
public Codec<ISeq<BitGene>[], BitGene> codec() {
    return Codecs.ofVector(
            () -> {
                // What kind of supplier do I need?
            },
            NUMBER_OF_KNAPSACKS);
}

1 个答案:

答案 0 :(得分:1)

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

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,嵌套序列的大小为{{1} }。您的问题的签名为itmes.length()