Приветствую всех. Недавно в моей жизни появилась одна задача, для решения которой нужно написать код. Суть этой задачи такова: есть
ящиков и
типов шаров. Нужно раскидать эти шары по всем ящикам таким образом, чтобы а) все ящики были примерно равно заполнены и б) разброс шаров одного типа по всем ящикам был как можно более равномерен.
При этом накладываются ограничения:
1) известно заранее количество шаров каждого типа и их нужно разложить абсолютно все
2) на каждый тип шаров накладывается ограничение по расположению (я дальше объясню).
В математике я не силен абсолютно, но вот, что я сделал:
1) для начала представил всю задачу в виде матрицы
, где в узлах элемент
соответствует количеству шаров типа
в ящику
. По условиям задачи на эту величину накладываются условия, что в некоторые ящики шары одного типа класть нельзя (
), или их не должно быть меньше определенного количества (
). Причем значение
мы знаем, но оно может быть любым. Сделал это для удобства представление, но, как я понял это просто вектор размерности
.
2) составил целевую функцию, где через метод наименьших квадратов записал условия а и б. Размер шаров и их "ценность" не имеют значения т.к. они все одного размера и одной ценности. Эту функцию нужно минимизировать при условиях из предыдущего пункта.
После этого для меня начался ад, потому что пришлось лезть в такие места, о существовании которых я и не подозревал. Соответственно мне нужна помощь с выбором стратегии решения этой задачи. Как я понял это np-полная задача (прав ли я?) и решать ее можно методом ветвей и границ, но я не знаю, как выбрать функцию ветвления и нижнюю границу. Или, как вариант, убрать условие целочисленности и решать обычную непрерывную задачу, а в конце округлить? Природа количества шаров сама по себе не очень точная и в каких-то разумных пределах может меняться, если очень захотеть. Но по этому пути я идти не хочу, хочу разобраться и сделать правильно. Заранее спасибо