Matlab использует fminsearch для оптимизации нескольких переменных

Я использую Matlab fminsearch, чтобы минимизировать уравнение с двумя переменными sum((interval-5).^2, 2)*factor. Интервал - это вектор, содержащий 5 значений. Их можно выбирать только последовательно от значения 1 до 30 с размером шага 1. Коэффициент - это значение от 0,1 до 0,9.

Код ниже. Я думаю, что значения интервала верны, но значение коэффициента неверно.

Значение интервала: [3 4 5 6 7] значение коэффициента: 0,6 Конечный результат: 6

Я думаю, что значение коэффициента должно быть 0,1, а конечный результат должен быть равен 1 как глобальный минимум.

%% initialization of problem parameters
minval = 1;
maxval = 30;
step = 1;
count = 5;

minFactor = 0.1;
maxFactor = 0.9;

%% the objective function
fun = @(interval, factor) sum((interval-5).^2, 2)*factor;

%% a function that generates an interval from its initial value
getinterval = @(start) floor(start) + (0:(count-1)) * step;
getfactor =@(start2) floor(start2 * 10)/10;

%% a modified objective function that handles constraints
objective = @(start, start2) f(start, fun, getinterval, minval, maxval, getfactor, minFactor, maxFactor);

%% finding the interval that minimizes the objective function
start = [(minval+maxval)/2 (minFactor+maxFactor)/2];
y = fminsearch(objective, start);
bestvals = getinterval(y(1));
bestfactor = getfactor(y(2));

eval = fun(bestvals,bestfactor);
disp(bestvals)
disp(bestfactor)
disp(eval)

В коде используется следующая функция f.

function y = f(start, fun, getinterval, minval, maxval, getfactor, minFactor, maxFactor)
   interval = getinterval(start(1));
   factor = getfactor(start(2));
   if (min(interval) < minval) || (max(interval) > maxval) || (factor<minFactor) || (factor>maxFactor)
       y = Inf;
       else
          y = fun(interval, factor);
       end
   end

Я попробовал функцию GA, как предложил Адам. Я изменил его на два разных набора, учитывая тот факт, что мои переменные относятся к разным диапазонам и шагам. Вот мои изменения.

step1 = 1;
set1 = 1:step1:30;

step2 = 0.1;
set2 = 0.1:step2:0.9;

% upper bound depends on how many integer used for mapping
ub = zeros(1, nvar);
ub(1) = length(set1);      
ub(2) = length(set2); 

Затем я изменил целевую функцию

% objective function
function y = f(x,set1, set2)
    % mapping
    xmap1 = set1(x(1));
    xmap2 = set2(x(2));

    y = (40 - xmap1)^xmap2;

end

Я думаю, что после запуска кода я получил нужный ответ.


