Я экспериментирую с проблемой многоцелевой оптимизации (MOP), используя Jenetics . Игрушечная проблема, которую я создал, состоит в том, чтобы выбрать два подмножества из данного набора, максимизируя их общую сумму, учитывая, что у каждого подмножества есть предел. Однако я хочу убедиться, что эти два подмножества являются взаимоисключающими. Как я могу установить это ограничение при создании генотипа двух хромосом?
Набор, который я использую для задачи с игрушкой:
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?