количество возможных комбинаций в разбиении

Дано множество S размера n, разбитое на классы (s1,..,sk) размеров n1,..,nk. Естественно, что n = n1+...+nk.

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

Поскольку я могу выбрать n1 элементов из s1, n2 элементов из s2 и так далее, я ищу решение max(n1*..*nk) для произвольных n1,..nk, для которых выполняется n1+..+nk =н.

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


person user66237    schedule 27.02.2009    source источник
comment
Кажется, здесь есть две отдельные проблемы. Решение общего количества комбинаций такое, как я написал ниже. Есть ли здесь также проблема с оптимизацией?   -  person Rob Lachlan    schedule 28.02.2009
comment
Я надеюсь, что материал ниже поможет. Это тема исчисления, которая требует времени, чтобы пройтись, но в двух словах это все.   -  person Rob Lachlan    schedule 28.02.2009
comment
Большое спасибо, Роб. Кажется, это помогает мне приблизиться к решению.   -  person user66237    schedule 06.03.2009
comment
Добавьте еще один комментарий (или отредактируйте вопрос, если хотите), если у вас есть дополнительные вопросы. Я пропустил много вычислений в вопросе ниже, но результат таков: если n кратно k, то n1 = n2 = ... = nk   -  person Rob Lachlan    schedule 06.03.2009
comment
Если нет, то ситуация не намного сложнее. Тогда n1 = n2 = ... = nj = потолок[n/k] и n_j+1 = n_j+2 = ... = n_k = пол[n/k], где j = n mod k   -  person Rob Lachlan    schedule 06.03.2009
comment
Если подумать, я вставлю это и отредактирую в своем посте.   -  person Rob Lachlan    schedule 06.03.2009


Ответы (2)


floor(n/k)^(k - n mod k)*ceil(n/k)^(n mod k)

-- МаркусКью

P.S. В приведенном вами примере S = {1,2,3,4}, n = 4, k = 2 это дает:

floor(4/2)^(2 - 4 mod 2)*ceil(4/2)^(4 mod 2)
floor(2)^(2 - 0)*ceil(2)^(0)
2^2 * 2^0
4 * 1
4

... как вы хотели.

Чтобы пояснить, эта формула дает количество перестановок, порожденных разбиением на максимально возможное количество перестановок. Конечно, будут и другие, менее оптимальные разбиения.

Для данного периметра прямоугольник с наибольшей площадью является ближайшим к квадрату (и то же самое верно для более высоких измерений), что означает, что вы хотите, чтобы стороны были как можно ближе к равной длине (например, все или среднюю длину округлить в большую или меньшую сторону). Тогда можно увидеть формулу:

   (length of short sides)^(number of short sides)
times
   (length of long sides)^(number of long sides)

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

Обратите внимание, что при таком рассмотрении он также говорит вам, как построить максимальное разбиение.

person MarkusQ    schedule 27.02.2009
comment
Привет Маркус. Большое спасибо за ответ. Кажется, он на правильном пути, однако, если я не ошибаюсь, ваша формула дает не совсем правильный ответ, например. для n=6 и k=3. Ваша формула дает 8, но я считаю только до 6 комбинаций, например. для разбиения 1|23|456. - person user66237; 06.03.2009
comment
@ericbodden 12|34|56 дает восемь. Я так понимаю, вы искали максимум, верно? - person MarkusQ; 06.03.2009
comment
О, мой плохой. Ты прав. Видимо я пропустил тот случай. Спасибо! Не могли бы вы дать мне два предложения объяснения того, почему эта формула работает? - person user66237; 06.03.2009
comment
@ericbodden Нет проблем. Если вам это нравится, не могли бы вы нажать на галочку, чтобы обозначить этот ответ как принятый? - person MarkusQ; 06.03.2009
comment
Большое спасибо, теперь это имеет для меня большой смысл. - person user66237; 08.03.2009

Вы ищете количество комбинаций с одним элементом из каждого раздела?

Это просто n1*n2*...*nk.

Изменить: вы, кажется, также задаете отдельный вопрос:

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

Его можно решить с помощью некоторого исчисления, т. Е. Взяв частные производные по каждой из переменных с ограничением, используя множители Лагранжа.

В результате n1 .. nk должны быть как можно ближе к одному и тому же размеру.

if n is a multiple of k, then n_1 = n_2 = ... = n_k = n/k

otherwise, n_1 = n_2 = ... = n_j = Ceiling[n/k]
      and  n_j+1 = ... = n_k = floor[n/k]

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

Кровавые подробности:

Это функция продукта, которую мы хотим максимизировать:

P = n1*n2*...nK

Определим новую функцию, используя множители Лагранжа:

Лямбда = P + l(N - n1 - n2 ... -nk)

И возьмем частные производные в каждой из k n_i переменных:

dLambda/dn_i = P/n_i - l

и в л:

dLambda/dl = N - n1 -n2 ... -nk

полагая все частные производные = 0, получаем систему из k + 1 уравнений, а при их решении получим, что n1 = n2 = ... = nk

Некоторые полезные ссылки:

Множители Лагранжа

Оптимизация

person Rob Lachlan    schedule 27.02.2009
comment
Нет, проблема в том, что я заранее не знаю n1,..,nk. Для каждого n я хочу знать максимально худший случай. Например, пусть S = {1,2,3,4}, тогда я мог бы разделить на два так, что n1=0,n2=4 или n1=1,n2=3 или n1=2,n2=2 или. Последнее разбиение дает 4 комбинации, значение, которое я ищу. - person user66237; 28.02.2009
comment
О, я вижу, где появляется оптимизация. Редактировать входящие. - person Rob Lachlan; 28.02.2009