LINUX.ORG.RU

Решение системы уравнений/неравенств


0

0

Имеются неизвестные V_0 ... V_{2^n-1} следующего вида:

V_0 = 0 * w_1 + 0 * w_2 + ... + 0* w_{n-1} + 0 * w_n = 0
V_1 = 0 * w_1 + 0 * w_2 + ... + 0* w_{n-1} + 1 * w_n
V_2 = 0 * w_1 + 0 * w_2 + ... + 1* w_{n-1} + 0 * w_n
V_3 = 0 * w_1 + 0 * w_2 + ... + 1* w_{n-1} + 1 * w_n

...

V_{2^n-1} = 1 * w_1 + 1 * w_2 + ... + 1* w_{n-1} + 1 * w_n

где w_i — целые числа, больше нуля.

Все неизвестыне разбиваются на два непересекающихся множества A и B. 
Разбиение заранее не фиксировано.

Для любого V_i из A и для любого V_j из B выполняется условие 1: V_i неравно V_j. 
Для заданного разбиения на A и B определить такой набор w_1, ... ,w_n
при котором выполяется условие 1, а также сумма w_1 + ...+ w_n минимальна


Интересуют любые дельные предложения кроме тупого перебора.
★★

по моему стандартная задача целочисленного линейного программирования.

Есть метод branch and bound, но он не полиномиальной сложности.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

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

Сейчас времени нет, вечером может посмотрю как свести к задаче ЦЛП.

satanic-mechanic
()

Вот сведение данной задачи к задаче целочисленного линейного программирования (если я ничего не напутал).

Пусть количество элементов A = |A|, B = |B|.
Пусть M = |A| * |B|. Введем M дополнительных целочисленных переменных yi, i = 1...M, yi = {-1, 1}.
Всего пар V_i из A, V_j из B M штук, дадим каждой число k от 1 до M.
Для каждой k-ой пары V_i из A, V_j из B введем ограничения y_k * (V_i - V_j) > 0.
минимизируем w_1 + ... + w_n + 0 * y_1 + ... 0 * y_M.

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

И еще, если нужно, вечером могу посмотреть, у меня были где-то мои старые реализации метода ветвей и границ и метода Гомори, правда на OCaml'е...

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

Эх подзабыл уже... залажал я с решением, это уже НЕ ЛИНЕЙНАЯ задача.

Итак, дубль два. Главная проблема записать то, что для каждой пары V_i из A, V_j из B должно выполняться V_i - V_j != 0. Делаем это так:

Пусть количество элементов A = |A|, B = |B|. Пусть M = |A| * |B|. Введем M дополнительных целочисленных переменных yij, i = 1..|A|, j = 1..|B|, yij = {0, если в решении получается V_i >= V_j; 1, если V_i < V_j}. Пусть D - достаточно большое число, тогда нужное нам ограничение для каждой пары запишется в виде системы двух неравенств: D * yij + (V_i - V_j) > 0; D * (1 - yij) + (V_j - V_i) > 0.

Вот как это работает: если на оптимальном решении y_ij = 0, то второе неравенство избыточно, а первое активно, получаем V_i - V_j > 0; если же на оптимальном решении y_ij = 1, то первое неравенство избыточно, а второе активно и оно раскрывается в V_j - V_i > 0.

Дополняем эти 2 * M неравенств ограничениями на положительность w_i и минимизируем w_1 + ... + w_n + 0 * y_1 + ... 0 * y_M.

P.S. монолог какой-то получается, 5 сообщения подряд.

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

Эх подзабыл уже... залажал я с решением, это уже НЕ ЛИНЕЙНАЯ задача.

Итак, дубль два. Главная проблема записать то, что для каждой пары V_i из A, V_j из B должно выполняться V_i - V_j != 0. Делаем это так:

Пусть количество элементов A = |A|, B = |B|.
Пусть M = |A| * |B|. Введем M дополнительных целочисленных переменных yij, i = 1..|A|, j = 1..|B|,
yij = {0, если в решении получается V_i >= V_j; 1, если V_i < V_j}.
Пусть D - достаточно большое число, тогда нужное нам ограничение для каждой пары запишется в виде системы двух неравенств:
D * yij + (V_i - V_j) > 0;
D * (1 - yij) + (V_j - V_i) > 0.

Вот как это работает:
если на оптимальном решении y_ij = 0, то второе неравенство избыточно, а первое активно, получаем V_i - V_j > 0;
если же на оптимальном решении y_ij = 1, то первое неравенство избыточно, а второе активно и оно раскрывается в V_j - V_i > 0.

Дополняем эти 2 * M неравенств ограничениями на положительность w_i и минимизируем w_1 + ... + w_n + 0 * y_1 + ... 0 * y_M.

P.S. Уже 6-е сообщение подряд :)

satanic-mechanic
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.