2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Помогите определить тип задачи линейного программирования
Сообщение15.10.2022, 12:56 


24/01/17
21
Есть задача линейной оптимизации. Подскажите, пожалуйста, не могу понять, что именно это за "тип" у неё (транспортная задача, задача о потоке, итд)? Или к какой стандартной задаче её можно свести. Решаю её сейчас в общем виде, стандартными методами, но, уверен, что есть какое-то более быстрое решение. Достаточно численного приближенного решения. Задача:
$a,b$ - два вектора из $\mathbb{R}_{>0}^n$
Нужно найти максимум функции $F(k) = a\cdot k$, при условии, что $k\in[0,1]^n$ и $a\cdot k = (e-k)\cdot b$, где $e$ - это вектор из единиц, т.е:

$\begin{array}{lc}
 F(k) = \sum_i a_i k_i \rightarrow \max& \\
 \sum_i a_ik_i = \sum_i(1-k_i)b_i &(1) \\
 0\leq k_i \leq 1, \quad i=\overline{1..n}&(2)
\end{array}$

Получается, условие (2) задает n-мерный куб, а (1) - плоскость, на которой лежит точка максимума k. И, соответственно, найдется n-1 компонета искомого вектора k принадлежащаяя множеству {0, 1}. Очень похоже на "задачу о назначениях", но и тут я не пойму как прикрутить к ней первое условие. Пример с числами:

$\begin{array}{l}
a = (18, 33, 36, 46, 6, 41, 15, 27) \\
b = (\,22, \hphantom{0}8, \hphantom{0}6, 16, 8, 13, 10, 13) \\
\text{при } k = (0, 1, 1, 0, 0, 0.24074074, 0, 0) \text{ достигается максимум:} \\
F(k) =  \left\lVert\begin{array}{ll}
   k \cdot a &= 33 + 36 + 0.24074074 \cdot 41 \\
   (e-k) \cdot b &= 22 + 16 + 8 + 0.759259\cdot 13 + 10 + 13 \\
\end{array}\right\rVert = 78.87037034
\end{array}$

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение15.10.2022, 13:14 
Аватара пользователя


26/05/12
1694
приходит весна?
Aael, что-то у вас вектор k, при котором, вы говорите, достигается максимум, не соответствует условию задачи: у него есть компонента, отличная от 0 или 1.

Так же, тут что-то нехорошее творится в задаче: без каких-либо ограничений на вектора a и b гиперплоскость, соответствующая условию (1) может не проходить ни через одну вершину гиперкуба. Тогда вообще никаких решений не будет. Более того, в n-мерном пространстве киперкуб имеет $2^n$ вершин, в то время как гиперплоскость задаётся только $n+1$ неколлинеарной точкой. (В гиперкубе есть коллинеарные точки. Кстати, интересный вопрос: через сколько вершин единичного n-мерного гиперкуба максимум может проходить n-мерная гиперплоскость?) Я это к тому, уверены ли вы, что вы описали ту задачу, что нужно?

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение15.10.2022, 13:36 


24/01/17
21
B@R5uk по условию $k_i$ лежит в интервале от 0 до 1. Мы как бы делим n единиц каждую на две доли, например 0.2+0.8: одна уходит к $a_i$ (получается $0.2\cdot a_i$), другая к $b_i$ (получается $0.8\cdot b_i$), и считаем две суммы: \sum$k_ia_i$ и $\sum(1-k_i)b_i$ (все что ушло к $a$ и к $b$). Обе суммы должны быть равны, например, числу $M$ - это "ограничение" в задаче. А само значение $M$ нужно максимизировать и найти (компоненты k при которых оно достигается не важны).

То, что есть такая точка максимума в которой как минимум все доли кроме одной (т.е. n-1 штука) будут равны нулям или единицам - это уже мои соображения.

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение15.10.2022, 13:40 
Аватара пользователя


26/05/12
1694
приходит весна?
Aael в сообщении #1566760 писал(а):
$k_i$ лежит в интервале от 0 до 1.
О! Тогда извиняюсь. Подумалась почему-то дискретность. Наверно, потому, что я когда-то дискретную оптимизационную задачу ставил.

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение15.10.2022, 15:43 
Заслуженный участник
Аватара пользователя


03/06/08
2320
МО
Aael в сообщении #1566756 писал(а):
Очень похоже на "задачу о назначениях",

Эмм. А что чему соответствует? В задаче о назначениях у неизвестной, по идее, должно быть два индекса, где они в Вашей задаче?

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение15.10.2022, 16:00 
Аватара пользователя


