Я пишу Пользовательские функции GA в MATLAB для смешанной целочисленной задачи.Подробнее о моей проблеме здесь и здесь .
После того, как колесо рулетки выбор завершен, Matlab обрывается с ошибкой:
Index exceeds matrix dimensions.
Error in stepGA (line 34)
xoverKids = feval(options.CrossoverFcn, parents(1:(2 * nXoverKids)),options,GenomeLength,FitnessFcn,thisScore,thisPopulation,options.CrossoverFcnArgs{:});
Error in galincon (line 62)
[score,population,state] = stepGA(score,population,options,state,GenomeLength,FitnessFcn);
Error in ga (line 374)
[x,fval,exitFlag,output,population,scores] = galincon(FitnessFcn,nvars, ...
Он прерывается на stepGA.m в:
xoverKids = feval(options.CrossoverFcn, parents(1:(2 * nXoverKids)),options,GenomeLength,FitnessFcn,thisScore,thisPopulation,options.CrossoverFcnArgs{:});
Точнее в parents(1:(2 * nXoverKids))
.
Мои переменные в то время:
nXoverKids = 7
nParents = 16
nEliteKids = 1
nMutateKids = 2
parents = 1 1
Выбор колеса My Roullete:
function parents = RouletteWheelSelection(expectation, nParents, options)
% ---------------------------------------------------------
% Roulette Wheel Selection Algorithm. A set of weights
% represents the probability of selection of each
% individual in a group of choices. It returns the chosen chromosome.
% ---------------------------------------------------------
r1 = rand;
r2 = rand;
index1 = sum(r1 >= cumsum([0, expectation']));
index2 = sum(r2 >= cumsum([0, expectation']));
parents = [index1, index2];
end
Из документации Matlab :
Функция возвращает родителей, вектор строки длины nParents, содержащий индексы выбранных вами родителей.
Я неправильно вернул из выбора?И почему nParents установлены на 16 ?
Мои другие варианты для GA:
options = gaoptimset(...
'PopulationSize', 10, ...
'Generations', 50, ...
'InitialPopulation', population.chromosomes(1,:),...
'SelectionFcn', @RouletteWheelSelection, ...
'CrossoverFcn', @Crossover, ...
'MutationFcn', @Mutation
);
lb = 1; % Lower bound on x
ub = 3; % Upper bound on x
nvars = 81;
rules = population.chromosomes(1, :);
x = ga(@(x)GaFitness(rules, sim_obj, EV_input_time_first, EV_input_time_second, inpxpath, layxpath, Results),...
nvars,[],[],[],[],lb,ub,[],[],options);
Также моя InitialPopulation population.chromosomes(1,:)
равна 1x81 размер .