prob2struct

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

Синтаксис

problem = prob2struct(prob)
problem = prob2struct(prob,x0)
problem = prob2struct(___,Name,Value)

Описание

пример

problem = prob2struct(prob) возвращает структуру задачи оптимизации, подходящую для решения проблем с помощью linprog, intlinprog, quadprog, lsqlin, fmincon или fminunc. Для нелинейных проблем 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. Создайте проблему при помощи optimproblem.

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

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

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

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

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

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

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

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

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

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

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

Пример: "mynlcons"

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

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

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

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

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

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

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

Пример: "myobj"

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

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

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

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

свернуть все

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

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

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

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

По крайней мере одна проблемная переменная имеет тип 'integer'.

intlinprog

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

Никакая проблемная переменная не имеет тип 'integer'.

linprog

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

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

lsqlin

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

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

quadprog

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

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

fminunc

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

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

fmincon

Примечание

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

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

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

Советы

  • Если вы вызываете prob2struct многократно на том же сеансе MATLAB® для нелинейных проблем, используйте ObjectiveFunctionName и, при необходимости аргументы пары "имя-значение" 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