我想用Jenetics中的两个背包实现一个多目标背包问题,但我很难解决一些打字问题。我看了一下DTLZ1问题,据我所知,Jenetics手册-which是唯一可用的MOO示例,并将其映射到Problem类:
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中的单目标背包问题 )实现了一个:
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);
}发布于 2018-11-16 17:29:32
如果我正确理解了您的问题,编解码器将如下所示:
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[]>>。
https://stackoverflow.com/questions/53341316
复制相似问题