Я бы хотел реализовать многоцелевую проблему с рюкзаком в 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);
}