surrogateopt
, Основанный на проблемеНекоторые проблемы требуют, чтобы вы нашли точку, которая удовлетворяет всем ограничениям без целевой функции, чтобы минимизировать. Например, предположите, что у вас есть следующие ограничения:
Сделайте любые точки удовлетворить ограничениям? Чтобы ответить на этот вопрос, необходимо выполнить выражения во множестве точек. 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.
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.
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
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
solve
| infeasibility
| surrogateopt