2014 dxdy logo

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

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


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


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



Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Помогите определить тип задачи линейного программирования
Сообщение17.10.2022, 19:22 
Заслуженный участник
Аватара пользователя


03/06/08
2390
МО
Евгений Машеров в сообщении #1566900 писал(а):
И надо какие-то $k_i$ изменить, восстанавливая соблюдение условия. Причём в силу того, что задача линейная, менять до упора, в 0 (или, для отрицательных $a_i$, в единицу), все, кроме, возможно, одной переменной, которой "точно настраиваем равенство".

Что-то туплю: почему одной?
мат-ламер в сообщении #1566940 писал(а):
То есть по каждой переменной задачу можно решать отдельно.

Можно поподробнее, как тут можно "разделить" переменные?

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


30/01/09
7174
пианист в сообщении #1566954 писал(а):
Можно поподробнее, как тут можно "разделить" переменные?

Я понял условие так, что нужно найти максимум линейной функции $f(x)=(c,x)$ (круглые скобки - скалярное произведение) на единичном кубе $0 \leqslant x_i \leqslant 1$ . Решаем отдельно для каждого $i$ задачу нахождения максимума функции $f_i(x_i)=c_ix_i$ на отрезке $$0 \leqslant x_i\leqslant 1$ с очевидным решением $x_i^*$ . В итоге общий ответ в задаче получаем $x^*=(x_1^*,...,x_n^*)$ .

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


03/06/08
2390
МО
Есть еще условие (1), Ваши $x^*$ ему удовлетворять не обязаны же.

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


30/01/09
7174
пианист в сообщении #1566960 писал(а):
Есть еще условие (1), Ваши $x^*$ ему удовлетворять не обязаны же.

Извиняюсь. Я наверное неправильно понял условие (а может и правильно, пока не пойму) . Я просто подставил это условие в целевую функцию. В итоге это условие у меня исчезло. Но целевая функция приобрела новый вид.

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


26/05/12
1717
приходит весна?
Если с помощью условия (1) понизить размерность задачи, то, действительно, условие (1) исчезнет, появятся новые искомый вектор и целевая функция. Но область поиска тоже изменится: теперь это будет не гиберкуб, а его гиперсечение, лежащее в гиперплоскости, задаваемой условием (1). Переменные, вообще говоря, не будут сепарабельны.

Идея ЗЛП заключается совершенно в обратном: от хитрых линейных ограничений на искомый вектор переходят к наиболее простым (все координаты вектора неотрицательны), попутно даже повышая размерность задачи, если это требуется для приведения к каноническому виду.

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


24/01/17
21
мат-ламер в сообщении #1566923 писал(а):
Достаточно посмотреть на на знаки компонент градиента целевой функции. И в зависимости от этих знаков соответствующая компонента решения будет $0$ или $1$.

вот я не могу доказать почему это так... и, наверное, поэтому не понимаю, что делать с нулевыми компонентами градиента.

