Решите линейные проблемы программирования
Линейный решатель программирования
Находит минимум проблемы заданным
f, x, b, beq, lb и ub являются векторами, и A и Aeq являются матрицами.
linprog
применяется только к основанному на решателе подходу. Для обсуждения двух подходов оптимизации смотрите, Сначала Выбирают Problem-Based or Solver-Based Approach.
x = linprog(f,A,b)
x = linprog(f,A,b,Aeq,beq)
x = linprog(f,A,b,Aeq,beq,lb,ub)
x = linprog(f,A,b,Aeq,beq,lb,ub,options)
x = linprog(problem)
[x,fval]
= linprog(___)
[x,fval,exitflag,output]
= linprog(___)
[x,fval,exitflag,output,lambda]
= linprog(___)
задает набор нижних и верхних границ на переменных проекта, x
= linprog(f
,A
,b
,Aeq
,beq
,lb
,ub
)x
, так, чтобы решением всегда был в области значений lb ≤ x ≤ ub
. Установите Aeq = []
и beq = []
, если никакие равенства не существуют.
Если заданные входные границы для проблемы противоречивы, выводом fval
является []
.
находит минимум для x
= linprog(problem
)problem
, где problem
является структурой, описанной во Входных параметрах.
Создайте структуру problem
путем экспорта проблемы из приложения Оптимизации, как описано в Экспорте работы. Можно импортировать структуру problem
из файла MPS с помощью mpsread
. Можно также создать структуру problem
из объекта OptimizationProblem
при помощи prob2struct
.
Решите простую линейную программу, заданную линейными неравенствами.
В данном примере используйте эти линейные ограничения неравенства:
A = [1 1 1 1/4 1 -1 -1/4 -1 -1 -1 -1 1]; b = [2 1 2 1 -1 2];
Используйте целевую функцию .
f = [-1 -1/3];
Решите линейную программу.
x = linprog(f,A,b)
Optimal solution found.
x = 2×1
0.6667
1.3333
Решите простую линейную программу, заданную линейными неравенствами и линейными равенствами.
В данном примере используйте эти линейные ограничения неравенства:
A = [1 1 1 1/4 1 -1 -1/4 -1 -1 -1 -1 1]; b = [2 1 2 1 -1 2];
Используйте линейное ограничение равенства .
Aeq = [1 1/4]; beq = 1/2;
Используйте целевую функцию .
f = [-1 -1/3];
Решите линейную программу.
x = linprog(f,A,b,Aeq,beq)
Optimal solution found.
x = 2×1
0
2
Решите простую линейную программу с линейными неравенствами, линейными равенствами и границами.
В данном примере используйте эти линейные ограничения неравенства:
A = [1 1 1 1/4 1 -1 -1/4 -1 -1 -1 -1 1]; b = [2 1 2 1 -1 2];
Используйте линейное ограничение равенства .
Aeq = [1 1/4]; beq = 1/2;
Установите эти границы:
lb = [-1,-0.5]; ub = [1.5,1.25];
Используйте целевую функцию .
f = [-1 -1/3];
Решите линейную программу.
x = linprog(f,A,b,Aeq,beq,lb,ub)
Optimal solution found.
x = 2×1
0.1875
1.2500
'interior-point'
Решите линейную программу с помощью алгоритма 'interior-point'
.
В данном примере используйте эти линейные ограничения неравенства:
A = [1 1 1 1/4 1 -1 -1/4 -1 -1 -1 -1 1]; b = [2 1 2 1 -1 2];
Используйте линейное ограничение равенства .
Aeq = [1 1/4]; beq = 1/2;
Установите эти границы:
lb = [-1,-0.5]; ub = [1.5,1.25];
Используйте целевую функцию .
f = [-1 -1/3];
Установите опции использовать алгоритм 'interior-point'
.
options = optimoptions('linprog','Algorithm','interior-point');
Решите линейную программу с помощью алгоритма 'interior-point'
.
x = linprog(f,A,b,Aeq,beq,lb,ub,options)
Minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the selected value of the function tolerance, and constraints are satisfied to within the selected value of the constraint tolerance.
x = 2×1
0.1875
1.2500
linprog
Этот пример показывает, как настроить проблему с помощью основанного на проблеме подхода и затем решить его с помощью основанного на решателе подхода. Проблема
Создайте объект OptimizationProblem
под названием prob
, чтобы представлять эту проблему.
x = optimvar('x','LowerBound',-1,'UpperBound',1.5); y = optimvar('y','LowerBound',-1/2,'UpperBound',1.25); prob = optimproblem('Objective',x + y/3,'ObjectiveSense','max'); prob.Constraints.c1 = x + y <= 2; prob.Constraints.c2 = x + y/4 <= 1; prob.Constraints.c3 = x - y <= 2; prob.Constraints.c4 = x/4 + y >= -1; prob.Constraints.c5 = x + y >= 1; prob.Constraints.c6 = -x + y <= 2; prob.Constraints.c7 = x + y/4 == 1/2;
Преобразуйте проблемный объект в структуру задачи.
problem = prob2struct(prob);
Решите получившуюся структуру задачи.
[sol,fval,exitflag,output] = linprog(problem)
Optimal solution found.
sol = 2×1
0.1875
1.2500
fval = -0.6042
exitflag = 1
output = struct with fields:
iterations: 0
constrviolation: 0
message: 'Optimal solution found.'
algorithm: 'dual-simplex'
firstorderopt: 0
Возвращенный fval
отрицателен, даже при том, что компоненты решения положительны. Внутренне, prob2struct
превращает проблему максимизации в проблему минимизации отрицания целевой функции. Смотрите Максимизацию Цели.
Которому компонент sol
соответствует который переменная оптимизации? Исследуйте свойство Variables
prob
.
prob.Variables
ans = struct with fields:
x: [1x1 optim.problemdef.OptimizationVariable]
y: [1x1 optim.problemdef.OptimizationVariable]
Как вы можете ожидать, sol(1)
соответствует x
, и sol(2)
соответствует y
. См. Алгоритмы.
Вычислите значение функции решения и целевой функции для простой линейной программы.
Ограничения неравенства
A = [1 1 1 1/4 1 -1 -1/4 -1 -1 -1 -1 1]; b = [2 1 2 1 -1 2];
Целевая функция .
f = [-1 -1/3];
Решите проблему и возвратите значение целевой функции.
[x,fval] = linprog(f,A,b)
Optimal solution found.
x = 2×1
0.6667
1.3333
fval = -1.1111
Получите выходной флаг и выведите структуру, чтобы лучше понять процесс решения и качество.
В данном примере используйте эти линейные ограничения неравенства:
A = [1 1 1 1/4 1 -1 -1/4 -1 -1 -1 -1 1]; b = [2 1 2 1 -1 2];
Используйте линейное ограничение равенства .
Aeq = [1 1/4]; beq = 1/2;
Установите эти границы:
lb = [-1,-0.5]; ub = [1.5,1.25];
Используйте целевую функцию .
f = [-1 -1/3];
Установите опции использовать алгоритм 'dual-simplex'
.
options = optimoptions('linprog','Algorithm','dual-simplex');
Решите линейную программу и запросите значение функции, выходной флаг, и выведите структуру.
[x,fval,exitflag,output] = linprog(f,A,b,Aeq,beq,lb,ub,options)
Optimal solution found.
x = 2×1
0.1875
1.2500
fval = -0.6042
exitflag = 1
output = struct with fields:
iterations: 0
constrviolation: 0
message: 'Optimal solution found.'
algorithm: 'dual-simplex'
firstorderopt: 0
fval
, значение целевой функции, больше, чем Возвращают Значение Целевой функции, потому что существует больше ограничений.
exitflag
= 1 указывает, что решение надежно.
output.iterations
= 0 указывает, что linprog
нашел, что решение во время предварительно решает и не должно было выполнять итерации вообще.
Решите простую линейную программу и исследуйте решение и множители Лагранжа.
Используйте целевую функцию
f = [-5; -4; -6];
Используйте линейные ограничения неравенства
A = [1 -1 1 3 2 4 3 2 0]; b = [20;42;30];
Ограничьте все переменные быть положительными:
lb = zeros(3,1);
Установите Aeq
и beq
к []
, указав, что нет никаких линейных ограничений равенства.
Aeq = []; beq = [];
Вызовите linprog
, получив множители Лагранжа.
[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb);
Optimal solution found.
Исследуйте решение и множители Лагранжа.
x,lambda.ineqlin,lambda.lower
x = 3×1
0
15.0000
3.0000
ans = 3×1
0
1.5000
0.5000
ans = 3×1
1.0000
0
0
lambda.ineqlin
является ненулевым для вторых и третьих компонентов x
. Это указывает, что вторые и третьи линейные ограничения неравенства удовлетворены равенствами:
Проверяйте, что это верно:
A*x
ans = 3×1
-12.0000
42.0000
30.0000
lambda.lower
является ненулевым для первого компонента x
. Это указывает, что x(1)
в его нижней границе 0.
f
Вектор коэффициентовВектор коэффициентов, заданный как вектор действительных чисел или действительный массив. Вектор коэффициентов представляет целевую функцию f'*x
. Обозначение принимает, что f
является вектор-столбцом, но вы свободны использовать вектор - строку или массив. Внутренне, linprog
преобразовывает f
в вектор-столбец f(:)
.
Пример: f = [1,3,5,-6]
Типы данных: double
A
Линейные ограничения неравенстваЛинейные ограничения неравенства, заданные как действительная матрица. A
является M
-by-N
матрица, где M
является количеством неравенств, и N
является количеством переменных (длина f
). Для больших проблем передайте A
как разреженную матрицу.
A
кодирует M
линейные неравенства
A*x <= b
,
где x
является вектор-столбцом переменных N
x(:)
, и b
является вектор-столбцом с элементами M
.
Например, чтобы задать
x 1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,
дайте эти ограничения:
A = [1,2;3,4;5,6]; b = [10;20;30];
Пример: Чтобы указать, что x-компоненты составляют в целом 1 или меньше, возьмите A = ones(1,N)
и b = 1
Типы данных: double
Aeq
— Линейные ограничения равенстваЛинейные ограничения равенства, заданные как действительная матрица. Aeq
является Me
-by-N
матрица, где Me
является количеством равенств, и N
является количеством переменных (длина f
). Для больших проблем передайте Aeq
как разреженную матрицу.
Aeq
кодирует Me
линейные равенства
Aeq*x = beq
,
где x
является вектор-столбцом переменных N
x(:)
, и beq
является вектор-столбцом с элементами Me
.
Например, чтобы задать
x 1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x 3 = 20,
дайте эти ограничения:
Aeq = [1,2,3;2,4,1]; beq = [10;20];
Пример: Чтобы указать что сумма x-компонентов к 1, возьмите Aeq = ones(1,N)
и beq = 1
Типы данных: double
b
Линейные ограничения неравенстваЛинейные ограничения неравенства, заданные как вектор действительных чисел. b
является M
- вектор элемента, связанный с матрицей A
. Если вы передаете b
как вектор - строку, решатели внутренне преобразовывают b
в вектор-столбец b(:)
. Для больших проблем передайте b
как разреженный вектор.
b
кодирует M
линейные неравенства
A*x <= b
,
где x
является вектор-столбцом переменных N
x(:)
, и A
является матрицей размера M
-by-N
.
Например, чтобы задать
x 1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,
введите эти ограничения:
A = [1,2;3,4;5,6]; b = [10;20;30];
Пример: Чтобы указать что x сумма компонентов к 1 или меньше, используйте A = ones(1,N)
и b = 1
.
Типы данных: double
beq
— Линейные ограничения равенстваЛинейные ограничения равенства, заданные как вектор действительных чисел. beq
является Me
- вектор элемента, связанный с матрицей Aeq
. Если вы передаете beq
как вектор - строку, решатели внутренне преобразовывают beq
в вектор-столбец beq(:)
. Для больших проблем передайте beq
как разреженный вектор.
beq
кодирует Me
линейные равенства
Aeq*x = beq
,
где x
является вектор-столбцом переменных N
x(:)
, и Aeq
является матрицей размера Me
-by-N
.
Например, чтобы задать
x 1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x 3 = 20,
введите эти ограничения:
Aeq = [1,2,3;2,4,1]; beq = [10;20];
Пример: Чтобы указать что x сумма компонентов к 1, используйте Aeq = ones(1,N)
и beq = 1
.
Типы данных: double
lb
— Нижние границыНижние границы, заданные как вектор действительных чисел или действительный массив. Если длина f
равна тому из lb
, то lb
задает это
x(i) >= lb(i)
для всего i
.
Если numel(lb) < numel(f)
, то lb
задает это
x(i) >= lb(i)
для 1 <= i <= numel(lb)
.
В этом случае решатели выдают предупреждение.
Пример: указывать, что все x-компоненты положительны, lb = zeros(size(f))
Типы данных: double
ub
— Верхние границыВерхние границы, заданные как вектор действительных чисел или действительный массив. Если длина f
равна тому из ub
, то ub
задает это
x(i) <= ub(i)
для всего i
.
Если numel(ub) < numel(f)
, то ub
задает это
x(i) <= ub(i)
для 1 <= i <= numel(ub)
.
В этом случае решатели выдают предупреждение.
Пример: указывать, что все x-компоненты - меньше чем один, ub = ones(size(f))
Типы данных: double
опции
Опции оптимизацииoptimoptions
| структура как optimset
возвращаетсяОпции оптимизации, заданные как вывод optimoptions
или структуры как optimset
, возвращаются.
Некоторые опции применяются ко всем алгоритмам, и другие важны для конкретных алгоритмов. Дополнительную информацию см. в Ссылке Опций Оптимизации.
Некоторые опции отсутствуют в отображении optimoptions
. Эти опции появляются курсивом в следующей таблице. Для получения дополнительной информации, Опции вида на море.
Все алгоритмы | |
Algorithm | Выберите алгоритм оптимизации:
Для получения информации о выборе алгоритма см. Линейные Алгоритмы Программирования. |
Диагностика | Отобразите диагностическую информацию о функции, которая будет минимизирована или решена. Выберите |
| Уровень отображения (см. Итеративное Отображение):
|
| Максимальное количество позволенных итераций, положительное целое число. Значение по умолчанию:
Смотрите допуски и критерий остановки и итерации и функциональные количества. Для |
| Допуск завершения на двойной выполнимости, положительной скалярной величине. Значение по умолчанию:
Для |
Алгоритм внутренней точки | |
ConstraintTolerance | Допуск выполнимости к ограничениям, скаляру от Для |
Предварительно обработать | Уровень предварительной обработки LP до итераций алгоритма. Задайте |
Двойной симплексный алгоритм | |
ConstraintTolerance | Допуск выполнимости к ограничениям, скаляру от Для |
MaxTime | Максимальное количество времени в секундах, которые запускает алгоритм. Значением по умолчанию является |
Предварительно обработать | Уровень предварительной обработки LP до двойных симплексных итераций алгоритма. Задайте |
Пример: options = optimoptions('linprog','Algorithm','interior-point','Display','iter')
problem
— Структура задачиСтруктура задачи, заданная как структура со следующими полями.
Имя поля | Запись |
---|---|
| Линейный вектор целевой функции f |
| Матрица для линейных ограничений неравенства |
| Вектор для линейных ограничений неравенства |
| Матрица для линейных ограничений равенства |
| Вектор для линейных ограничений равенства |
lb | Вектор нижних границ |
ub | Вектор верхних границ |
| 'linprog' |
| Опции создаются с optimoptions |
Необходимо предоставить, по крайней мере, поле solver
в структуре problem
.
Самым простым способом получить структуру problem является экспорт задачи из Optimization app.
Типы данных: struct
x
РешениеРешение, возвращенное как вектор действительных чисел или действительный массив. Размер x
совпадает с размером f
.
fval
Значение целевой функции в решенииЗначение целевой функции в решении, возвращенном как вещественное число. Обычно fval
= f'*x
.
exitflag
Обоснуйте остановленный linprog
Обоснуйте, что остановленный linprog
, возвратился как целое число.
3 | Решение выполнимо относительно относительного допуска |
1 | Функция сходилась к решению |
0 | Количество итераций превысило |
-2 | Никакая допустимая точка не была найдена. |
-3 | Проблема неограниченна. |
-4 | Со значением |
-5 | И основные и двойные проблемы неосуществимы. |
-7 | Поисковое направление стало слишком маленьким. Никакие дальнейшие успехи не могли быть сделаны. |
-9 | Решатель потерял выполнимость. |
3
Exitflags и -9
относятся к решениям, которые имеют большой infeasibilities. Они обычно являются результатом линейных ограничительных матриц, которые имеют большой номер условия или проблемы, которые имеют большие компоненты решения. Чтобы исправить эти проблемы, попытайтесь масштабировать содействующие матрицы, устранить избыточные линейные ограничения или дать более трудные границы на переменных.
вывод
Информация о процессе оптимизацииИнформация о процессе оптимизации, возвращенном как структура с этими полями.
iterations | Количество итераций |
algorithm | Алгоритм оптимизации используется |
cgiterations | 0 (алгоритм внутренней точки только, включенный для обратной совместимости) |
message | Выходное сообщение |
constrviolation | Максимум ограничительных функций |
firstorderopt | Мера по оптимальности первого порядка |
Для описания см. Двойной Симплексный Алгоритм.
Метод 'interior-point-legacy'
основан на LIPSOL (Линейный Решатель Внутренней точки, [3]), который является вариантом алгоритма корректора предиктора Мехротры [2], основной двойной метод внутренней точки. Много шагов предварительной обработки происходят, прежде чем алгоритм начинает выполнять итерации. Смотрите Устаревшее внутренней точкой Линейное Программирование.
Первая стадия алгоритма может включить некоторую предварительную обработку ограничений (см. Устаревшее внутренней точкой Линейное Программирование). Несколько условий могут заставить linprog
выходить с сообщением infeasibility. В каждом случае linprog
возвращает отрицательный exitflag
, указывая, чтобы указать на отказ.
Если строка всех нулей обнаруживается в Aeq
, но соответствующий элемент beq
не является нулем, то выходное сообщение
Exiting due to infeasibility: An all-zero row in the constraint matrix does not have a zero in corresponding right-hand-side entry.
Если один из элементов x
, как находят, не ограничен ниже, то выходное сообщение
Exiting due to infeasibility: Objective f'*x is unbounded below.
Если одна из строк Aeq
имеет только один ненулевой элемент, то присваиваемое значение в x
называется одноэлементной переменной. В этом случае значение того компонента x
может быть вычислено из Aeq
и beq
. Если вычисленное значение нарушает другое ограничение, то выходное сообщение
Exiting due to infeasibility: Singleton variables in equality constraints are not feasible.
Если одноэлементная переменная может быть решена для, но решение нарушает верхние или нижние границы, то выходное сообщение
Exiting due to infeasibility: Singleton variables in the equality constraints are not within bounds.
Шаги предварительной обработки совокупны. Например, даже если ваша матрица ограничений не ссорится всех нулей для начала, другие шаги предварительной обработки могут заставить такую строку происходить.
Когда предварительная обработка заканчивается, итеративная часть алгоритма начинается, пока критерию остановки не соответствуют. (Для получения дополнительной информации о невязках, основной проблеме, двойная проблема и связанный критерий остановки, видят Устаревшее внутренней точкой Линейное Программирование.), Если невязки растут вместо того, чтобы стать меньшими, или невязки, ни не растут, ни уменьшаются, один из двух после сообщений завершения отображен, соответственно,
One or more of the residuals, duality gap, or total relative error has grown 100000 times greater than its minimum value so far:
или
One or more of the residuals, duality gap, or total relative error has stalled:
После того, как одно из этих сообщений отображено, оно сопровождается одним из следующих сообщений, указывающих, что двойное, основное, или оба, кажется, неосуществимы.
The dual appears to be infeasible (and the primal unbounded). (The primal residual < OptimalityTolerance.)
The primal appears to be infeasible (and the dual unbounded). (The dual residual < OptimalityTolerance.)
The dual appears to be infeasible (and the primal unbounded) since the dual residual > sqrt(OptimalityTolerance). (The primal residual < 10*OptimalityTolerance.)
The primal appears to be infeasible (and the dual unbounded) since the primal residual > sqrt(OptimalityTolerance). (The dual residual < 10*OptimalityTolerance.)
The dual appears to be infeasible and the primal unbounded since the primal objective < -1e+10 and the dual objective < 1e+6.
The primal appears to be infeasible and the dual unbounded since the dual objective > 1e+10 and the primal objective > -1e+6.
Both the primal and the dual appear to be infeasible.
Например, основное (цель) может быть неограниченным и основная невязка, которая является мерой основной ограничительной удовлетворенности, может быть маленьким.
Алгоритм 'interior-point'
подобен 'interior-point-legacy'
, но с более эффективной стандартной программой факторизации, и с различной предварительной обработкой. Смотрите Внутреннюю точку linprog Алгоритм.
[1] Dantzig, G.B., А. Орден и П. Вольф. “Обобщенный Симплекс-метод для Минимизации Линейной Формы Под Линейными Ограничениями Неравенства”. Тихоокеанская Математика Журнала., Издание 5, 1955, стр 183–195.
[2] Mehrotra, S. “На Реализации Основного Двойного Метода внутренней точки”. SIAM Journal на Оптимизации, Издании 2, 1992, стр 575–601.
[3] Чжан, Y., “Решая Крупномасштабные Линейные Программы Методами внутренней точки Под Средой MATLAB”. Технический отчет TR96-01, Отдел Математики и Статистики, Университета Мэриленда, округ Балтимор, Балтимора, MD, июль 1995.
intlinprog
| mpsread
| optimoptions
| prob2struct
| quadprog
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.