prob2struct

Преобразуйте задачу оптимизации или проблему уравнения к форме решателя

Описание

пример

problem = prob2struct(prob) возвращает структуру задачи оптимизации, подходящую для основанного на решателе решения. Для нелинейных проблем, prob2struct создает файлы для целевой функции, и, при необходимости, для нелинейных ограничительных функций и вспомогательных файлов.

пример

problem = prob2struct(prob,x0) также преобразует начальную структуру точки x0 и включает его в problem.

пример

problem = prob2struct(___,Name,Value), для любых входных параметров, задает дополнительные опции с помощью одного или нескольких аргументов пары "имя-значение". Например, для нелинейной задачи оптимизации, problem = prob2struct(prob,'ObjectiveFunctionName','objfun1') задает тот prob2struct создает файл с именем целевой функции objfun1.m в текущей папке.

Примеры

свернуть все

Преобразуйте объект задачи оптимизации в структуру задачи.

Введите основную проблему MILP от Смешано-целочисленных Линейных Основ Программирования: основанный на проблеме.

ingots = optimvar('ingots',4,1,'Type','integer','LowerBound',0,'UpperBound',1);
alloys = optimvar('alloys',4,1,'LowerBound',0);

weightIngots = [5,3,4,6];
costIngots = weightIngots.*[350,330,310,280];
costAlloys = [500,450,400,100];
cost = costIngots*ingots + costAlloys*alloys;

steelprob = optimproblem;
steelprob.Objective = cost;

totalweight = weightIngots*ingots + sum(alloys);

carbonIngots = [5,4,5,3]/100;
molybIngots = [3,3,4,4,]/100;
carbonAlloys = [8,7,6,3]/100;
molybAlloys = [6,7,8,9]/100;

totalCarbon = (weightIngots.*carbonIngots)*ingots + carbonAlloys*alloys;
totalMolyb = (weightIngots.*molybIngots)*ingots + molybAlloys*alloys;

steelprob.Constraints.conswt = totalweight == 25;
steelprob.Constraints.conscarb = totalCarbon == 1.25;
steelprob.Constraints.consmolyb = totalMolyb == 1.25;

Преобразуйте проблему в intlinprog структура задачи.

problem = prob2struct(steelprob);

Исследуйте получившуюся линейную матрицу ограничения равенства и вектор.

Aeq = problem.Aeq
Aeq = 
   (1,1)       1.0000
   (2,1)       0.0800
   (3,1)       0.0600
   (1,2)       1.0000
   (2,2)       0.0700
   (3,2)       0.0700
   (1,3)       1.0000
   (2,3)       0.0600
   (3,3)       0.0800
   (1,4)       1.0000
   (2,4)       0.0300
   (3,4)       0.0900
   (1,5)       5.0000
   (2,5)       0.2500
   (3,5)       0.1500
   (1,6)       3.0000
   (2,6)       0.1200
   (3,6)       0.0900
   (1,7)       4.0000
   (2,7)       0.2000
   (3,7)       0.1600
   (1,8)       6.0000
   (2,8)       0.1800
   (3,8)       0.2400

beq = problem.beq
beq = 3×1

   25.0000
    1.2500
    1.2500

Исследуйте границы.

problem.lb
ans = 8×1

     0
     0
     0
     0
     0
     0
     0
     0

problem.ub
ans = 8×1

   Inf
   Inf
   Inf
   Inf
     1
     1
     1
     1

Решите задачу путем вызова intlinprog.

x = intlinprog(problem)
LP:                Optimal objective value is 8125.600000.                                          

Cut Generation:    Applied 3 mir cuts.                                                              
                   Lower bound is 8495.000000.                                                      
                   Relative gap is 0.00%.                                                          


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).
x = 8×1

    7.2500
         0
    0.2500
    3.5000
    1.0000
    1.0000
         0
    1.0000

Создайте нелинейную проблему в основанной на проблеме среде.

x = optimvar('x',2);
fun = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
prob = optimproblem('Objective',fun);
mycon = dot(x,x) <= 4;
prob.Constraints.mycon = mycon;
x0.x = [-1;1.5];

