Многоцелевая задача с не примитивными типами в дженетике - PullRequest
0 голосов
/ 16 ноября 2018

Я бы хотел реализовать многоцелевую проблему с рюкзаком в Jenetics, но я борюсь с некоторыми проблемами при наборе текста. Я взглянул на проблему DTLZ1 из руководства по Jenetics , которое, насколько мне известно, единственный доступный пример 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 я реализовал одноцелевую задачу о ранце, используя следующую сигнатуру типа (преобразованную в Java):

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 голосов
/ 16 ноября 2018

Если я правильно понимаю вашу проблему, кодек будет выглядеть так:

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[]>>.

...