Решите задачи линейного программирования
Решатель линейного программирования
Находит минимум задачи, заданной в
f, x, b, beq, lb, и ub являются векторами и A, и Aeq матрицы.
Примечание
linprog
применяется только к основанному на решателе подходу. Для обсуждения двух подходов оптимизации смотрите Первый выбор Основанного на проблеме или Основанный на решателе подход.
задает набор нижних и верхних границ переменных проектов, x
= linprog(f
,A
,b
,Aeq
,beq
,lb
,ub
)x
, так что решение всегда находится в области значений lb ≤ x ≤ ub
. Задайте Aeq = []
и beq = []
если равенств не существует.
Примечание
Если заданные входные ограничения для задачи несогласованны, выход fval
является []
.
находит минимум для x
= linprog(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
Получите выходной флаг и структуру output, чтобы лучше понять процесс решения и качество.
В данном примере используйте следующие линейные ограничения неравенства:
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');
Решите линейную программу и запросите значение функции, выходной флаг и структуру output.
[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
элементы.
Для примера рассмотрим эти неравенства:
<reservedrangesplaceholder1> 1 + 2 <reservedrangesplaceholder0> 2 10
3 <reservedrangesplaceholder1> 1 + 4 <reservedrangesplaceholder0> 2 20
5 <reservedrangesplaceholder1> 1 + 6 <reservedrangesplaceholder0> 2 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
элементы.
Для примера рассмотрим эти равенства:
<reservedrangesplaceholder2> 1 + 2 <reservedrangesplaceholder1> 2 + 3 <reservedrangesplaceholder0> 3 = 10
2 <reservedrangesplaceholder2> 1 + 4 <reservedrangesplaceholder1> 2 + <reservedrangesplaceholder0> 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
.
Для примера рассмотрим эти неравенства:
<reservedrangesplaceholder1> 1 + 2 <reservedrangesplaceholder0> 2 10
3 <reservedrangesplaceholder1> 1 + 4 <reservedrangesplaceholder0> 2 20
5 <reservedrangesplaceholder1> 1 + 6 <reservedrangesplaceholder0> 2 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
.
Для примера рассмотрим эти равенства:
<reservedrangesplaceholder2> 1 + 2 <reservedrangesplaceholder1> 2 + 3 <reservedrangesplaceholder0> 3 = 10
2 <reservedrangesplaceholder2> 1 + 4 <reservedrangesplaceholder1> 2 + <reservedrangesplaceholder0> 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-компоненты меньше 1
, использовать ub = ones(size(f))
.
Типы данных: double
options
- Опции оптимизацииoptimoptions
| структуру следующим optimset
возвратыОпции оптимизации, заданные как выход optimoptions
или структуру как optimset
возвращает.
Некоторые опции применяются ко всем алгоритмам, а другие релевантны для конкретных алгоритмов. Подробную информацию см. в Ссылке по опциям оптимизации.
Некоторые опции отсутствуют в optimoptions
отображение. Эти опции выделены курсивом в следующей таблице. Для получения дополнительной информации см. раздел «Опции представления».
Все алгоритмы | |
Algorithm | Выберите алгоритм оптимизации:
Для получения информации о выборе алгоритма см. «Алгоритмы линейного программирования». |
Диагностика | Отобразите диагностическую информацию о функции, которая будет минимизирована или решена. Выберите |
| Level of display (см. Итеративное отображение):
|
| Максимально допустимое количество итераций, положительное целое число. Значение по умолчанию является:
См. Допуски и критерий остановки и итерации и счетчики функций. Для |
| Допуск на расторжение при двойной выполнимости, положительной скалярной величине. Значение по умолчанию является:
Для |
Алгоритм внутренней точки | |
ConstraintTolerance | Допустимый допуск для ограничений, скаляр от Для |
Предварительно обработать | Уровень предварительной обработки НД перед итерациями алгоритма. Задайте |
Алгоритм двойного симплекса | |
ConstraintTolerance | Допустимый допуск для ограничений, скаляр от Для |
MaxTime | Максимальное количество времени в секундах, которое запускает алгоритм. Значение по умолчанию является |
Предварительно обработать | Уровень предварительной обработки НД перед итерациями двойного симплексного алгоритма. Задайте |
Пример: options = optimoptions('linprog','Algorithm','interior-point','Display','iter')
problem
- Структура задачиСтруктура задачи, заданная как структура со следующими полями.
Имя поля | Вход |
---|---|
| Вектор линейной целевой функции f |
| Матрица для линейных ограничений неравенства |
| Вектор для линейных ограничений неравенства |
| Матрица для линейных ограничений равенства |
| Вектор для линейных ограничений равенства |
lb | Вектор нижних границ |
ub | Вектор верхних границ |
| 'linprog' |
| Опции, созданные с optimoptions |
Вы должны поставить по крайней мере solver
поле в problem
структура.
Типы данных: struct
x
- РешениеРешение, возвращенное как вектор действительных чисел или действительный массив. Размер x
совпадает с размером f
.
fval
- Значение целевой функции в решенииЗначение целевой функции в решении, возвращаемое как действительное число. Обычно fval
= f'*x
.
exitflag
- Причины linprog
остановленныйПричины linprog
stop, возвращается как целое число.
| Решение допустимо относительно относительных |
| Функция сходится к решению |
| Превышено количество итераций |
| Допустимая точка не найдена. |
| Задача неограниченна. |
|
|
| Как основные, так и двойственные задачи недопустимы. |
| Направление поиска стало слишком маленьким. Дальнейшего прогресса достичь не удалось. |
| Решатель потерял выполнимость. |
Флаги выходов 3
и -9
относятся к решениям, которые имеют большие несоответствия. Они обычно возникают из-за линейных матриц ограничений, которые имеют большое число обусловленности или задач, которые имеют большие компоненты решения. Чтобы исправить эти проблемы, попробуйте масштабировать матрицы коэффициентов, исключить избыточные линейные ограничения или задать более жесткие ограничения для переменных.
output
- Информация о процессе оптимизацииИнформация о процессе оптимизации, возвращенная как структура с этими полями.
iterations | Количество итераций |
algorithm | Используемый алгоритм оптимизации |
cgiterations | 0 (только алгоритм внутренней точки, включенный для обратной совместимости) |
message | Выходное сообщение |
constrviolation | Максимум ограничительных функций |
firstorderopt | Мера оптимальности первого порядка |
lambda
- множители Лагранжа в решенииМножители Лагранжа в решении, возвращенные как структура с этими полями.
Множители Лагранжа для линейных ограничений удовлетворяют этому уравнению с length(f)
компоненты:
основанный на Лагранже
Это соглашение о знаке соответствует соглашению о нелинейных решателях (см. Ограниченная теория оптимальности). Однако этот знак противоположен знаку во многих литературах линейного программирования, так что linprog
Множитель Лагранжа является негативом связанной «теневой цены».
Для получения описания смотрите Алгоритм Двойного Симплекса.
The 'interior-point-legacy'
метод основан на LIPSOL (Linear Interior Point Solver, [3]), который является вариантом алгоритма предиктора-корректора Мехротры [2], основного метода двойной внутренней точки. Ряд шагов предварительной обработки происходит до начала итерации алгоритма. См. раздел «Линейное программирование Interior-Point-Legacy».
Первый этап алгоритма может включать некоторую предварительную обработку ограничений (см. Interior-Point-Legacy Linear Programming). Несколько условий могут вызвать linprog
для выхода с сообщением о недопустимости. В каждом случае 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.
Если переменную singleton можно решить для, но решение нарушает верхние или нижние границы, то выходное сообщение является
Exiting due to infeasibility: Singleton variables in the equality constraints are not within bounds.
Примечание
Шаги предварительной обработки являются совокупными. Например, даже если ваша матрица ограничений не имеет строки всех нулей для начала, другие шаги предварительной обработки могут привести к возникновению такой строки.
Когда предварительная обработка заканчивается, итерационная часть алгоритма начинается до тех пор, пока не будут достигнуты критерии остановки. (Для получения дополнительной информации об невязках, основной задаче, двойственной задаче и связанных критериях остановки, смотрите Interior-Point-Legacy Linear Programming.) Если невязки растут вместо того, чтобы становиться меньше, или невязки не растут и не сжимаются, отображается одно из двух следующих сообщений о прекращении, соответственно,
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.
Для примера основной (целевой) может быть неограниченным, а основная невязка, который является мерой удовлетворенности основными ограничениями, может быть маленьким.
The 'interior-point'
алгоритм похож на 'interior-point-legacy'
, но с более эффективной стандартной программой факторизации и с другой предварительной обработкой. Смотрите Алгоритм Интерьерной Точки Linprog.
Задача Optimize Live Editor обеспечивает визуальный интерфейс для linprog
.
[1] Данциг, Г. Б., А. Орден и П. Вульф. Обобщенный метод симплекса для минимизации линейной формы при линейных ограничителях неравенства. Pacific Journal Math., Vol. 5, 1955, pp. 183-195.
[2] Mehrotra, S. «On the Implementation of a Primal-Dual Interior Point Point Method». SIAM Journal по оптимизации, том 2, 1992, стр. 575-601.
[3] Zhang, Y., «Решение масштабных линейных программ методами Interior-Point в среде MATLAB». Технический отчет TR96-01, отдел математики и статистики, Университета Мэриленда, округ Балтимор, Балтимора, Мэриленд, июль 1995.
intlinprog
| mpsread
| Оптимизировать | optimoptions
| prob2struct
| quadprog
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.