Преобразуйте prob к структуре задачи оптимизации. Назовите сгенерированный файл целевой функции 'rosenbrock' и ограничительный файл функции 'circle2'.

problem = prob2struct(prob,x0,'ObjectiveFunctionName','rosenbrock',...
    'ConstraintFunctionName','circle2');

prob2struct создает нелинейную цель и ограничительные файлы функции в текущей папке. Чтобы создать эти файлы в различной папке, используйте 'FileLocation' пара "имя-значение".

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

[x,fval] = fmincon(problem)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 2×1

    1.0000
    1.0000

fval = 4.6187e-11

Входные параметры

свернуть все

Задача оптимизации или проблема уравнения в виде OptimizationProblem возразите или EquationProblem объект. Создайте задачу оптимизации при помощи optimproblem; создайте проблему уравнения при помощи eqnproblem.

Предупреждение

Основанный на проблеме подход не поддерживает комплексные числа в целевой функции, нелинейных равенствах и нелинейных неравенствах. Если при вычислении функции встретится комплексное число, даже как промежуточное значение, конечный результат может оказаться неправильным.

Пример: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;

Пример: prob = eqnproblem; prob.Equations = eqs;

Начальная точка в виде структуры с именами полей равняется именам переменных в prob.

Для примера с помощью x0 с именованными индексными переменными смотрите, Создают Начальную Точку для Оптимизации с Именованными Индексными переменными.

Пример: если prob имеет переменные под названием x и y: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3].

Типы данных: struct

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: problem = prob2struct(prob,'FileLocation','C:\Documents\myproblem')

Имя нелинейного ограничительного файла функции создается prob2struct для задачи оптимизации в виде разделенной запятой пары, состоящей из 'ConstraintFunctionName' и имя файла. Этот аргумент применяется к fmincon или fminunc проблемы; смотрите problem. Не включайте расширение файла .m в имени файла. prob2struct добавляет расширение файла, когда оно создает файл.

Если вы не задаете ConstraintFunctionName, затем prob2struct перезаписи 'generatedConstraints.m'. Если вы не задаете FileLocation, затем prob2struct создает файл в текущей папке.

Возвращенный problem структура относится к этому файлу функции.

Пример: "mynlcons"

Типы данных: char | string

Имя нелинейного файла функции уравнения создается prob2struct для проблемы уравнения в виде разделенной запятой пары, состоящей из 'EquationFunctionName' и имя файла. Этот аргумент применяется к fsolvefzero, или lsqnonlin уравнения; смотрите problem. Не включайте расширение файла .m в имени файла. prob2struct добавляет расширение файла, когда оно создает файл.

Если вы не задаете EquationFunctionName, затем prob2struct перезаписи 'generatedEquation.m'. Если вы не задаете FileLocation, затем prob2struct создает файл в текущей папке.

Возвращенный problem структура относится к этому файлу функции.

Пример: "myequation"

Типы данных: char | string

Местоположение для сгенерированных файлов (целевая функция, ограничительная функция и другие подфайлы функции) в виде разделенной запятой пары, состоящей из 'FileLocation' и путь к перезаписываемой папке. Все сгенерированные файлы хранятся в этой папке; несколько папок не поддержаны.

Пример: 'C:Documents\MATLAB\myproject'

Типы данных: char | string

Имя файла целевой функции создается prob2struct для задачи оптимизации в виде разделенной запятой пары, состоящей из 'ObjectiveFunctionName' и имя файла. Этот аргумент применяется к fmincon или fminunc проблемы; смотрите problem. Не включайте расширение файла .m в имени файла. prob2struct добавляет расширение файла, когда оно создает файл.

Если вы не задаете ObjectiveFunctionName, затем prob2struct перезаписи 'generatedObjective.m'. Если вы не задаете FileLocation, затем prob2struct создает файл в текущей папке.

Возвращенный problem структура относится к этому файлу функции.

Пример: "myobj"

Типы данных: char | string

Опции оптимизации в виде разделенной запятой пары, состоящей из 'Options' и объект опций создается optimoptions. Создайте опции для соответствующего решателя; смотрите problem.

Пример: optimoptions('fmincon','PlotFcn','optimplotfval')

Выходные аргументы

свернуть все

