Решите задачу выполнимости Используя surrogateopt, Основанный на проблеме

Некоторые проблемы требуют, чтобы вы нашли точку, которая удовлетворяет всем ограничениям без целевой функции, чтобы минимизировать. Например, предположите, что у вас есть следующие ограничения:

(y+x2)2+0.1y21yexp(-x)-3yx-4.

Сделайте любые точки (x,y) удовлетворить ограничениям? Чтобы ответить на этот вопрос, необходимо выполнить выражения во множестве точек. surrogateopt решатель не требует, чтобы вы обеспечили начальные точки, и он ищет широкий набор точек. Так, surrogateopt работает хорошо на проблемы выполнимости.

Чтобы визуализировать ограничения, смотрите, Визуализируют Ограничения. Для основанного на решателе подхода к этой проблеме смотрите, Решают задачу Выполнимости.

Примечание: Этот пример использует две функции помощника, outfun и evaluateExpr. Код для каждой функции предоставлен в конце этого примера. Убедитесь, что код для каждой функции включен в конце вашего скрипта или в файле на пути.

Настройте проблему выполнимости

Для подхода, основанного на проблеме создайте переменные x оптимизации и y, и создайте выражения для перечисленных ограничений. Использовать surrogateopt решатель, необходимо установить конечные границы для всех переменных. Установите нижние границы –10 и верхние границы 10.

x = optimvar("x","LowerBound",-10,"UpperBound",10);
y = optimvar("y","LowerBound",-10,"UpperBound",10);
cons1 = (y + x^2)^2 + 0.1*y^2 <= 1;
cons2 = y <= exp(-x) - 3;
cons3 = y <= x - 4;

Создайте задачу оптимизации и включайте ограничения в проблему.

prob = optimproblem("Constraints",[cons1 cons2 cons3]);

Проблема не имеет никакой целевой функции. Внутренне, решатель устанавливает значение целевой функции к 0 для каждой точки.

Решите задачу

Решите задачу с помощью surrogateopt.

rng(1) % For reproducibility
[sol,fval] = solve(prob,"Solver","surrogateopt")
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0 contains 2 objects of type line. These objects represent Best function value (infeasible), Best function value.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol = struct with fields:
    x: 1.7917
    y: -3.1505

fval = 0

Первые несколько оцененных точек неосуществимы, как обозначено красным цветом в графике. Приблизительно после 90 оценок решатель находит допустимую точку, построенную в синем.

Проверяйте выполнимость в возвращенном решении.

infeasibility(cons1,sol)
ans = 0
infeasibility(cons2,sol)
ans = 0
infeasibility(cons3,sol)
ans = 0

Все infeasibilities являются нулем, указывая что точка sol выполнимо.

Остановите решатель в первой допустимой точке

Чтобы достигнуть решения быстрее, создайте выходную функцию (см. Выходную функцию), который останавливает решатель каждый раз, когда это достигает допустимой точки. outfun функция помощника в конце этого примера останавливает решатель, когда это достигает точки без нарушения ограничений.

Решите задачу с помощью outfun выходная функция.

opts = optimoptions("surrogateopt","OutputFcn",@outfun);
rng(1) % For reproducibility
[sol,fval] = solve(prob,"Solver","surrogateopt","Options",opts)
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0 contains 2 objects of type line. These objects represent Best function value (infeasible), Best function value.

Optimization stopped by a plot function or output function.
sol = struct with fields:
    x: 1.7917
    y: -3.1505

fval = 0

На этот раз решатель останавливается ранее, чем прежде.

Визуализируйте ограничения

Чтобы визуализировать ограничения, постройте точки, где каждая ограничительная функция является нулем при помощи fimplicit. fimplicit функционируйте передает числовые значения его функциям, тогда как evaluate функция требует структуры. Чтобы связать эти функции, используйте evaluateExpr функция помощника, которая появляется в конце этого примера. Эта функция просто помещает переданные значения в структуру с соответствующими именами.

Избегайте предупреждения, которое происходит потому что evaluateExpr функция не работает над векторизованными входными параметрами.

s = warning('off','MATLAB:fplot:NotVectorized');
figure
cc1 = (y + x^2)^2 + 0.1*y^2 - 1;
fimplicit(@(a,b)evaluateExpr(cc1,a,b),[-2 2 -4 2],'r')
hold on
cc2 = y - exp(-x) + 3;
fimplicit(@(a,b)evaluateExpr(cc2,a,b),[-2 2 -4 2],'k')
cc3 = y - x + 4;
fimplicit(@(x,y)evaluateExpr(cc3,x,y),[-2 2 -4 2],'b')
hold off

Figure contains an axes object. The axes object contains 3 objects of type implicitfunctionline.

warning(s);

Выполнимая область в красной схеме и ниже в синяках линии. Выполнимая область в нижнем правом углу красной схемы.

Функции помощника

Этот код создает outfun функция помощника.

function stop = outfun(~,optimValues,state)
stop = false;
switch state
    case 'iter'
        if optimValues.currentConstrviolation <= 0
            stop = true;
        end
end
end

Этот код создает evaluateExpr функция помощника.

function p = evaluateExpr(expr,x,y)
pt.x = x;
pt.y = y;
p = evaluate(expr,pt);
end

Смотрите также

| |

Похожие темы