26/05/12
1694
приходит весна?
Я тоже как-то не очень понимаю в чём вопрос. Вот есть задача линейного программирования. У неё есть различного вида постановки, в том числе в канонической форме, это я понимаю. Дальше, есть задачи, которые так или иначе сводятся к задаче линейного программирования, это я тоже понимаю. Некоторые из них, возможно, даже имеют собственное более эффективное решение. Задача ТС, конечно, записана не в канонической форме, но очень близка к ней. Что, собственно, можно тут ещё хотеть? Как по мне, так тут можно только взять и решить.

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение15.10.2022, 21:30 
Заслуженный участник
Аватара пользователя


11/03/08
9905
Москва
Второе условие сводится к $\Sigma_i(a_i+b_i)k_i=\Sigma_i b_i$

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 08:52 
Заслуженный участник


12/08/10
1677
Она же за $n\log n$(сортировка) решается?

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 09:14 
Заслуженный участник
Аватара пользователя


11/03/08
9905
Москва
Чёт-то у меня напрашивается тривиальный алгоритм (и да, это никакая не задача о назначении).
Если бы не было условия (1), ответ был бы - для всех $a_i>0$ $k_i=1$, иначе $k_i=0$
Но в этом случае условие (1) может нарушаться. И надо какие-то $k_i$ изменить, восстанавливая соблюдение условия. Причём в силу того, что задача линейная, менять до упора, в 0 (или, для отрицательных $a_i$, в единицу), все, кроме, возможно, одной переменной, которой "точно настраиваем равенство".

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 10:17 
Аватара пользователя


26/05/12
1694
приходит весна?
Евгений Машеров в сообщении #1566900 писал(а):
для всех $a_i>0$
Они и так все больше нуля:
Aael в сообщении #1566756 писал(а):
$a,b$ - два вектора из $\mathbb{R}_{>0}^n$

Евгений Машеров в сообщении #1566900 писал(а):
И надо какие-то $k_i$ изменить, восстанавливая соблюдение условия.
Проблема в этом: какие именно индексы взять? Без какой-либо стратегии это экспоненциальный перебор, что гораздо хуже ЗЛП в среднем (в худшем случае там тоже экспоненциальный перебор, если мне память не изменяет). А наивное зануление начиная с наименьших работать не будет, потому что сечение плоскостью куба — это хитрый многоугольник (от треугольника до шестиугольника), а сечение гиперплоскостью гиперкуба — объект ещё хитрее.

-- 17.10.2022, 10:25 --

Евгений Машеров в сообщении #1566900 писал(а):
все, кроме, возможно, одной переменной, которой "точно настраиваем равенство"
Фактически, вы утверждаете, что максимум будет лежать в вершине или на ребре каркаса гиперсечения. Это очень жёсткое требование. Почему не в каком-то более хитром направлении?

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 10:30 
Заслуженный участник


12/08/10
1677
B@R5uk в сообщении #1566903 писал(а):
Фактически, вы утверждаете, что максимум будет лежать на вершине или ребре каркаса гиперсечения. Это очень жёсткое требование. Почему не в каком-то более хитром направлении?
Просто из 2 любых переменных одну можно увести в 0 или 1, возможно увеличив целевую функцию.

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 10:45 
Аватара пользователя


26/05/12
1694
приходит весна?
Да, пожалуй. Когда целевая функция линейная так и будет.

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 11:33 
Заслуженный участник
Аватара пользователя


11/03/08
9905
Москва
B@R5uk в сообщении #1566903 писал(а):
Фактически, вы утверждаете, что максимум будет лежать в вершине или на ребре каркаса гиперсечения. Это очень жёсткое требование. Почему не в каком-то более хитром направлении?


Линейная функция.

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 14:15 
Заслуженный участник
Аватара пользователя


30/01/09
7068
Aael в сообщении #1566756 писал(а):
но, уверен, что есть какое-то более быстрое решение.

Я тоже так думаю. Достаточно посмотреть на на знаки компонент градиента целевой функции. И в зависимости от этих знаков соответствующая компонента решения будет $0$ или $1$ (ну, или любое число между этими значениями) .

 Профиль  
                  
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 17:21 
Заслуженный участник
Аватара пользователя


30/01/09
7068
Aael в сообщении #1566756 писал(а):
Есть задача линейной оптимизации. Подскажите, пожалуйста, не могу понять, что именно это за "тип" у неё

Думаю, что эта задача сепарабельного программирования. То есть по каждой переменной задачу можно решать отдельно.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: svv


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group