Поскольку генетический алгоритм является стохастическим — то есть, он делает случайный выбор — вы получаете немного отличающиеся результаты каждый раз, когда вы запускаете генетический алгоритм. Алгоритм использует MATLAB по умолчанию® поток псевдослучайного числа. Для получения дополнительной информации о потоках случайных чисел, смотрите RandStream
. Каждый раз ga
вызывает поток, его изменения состояния. Так, чтобы в следующий раз ga
вызывает поток, он возвращает различное случайное число. Это то, почему выход ga
отличается каждый раз, когда вы запускаете его.
Если необходимо воспроизвести результаты точно, можно вызвать ga
с выходным аргументом, который содержит текущее состояние потока по умолчанию, и затем сбрасывает состояние к этому значению перед выполнением ga
снова. Например, чтобы воспроизвести выход ga
примененный функция Рэстриджина, вызвать ga
с синтаксисом
rng(1,'twister') % for reproducibility [x,fval,exitflag,output] = ga(@rastriginsfcn, 2);
Предположим, что результаты
x,fval,exitflag
x = -1.0421 -1.0018 fval = 2.4385 exitflag = 1
Состояние потока хранится в output.rngstate
. Чтобы сбросить состояние, войти
stream = RandStream.getGlobalStream; stream.State = output.rngstate.State;
Если вы теперь запускаете ga
во второй раз вы получаете те же результаты как прежде:
[x,fval,exitflag] = ga(@rastriginsfcn, 2)
Optimization terminated: average change in the fitness value less than options.FunctionTolerance. x = -1.0421 -1.0018 fval = 2.4385 exitflag = 1
Примечание
Если вы не должны воспроизводить свои результаты, лучше не установить состояние потока, так, чтобы вы извлекли пользу из случайности в генетическом алгоритме.