Двойственные задачи часто используются для получения нижних (или верхних) оценок на целевой функционал в задачах оптимизации. Кроме этого, почти для любой осмысленной постановки задачи оптимизации двойственная задача имеет содержательную интерпретацию. То есть если Вы столкнулись с важной задачей оптимизации, то и ее двойственная тоже, скорее всего, важна.
В этой статье я расскажу про коническую двойственность. Этот способ построения двойственных задач, на мой взгляд, незаслуженно обделен вниманием…
Дальше матан…
Как обычно строят двойственные задачи?
Пусть дана некоторая задача оптимизации:
Двойственная задача строится по следующей схеме:
- Построить Лагранжиан
- Построить двойственную функцию
- Получить двойственную задачу
Главная сложность в этой схеме зашита в шаге поиска .
Если задача не является выпуклой, то это гроб — в общем случае она не решается за полиномиальное время (если ) и такие задачи в этой статье мы затрагивать в дальнейшем не будем.
Допустим, что задача выпуклая, что тогда?
Если задача гладкая, то можно воспользоваться условием оптимальности первого порядка . Из этого условия, если все Ок, получается вывести или и или напрямую функцию .
Если задача негладкая, то можно было бы воспользоваться аналогом условия первого порядка (здесь обозначает субдифференциал функции ), однако эта процедура, как правило, намного сложнее.
Иногда существует эквивалентная «гладкая» задача оптимизации и можно построить двойственную для нее. Но за улучшение структуры (из негладкой в гладкую) как правило всегда приходится платить увеличением размерности.
Коническая двойственность
Есть достаточно много задач оптимизации (примеры ниже), допускающих следующее представление:
где — матрица, — вектор, — невырожденный выпуклый конус.
В таком случае двойственная задача может быть построена по следующей схеме:
Двойственная задача строится по следующей схеме:
- Построить Лагранжиан
- Построить двойственную функцию
- Получить двойственную задачу
где сопряженный конус для конуса определяется как .
Как мы видим, вся сложность построения двойственной задачи была перенесена на построение двойственного конуса. Но в том и радость, что есть хороший calculus для построения двойственных конусов и очень часто двойственный конус можно выписать сразу.
Пример
Допустим, нам нужно построить двойственную задачу оптимизации для задачи:
Здесь ,
Первое, что можно заметить: целевую функцию всегда можно сделать линейной!
Вернее, всегда есть эквивалентная задача с линейной целевой функцией:
Вот сейчас нужно использовать немного тайного знания: множества и являются выпуклыми конусами.
Таким образом мы приходим к эквивалентной записи задачи:
Теперь мы можем сразу выписать двойственную задачу:
или, если немного упростить,
где .
Ссылки для дальнейшего изучения:
Комментарии (6)
S_A
02.12.2018 11:22Пример бы посодержательней… и собственно про содержательную интерпретацию двойственной задачи.
YuraDorn Автор
02.12.2018 12:49Изначально я начал писать пост про робастную оптимизацию, но там получилась большая простыня текста.
Поэтому я решил вынести технику построения двойственной задачи через конусы в отдельный небольшой пост, на который можно будет сослаться.
После публикации поста про робастную оптимизацию добавлю соответствующую ссылку в этот текст. Там будут более содержательные примеры.
С другой стороны содержательная интерпретация двойственной задачи естественным образом зависит от содержательной интерпретации прямой задачи (для которой мы строили двойственную). То есть интерпретация двойственной задачи зависит от контекста.
Конечно, есть несколько важных свойств двойственной задачи, которые остаются верными всегда:
— Слабая двойственность (при выполнении некоторых условий, сильная двойственность), связывающая значения целевых функций в прямой и двойственной задачах.
— Выпуклость двойственной задачи и, следовательно, возможность ее эффективно численно решить.
В детали тут входить тяжело (объемная тема). Самое лучшее изложение, пожалуй, можно найти в первой главе вот этой замечательной книги.
malkovsky
03.12.2018 13:43+1Я бы скорее рекомендовал книгу Бойда&Ванденберге (ссылка на нее есть в этой статье), вот например на страницах 230 и 239 есть интерпретация на примере матричных игр: играют двое друг против друга, прямая задача — это задача первого игрока побольше заработать, двойственная — это задача второго игрока поменьше проиграть.
Или вот есть совсем классический, но частный случай: максимальный поток — минимальный разрез. С одной стороны «какой максимальный объем воды можно пропустить по трубам из S в T», с другой «Какой минимальный набор труб (по суммарной пропускной способности) нужно убрать, чтобы разделить S и T»YuraDorn Автор
03.12.2018 15:34Именно в качестве источника примеров книга Бойд и Вандерберге действительно очень хороша. Но опять же это примеры и смысл двойственной задачи будет определен контекстом.
Про какие-то более универсальные вещи лучше смотреть книгу Бен Таля, Гуоуи и Немировского.
В целом самое общее, что приходит в голову:
Обычно задача оптимизации выгляди так: мы пытаемся максимизировать некоторый функционал при наличии ограничений. Ограничены обычно ресурсы. То есть какой уровень некоторого функционала качества мы можем достичь, если у нас есть некоторое заданное количество ресурсов. Двойственная задача ставит вопрос по другому: сколько минимально нам нужно ресурсов, чтобы уровень функционала качества из прямой задачи был не меньше, чем некоторая заданная величина.
kovserg
Немогли бы вы уточнить что означают в ||x||1 и ||x||2 индексы 1 и 2, и далее ||?||inf
YuraDorn Автор
Это индексы нормы. Эта запись используется для сокращения размеров формул.
Первая норма вектора = сумма модулей компонент вектора
Вторая норма вектора = обычная евклидова норма = корень из суммы квадратов компонент вектора
Бесконечная норма вектора = максимум из модулей компонент вектора
Чуть более подробно можно посмотреть вот тут в разделе «примеры»