我正在尝试使用Jenetics进行多目标优化问题(MOP)。我创建的一个玩具问题是在给定的每个子集都有限制的情况下,从给定的集合中选择两个子集,以使其总和最大化。
但是,我想确保两个子集互斥。创建两个染色体的基因型时,如何设置此约束?

我用于玩具问题的集合是:

private static final ISeq<Integer> SET = ISeq.of( IntStream.rangeClosed( 1, 10 )
            .boxed()
            .collect( Collectors.toList() ) );


我的问题的签名是:

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


编解码器是:

@Override public Codec<List<ISeq<Integer>>, BitGene> codec() {
        Objects.requireNonNull( SET );
        final Genotype<BitGene> g =
                Genotype.of( BitChromosome.of( SET.length() ), BitChromosome.of( SET.length() ) );
        return Codec.of(
                g,
                gc -> gc.stream().map( z -> z.as( BitChromosome.class ).ones().mapToObj( SET )
                        .collect( ISeq.toISeq() ) ).collect( Collectors.toList() )
        );
    }


我为第一个子集指定了9个限制,为第二个子集指定了4个限制。

我期望两个互斥基因的染色体的初始种群,这样表型最终会产生没有SET重复项的个体。

我当前得到的示例输出是:

[[4,5], [4]]


但是我希望两个人都有互斥的物品。 Jenetics如何做到这一点?

最佳答案

这不是问题的唯一可能编码,因为每个问题都有其自身的特征。对于多背包问题,我会选择IntegerChromosome而不是BitChromosomes

private static final ISeq<Integer> ITEMS = IntStream.rangeClosed(1, 10)
    .boxed()
    .collect(ISeq.toISeq());

public Codec<ISeq<List<Integer>>, IntegerGene> codec(final int knapsackCount) {
    return Codec.of(
        Genotype.of(IntegerChromosome.of(
            0, knapsackCount, ITEMS.length())
        ),
        gt -> {
            final ISeq<List<Integer>> knapsacks = IntStream.range(0, knapsackCount)
                .mapToObj(i -> new ArrayList<Integer>())
                .collect(ISeq.toISeq());

            for (int i = 0; i < ITEMS.length(); ++i) {
                final IntegerGene gene = gt.get(0, i);
                if (gene.intValue() < knapsackCount) {
                    knapsacks.get(gene.intValue()).add(ITEMS.get(i));
                }
            }

            return knapsacks;
        }
    );
}


上面给出的编解码器选择一个IntegerChromoses,其长度为背包项目的数量。它的基因范围将大于背包的数量。第i项将放入染色体索引为IntegerChromosome.get(0, i).intValue()的背包中。如果索引超出有效范围,则跳过该项目。这种编码将保证项目的明确划分。

关于java - 使用Jenetics创建基因型时的约束,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58452013/

10-11 04:40