Реализация поиска алгоритма с помощью циклов for и функции fmincon - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь реализовать этот алгоритм для нахождения нового ограничения: enter image description here

В моем случае мы берем только 3 натуральных чисел, т.е. 1,2, 3.Наборы, связанные с этими натуральными числами: M1, M2 и M3.Вместо метода Ньютона в II(2) я выбрал решатель, предоставленный Matlab fmincon.Вот мой код, который не работает!

function[s_new]= checking2(M1,M2,M3,x)
M1=linspace(0,1,10)';
M2=linspace(0,1,100)';
M3=linspace(0,1,1000)'; 
bool1=0;
eta = 10^-8;
pocz=[];
max=-100;
x = [0.1,0.1]'; % warunek początkowy
A = [];
b = [];
Aeq = [];
beq = [];
Set=[0,1];
g = @(x,s) 5*x(1).^2.*sin(pi.*sqrt(s))./(1+s.^2) - x(2);
g_new = @(s) -g(x,s);

for i=1:length(M1)
    if g(x,M1(i,:))>eta
       s_new=M1(i,:);
       bool1=1;
    end
end
if ~bool1
    for i=1:length(M1)
        if g(x,M1(i,:))>max
           pocz=M1(i,:);
           max=g(x,M1(i,:));
        end
    end
    if max<-eta
        bool1=1;
    end
end
if ~bool1
    s_maybe = fmincon(g_new,pocz,A,b,Aeq,beq,min(Set),max(Set));
    if g(x,s_maybe)>eta
       s_new=s_maybe;
       bool1=1;
    end
end
if ~bool1
    for i=1:length(M2)
        if g(x,M2(i,:))>eta
           s_new=M2(i,:);
           bool1=1;
        end
     end
end
if ~bool1
    for i=1:length(M2)
        if g(x,M2(i,:))>max
           pocz=M2(i,:);
           max=g(x,M2(i,:));
        end
    end
    if max<-eta
    bool1=1;
    end
end
if ~bool1        
    s_maybe = fmincon(g_new,pocz,A,b,Aeq,beq,min(Set),max(Set));
    if g(x,s_maybe)>eta
       s_new=s_maybe;
       bool1=1;
    end
end
if ~bool1
    for i=1:length(M3)
        if g(x,M3(i,:))>eta
           s_new=M3(i,:);
           bool1=1;
        end
    end
end
if ~bool1
    s_new = 1;
end
disp(s_new);

Проблема в следующем:

Undefined function or variable 's_new'.

Error in checking2 (line 70)
disp(s_new);

Так что в принципе все может быть не так, но я полагаю, что-то с fmincon.

РЕДАКТИРОВАТЬ:

Цель алгоритма - найти минимум целевой функции f (x), удовлетворяющий всем ограничениям g (x, s) <= 0 для всех s в S, где S - бесконечное множество (некоторый интервал внаш случай). </p>

Что делает мой алгоритм, сначала он берет некоторое конечное подмножество S и вычисляет минимум f на этом множестве, затем я пытаюсь обновить S некоторым s_new.Этот алгоритм, который я пытаюсь реализовать, является именно процедурой создания s_new.Затем, если он работает должным образом, я добавлю s_new в мое подмножество и вычислю минимум на новом наборе и так далее, пока g (x, s) <= eta, где eta - небольшое число. </p>

1 Ответ

1 голос
/ 05 июля 2019

переписываю алгоритм, читаю комментарии

clc
clear

lb = 0;
ub = 1;

% Given 
l = 3;
M1=linspace(lb,ub,10)';
M2=linspace(lb,ub,100)';
M3=linspace(lb,ub,1000)'; 

% one boolean value for each Matrix
bool = zeros(1,3);

eta = 10^-8;
% Used as  fmincon  initial starting guess
pocz = nan;

% Used to store the new finding s that fits all the conditions
s_new = nan;

% Fixed x
x = [0.1,0]';

% fmincon linear constraints 
A = [];
b = [];
Aeq = [];
beq = [];

% Main function 
g = @(x,s) 5*x(1).^2*sin(pi*sqrt(s))/(1+s.^2) - x(2);

% Optimization concerns s only, don't include x as x is fixed 
g_new = @(s) -g(x,s);

% Assuming the maximum is reached at the upper bound, used in(II)(2)
max_s = ub;
maxfun = g(x, max_s);

% Use a cell, for each iteration use a specific matrix M
M = {M1, M2, M3};

for j = 1: length(M)
    % used in (II)(1)
    check = 0;
    step = 1;
    % (I) step 1
    for i = 1:length(M{j})

        % Stopping criteria

        if g(x, M{j}(i)) > eta
            s_new = M{j}(i);
            bool(j) = 1;
            break;
        else


          % Function maximum value for next step (II)
            if maxfun < g(x, M{j}(i))
                maxfun = g(x, M{j}(i));

                % To be used in fmincon as pocz
                max_s = M{j}(i);
            end


        end 
    % To be used in (II)(1)
        if maxfun < -eta
              check = 1;
        end
    end
    % End of (I)

    % Put (II)(1) here  step 2

     if ~bool(j) && check
            step = step + 1;
            % Stopping criteria 
            if step >= l
                disp('S_new not defined');
                break;
            end

            % otherwise go to the next M

      end

    % (II)(2) step 3
    if ~bool(j)
        step = step + 1;
        if maxfun >= -eta && maxfun <= eta 
            pocz = max_s;        
            bool(j) = 1;
        end

    end

    %% EDIT: if bool(j) changed to if ~bool(j)
    %  (II)(2) Continue
    if ~bool(j)
        s_maybe = fmincon(g_new,pocz,A,b,Aeq,beq,lb,ub);

        % End of (II)(2)


        % (II)(2)-1 step 4
        step = step + 1;  
        if g(x, s_maybe) > eta

            s_new = s_maybe;

            bool(j) = 1;
        end
        % End of (II)(2)-1
    end

        % Put (II)(2) here  step 5
        if ~bool(j)
            step = step + 1; 
            % Stopping criteria 
            if step >= l
                disp('S_new not defined');
                break;
            end

            % otherwise go to the next M

        end


end


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...