person SimaGuanxing    schedule 22.11.2019    source источник
comment
Решатель найдет некоторые проблемы, пытаясь решить вашу проблему. Во-первых, fminsearch подходит для неограниченной оптимизации, но вы сказали, что interval находится в диапазоне от 1 до 30 и factor от 0,1 до 0,9. Это предполагает, что вам следует попробовать другую функцию (см., Например, fmincon)   -  person Thales    schedule 23.11.2019
comment
Другая проблема заключается в том, что обычно алгоритм оптимизации оценивает / нуждается в производных для поиска оптимума. Если ваша функция имеет разрывы, алгоритм не будет работать должным образом.   -  person Thales    schedule 23.11.2019
comment
@Thales Спасибо за ответ. Я новичок в области оптимизации, не могли бы вы дать мне демонстрацию с помощью fmincon?   -  person SimaGuanxing    schedule 23.11.2019
comment
В-третьих, если некоторые из ваших переменных могут принимать только целочисленные значения, то у вас другой класс проблем. Насколько мне известно, MATLAB в настоящее время не может справиться с этой проблемой с помощью обычных алгоритмов оптимизации. Вы можете решить проблему с помощью функции GA, если вы иметь набор инструментов глобальной оптимизации. Или, может быть, это может помочь.   -  person Thales    schedule 23.11.2019
comment
@Thales Не могли бы вы привести мне пример использования функции ga в моем случае? Я ценю вашу помощь.   -  person SimaGuanxing    schedule 23.11.2019
comment
Является ли проблема в вопросе примером или реальной проблемой, которую вы хотите оптимизировать? Поскольку пространство параметров довольно мало, вы можете легко проверить все комбинации и увидеть глобальный минимум. В противном случае ga может быть вариантом.   -  person rinkert    schedule 23.11.2019
comment
@rinkert Это всего лишь пример, поэтому я могу убедиться, что это правильно. Настоящая проблема более сложная. Это даже не математическая проблема.   -  person SimaGuanxing    schedule 23.11.2019
comment
Связанный вопрос от OP: Matlab использует fminsearch для оптимизации интервала чисел   -  person SecretAgentMan    schedule 23.11.2019
comment
@SecretAgentMan Спасибо, что связали их.   -  person SimaGuanxing    schedule 25.11.2019
comment
В ответах идут ответы, а не сам вопрос, поэтому я откатил сообщение до состояния, в котором он содержал только вопрос. Чтобы люди знали, что существующий ответ работает, примите и / или проголосуйте за него. Если вы хотите показать, как вы изменили существующий ответ, чтобы он работал в вашем случае, опубликуйте ответ самостоятельно, это вполне приемлемо для SO. Обязательно укажите исходный ответ, и, если он будет незначительным, сделайте его вики сообщества.   -  person Adriaan    schedule 26.11.2019


Ответы (1)


Иллюстрация ga() оптимизации над набором

целевая функция

f = xmap(1) -2*xmap(2)^2  + 3*xmap(3)^3 - 4*xmap(4)^4 + 5*xmap(5)^5;

Установить

set = {1, 5, 10, 15, 20, 25, 30}

В наборе 7 элементов:

  • индекс 1 эквивалентен 1 Set(1)
  • индекс от 2 до 5 ...
  • индекс с 7 по 30 set(7)

Входные данные для ga будут находиться в диапазоне 1 to 7.
нижняя граница - 1, а верхняя граница - 7.

Оптимизация ga выполняется путем вычисления функции приспособленности, то есть путем оценки f по входной переменной.
В подсказках здесь будет использоваться integer as input, а позже при оценке f использовать mapping, только что обсужденный выше.


Код выглядит следующим образом

% settting option for ga
opts = optimoptions(@ga, ...
                    'PopulationSize', 150, ...
                    'MaxGenerations', 200, ...
                    'EliteCount', 10, ...
                    'FunctionTolerance', 1e-8, ...
                    'PlotFcn', @gaplotbestf);

% number of variable
nvar = 5;   

% uppper bound is 1
lb = ones(1, nvar);

step = 2.3;
set = 1:step:30;
limit = length(set);

% upper bound depends on how many integer used for mapping
ub = limit.*lb;      

% maximization, used the opposite of f as ga only do minimization
% asking ga to minimize -f is equivalent to maximize f
fitness = @(x)-1*f(x, step, set);
[xbest, fbest, exitflag] = ga(fitness,nvar, [], [], [], [], lb, ub, [], 1:nvar, opts);  

% get the discrete integer value and find their correspond value in the set
mapx = set(xbest)



% objective function
function y = f(x, step, set)
l = length(x);

% mapping
xmap = zeros(1, l);
for i = 1:l
    xmap(i) = set(x(i));
end



y = xmap(1) -2*xmap(2)^2  + 3*xmap(3)^3 - 4*xmap(4)^4 + 5*xmap(5)^5;

end
person Adam    schedule 23.11.2019
comment
Спасибо, что поделились примером использования GA. Как вы можете обрабатывать переменную на разных этапах? Скажем, у меня есть одна переменная от 1 до 30 с шагом 0,1, а другая - от 0,1 до 0,9 с размером шага 0,1. Спасибо! - person SimaGuanxing; 25.11.2019
comment
См. Мой обновленный комментарий к исходной ветке. Спасибо! - person SimaGuanxing; 26.11.2019