Структура задачи, возвращенная как fmincon problem структура, fminunc problem структура, fsolve problem структура, intlinprog problem структура, linprog problem структура, lsqlin problem структура, lsqnonlin problemструктура или quadprog problem структура.

Следующая таблица дает получившийся проблемный тип для задач оптимизации.

Объективные и типы ограничения оптимизации (линейные ограничения включают границы),

Получившийся проблемный тип

Линейная цель и ограничительные функции.

По крайней мере одна переменная задачи имеет 'integer' ввод.

intlinprog

Линейная цель и ограничительные функции.

Никакая переменная задачи не имеет 'integer' ввод.

linprog

Линейные ограничительные функции.

Целевая функция является константой плюс сумма квадратов линейных выражений.

lsqlin

Связанные ограничения.

Целевая функция является константой плюс сумма квадратов общих нелинейных выражений.

lsqnonlin

Линейные ограничительные функции.

Общая квадратичная целевая функция.

quadprog

Общая нелинейная целевая функция.

Никакие ограничения.

fminunc

Общая нелинейная целевая функция, и существует по крайней мере одно ограничение любого типа.

Или, существует по крайней мере одна общая нелинейная ограничительная функция.

fmincon

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

Типы уравнения

Получившийся проблемный тип

Линейная система с или без границ

lsqlin

Скалярное (одно) нелинейное уравнение

fzero

Нелинейная система без ограничений

fsolve

Нелинейная система с границами

lsqnonlin

Примечание

Для нелинейных проблем, prob2struct создает файлы функции для объективных и нелинейных ограничительных функций. Для цели и ограничительных функций, которые вызывают функции поддержки, prob2struct также создает файлы функции поддержки и хранит их в FileLocation папка.

Для линейных и квадратичных задач оптимизации структура задачи включает дополнительное поле, f0, это представляет аддитивную постоянную для целевой функции. Если вы решаете структуру задачи с помощью заданного решателя, возвращенное значение целевой функции не включает f0 значение. Если вы решаете prob использование solve функция, возвращенное значение целевой функции включает f0 значение.

Если ObjectiveSense prob 'max' или 'maximize', затем problem использует отрицание целевой функции в prob потому что решатели минимизируют. Чтобы максимизировать, они минимизируют отрицание исходной целевой функции. В этом случае оптимальное значение функции, о котором сообщают, от решателя является отрицанием значения в исходной проблеме. Смотрите Максимизацию Цели. Вы не можете использовать lsqlin для проблемы максимизации.

Советы

  • Если вы вызываете prob2struct многократно на том же сеансе MATLAB® для нелинейных проблем, используйте ObjectiveFunctionName или EquationFunctionName аргумент и, при необходимости ConstraintFunctionName аргумент. Определение уникальных имен гарантирует, что получившиеся структуры задачи относятся к правильной цели и ограничительным функциям. В противном случае, последующие вызовы prob2struct может заставить сгенерированные нелинейные файлы функции перезаписывать существующие файлы.

  • Чтобы постараться не вызывать бесконечную рекурсию, не вызывайте prob2struct в цели или ограничительной функции.

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

Алгоритмы

Основанием для структуры задачи является неявное упорядоченное расположение всех переменных задачи в один вектор. Порядок переменных задачи совпадает с порядком Variables свойство в prob. Смотрите OptimizationProblem. Можно также найти порядок при помощи varindex.

Например, предположите, что переменные задачи находятся в этом порядке:

  • x — 3 2 4 массивами

  • y — 3 2 массив

В этом случае неявный переменный порядок эквивалентен, если переменной задачи является vars = [x(:);y(:)].

Первые 24 элемента vars эквивалентны x(:), и следующие шесть элементов эквивалентны y(:), для в общей сложности 30 элементов. Нижние и верхние границы соответствуют этому переменному упорядоченному расположению, и каждая линейная матрица ограничений имеет 30 столбцов.

Для проблем с общей нелинейной целью или ограничительными функциями, prob2struct создает файлы функции в текущей папке или в папке, заданной FileLocation. Возвращенный problem структура относится к этим файлам функции.

Введенный в R2017b

Для просмотра документации необходимо авторизоваться на сайте