为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Jenetics 创建基因型时的限制

使用 Jenetics 创建基因型时的限制

牛魔王的故事 2023-11-10 16:12:59
我正在使用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 实现这一目标?
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

这不是问题的唯一可能的编码,因为每个问题都有其自己的特征。对于多背包问题,我会选择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()。如果索引超出有效范围,则跳过该项目。这种编码将保证项目的明确划分。


查看完整回答
反对 回复 2023-11-10
?
繁花如伊

TA贡献2012条经验 获得超12个赞

如果您想要一组不同的基因,则必须定义两组不同的基因。


private static final ISeq<Integer> SET1 = IntStream.rangeClosed(1, 10)

    .boxed()

    .collect(ISeq.toISeq());


private static final ISeq<Integer> SET2 = IntStream.rangeClosed(11, 20)

    .boxed()

    .collect(ISeq.toISeq());



public Codec<ISeq<ISeq<Integer>>, BitGene> codec() {

    return Codec.of(

        Genotype.of(

            BitChromosome.of(SET1.length()),

            BitChromosome.of(SET2.length())

        ),

        gt -> ISeq.of(

            gt.getChromosome(0).as(BitChromosome.class).ones()

                .mapToObj(SET1)

                .collect(ISeq.toISeq()),

            gt.getChromosome(1).as(BitChromosome.class).ones()

                .mapToObj(SET2)

                .collect(ISeq.toISeq())

        )

    );

}

通过这两个整数集,您将保证独特性。


查看完整回答
反对 回复 2023-11-10
  • 2 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信