B@R5uk в сообщении #1566983 писал(а):
Если с помощью условия (1) понизить размерность задачи, то, действительно, условие (1) исчезнет, появятся новые искомый вектор и целевая функция.
Да, но из первой задачи мы узнаём, что все компонеты точки максимума - единицы и нули, кроме какой-то $s$'ой, это поможет нам решить вторую задачу, в которой мы исключаем эту $s$'ю компоненту. Получаем целевую функцию (совпадающую по значениям с исходной) для которой не нужно знать чему равна "дробная" компонента $k_s$:
$$\frac{1}{a_s+b_s}\left[
a_s \sum b_i +
\sum\limits_{i\neq s}(a_i b_s -a_s b_i)k_i
\right]$$
условия $0\leq k_s \leq 1$ станут такими:
$$0\leq \sum\limits_{i\neq s} b_i - \sum\limits_{i\neq s}(a_i+b_i)k_i \leq a_s + b_s
\qquad(3)(4)
$$А компоненты максимума уже известны (учитывая предположение о градиенте):
$$k_i = \left\{
\begin{array}{ccl}
1&\text{если} &a_i / b_i > a_s / b_s \\
0&\text{если} &a_i / b_i > a_s / b_s \\
???&\text{если} &a_i / b_i = a_s / b_s
\end{array}
\right.$$Теперь, получается, что максимум, который ищем - это некая функция от $s \in \overline{1,n}$ (для $s$ должны выполняться условия (3) и (4)). Если все варинты перебирать, то выходит алгоритм за $O(n^2)$ (выглядит так, что еще быстрее можно). Остаётся случай где "компоненты градиента" равны нулю, там нужно проверить и 0 и 1, что вываливается в экспоненциальное решение.

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


03/06/08
2390
МО
пианист в сообщении #1566954 писал(а):
Евгений Машеров в сообщении #1566900 писал(а):
И надо какие-то $k_i$ изменить, восстанавливая соблюдение условия. Причём в силу того, что задача линейная, менять до упора, в 0 (или, для отрицательных $a_i$, в единицу), все, кроме, возможно, одной переменной, которой "точно настраиваем равенство".

Что-то туплю: почему одной?

А, все, понял. Вопрос снимается.

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


30/01/09
7174
Aael в сообщении #1567011 писал(а):
вот я не могу доказать почему это так... и, наверное, поэтому не понимаю, что делать с нулевыми компонентами градиента.

Я должен извиниться. Я неправильно понял условие и все свои посты снимаю. Задача мне кажется выглядит так. Есть $n$-мерный куб. Он пересекается гиперплоскостью. Пересечение это есть $(n-1)$-мерный выпуклый многогранник, все вершины которого лежат на рёбрах куба. И надо найти максимум линейной функции на этом многограннике, который достигается в одной из вершин (не обязательно именно в одной и не обязательно именно в вершине). Стандартный алгоритм предполагает сначала осуществить процесс выхода на этот многогранник. Затем последовательно двигаемся от вершине к вершине так, чтобы увеличивалась целевая функция. Особой специфики тут нет. Можно воспользоваться стандартными программами линейного программирования. Но если есть большой избыток свободного времени и желание разобраться в деталях процесса перевешивает желание быстро получить эффективную программу, то можно и самому чего-то сварганить.

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


24/01/17
21
мат-ламер в сообщении #1567028 писал(а):
Я должен извиниться. Я неправильно понял условие и все свои посты снимаю.
Но благодаря вашим рассуждениям было построено решение. Алгоритм такой:
1. Выбираем приближение $k = (1,1,\ldots,1)$ и считаем суммы $S_a=\sum k_i a_i = \sum a_i$ и $S_b=\sum(1-k_i)b_i = 0$
2. Перебираем индексы $s$ в порядке увеличения $a_s / b_s$:
--------- Если $S_a - a_s > S_b + b_s$, то зануляем компоненту $k_s$, и пересчитываем суммы:
----------------- $S_a \leftarrow (S_a - a_s)$
----------------- $S_b \leftarrow (S_b + b_s)$
--------- Иначе (нашли "дробную" компоненту) пишем ответ (это максимум целевой функции):
----------------- $\displaystyle \frac{S_a b_s + S_b a_s}{a_s + b_s}$

Учитывая что почти все компоненты решения состоят из нулей и единиц и работает жадный алгоритм их поиска, то задача прям похожа на все эти "о назначениях", "о разбиение множества", "о одномерном линейном раскрое", "о составлении расписания", на какую-нибудь "бинарную задачу о двух рюкзаках", но не в точных их формулировках. Никогда не видел такую

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


26/05/12
1717
приходит весна?
Задачу о назначениях я решал, поэтому ответственно заявляю, что жадный алгоритм там не работает.

В вашем случае это будет скорее кардинальное отличие, а не схожесть.

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

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



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

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


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

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