Всем привет! Давно не развлекались. Задача: Покупаю в понедельник две упаковки печенья на завтрак на неделю. Надо распределить ВСЁ печенье приблизительно равными порциями на 3-5 дней. Известен вес каждой упаковки и количество штук в упаковках. Для одного вида печенья формула 224, для другого 228 символов. При тестировании и с "Поиск решения" выявилось неоптимальное разбиение, поэтому решил написать формулу оптимального разбиения. В лоб получилось 3567 символов, потом сократил до 1222 символов. Думаю, что можно сократить на 20-25% В файле оставил только вспомогательные и контрольные формулы. Диапазоны и глубина вложений функций не позволяют использовать только формат 2003, поэтому такого ограничения нет. Вскрываемся 27.05.24
Всем привет! Давно не развлекались. Задача: Покупаю в понедельник две упаковки печенья на завтрак на неделю. Надо распределить ВСЁ печенье приблизительно равными порциями на 3-5 дней. Известен вес каждой упаковки и количество штук в упаковках. Для одного вида печенья формула 224, для другого 228 символов. При тестировании и с "Поиск решения" выявилось неоптимальное разбиение, поэтому решил написать формулу оптимального разбиения. В лоб получилось 3567 символов, потом сократил до 1222 символов. Думаю, что можно сократить на 20-25% В файле оставил только вспомогательные и контрольные формулы. Диапазоны и глубина вложений функций не позволяют использовать только формат 2003, поэтому такого ограничения нет. Вскрываемся 27.05.24Светлый
Тихо сам с собою... Причёсывать больше не хочется. В формуле на 821 ошибка, искать лень. Выкладываю, что получилось. Самому не удалось узнать что-то новенькое, для кого-то и это новеньким окажется. Алгоритм оптимальных разбивок: Сначала получаю массив пар наиболее близких к требуемому весу. Хвостиком к элементам - количество тех и тех печенин. Суммирую по количеству дней в разных комбинациях элементы первого массива. Выбираю из этого те комбинации, которые в сумме дают полное количество печений. Из них выбираю минимальную. Это получается та комбинация, которая даёт минимальное суммарное отклонение. Из её номера нахожу пары. Для простой формулы: Из оставшихся печенин выбираю пару, которая по весу самая близкая к требуемому. На последний день скидываю всё, что осталось, иначе остатки могут перейти на незапланированный день. Эта разбивка неоптимальная.
Тихо сам с собою... Причёсывать больше не хочется. В формуле на 821 ошибка, искать лень. Выкладываю, что получилось. Самому не удалось узнать что-то новенькое, для кого-то и это новеньким окажется. Алгоритм оптимальных разбивок: Сначала получаю массив пар наиболее близких к требуемому весу. Хвостиком к элементам - количество тех и тех печенин. Суммирую по количеству дней в разных комбинациях элементы первого массива. Выбираю из этого те комбинации, которые в сумме дают полное количество печений. Из них выбираю минимальную. Это получается та комбинация, которая даёт минимальное суммарное отклонение. Из её номера нахожу пары. Для простой формулы: Из оставшихся печенин выбираю пару, которая по весу самая близкая к требуемому. На последний день скидываю всё, что осталось, иначе остатки могут перейти на незапланированный день. Эта разбивка неоптимальная.Светлый
Для поиска оптимального решения задачу лучше всего свести к целочисленному линейному программированию и решать через "Поиск решения" (или аналогичные, например, Open Solver) Во вложении раскладка по последнему примеру, найденная с помощью линейного программирования. На сколько она оптимальная, не могу сказать, но данных не очень много, поэтому задачу возможно решить полным перебором и выбрать оптимальный вариант. Решение через "Поиск решения считаю более удобным, т.к. можно решать аналогичные задачи с большим количеством данных (больше дней, больше различных пачек печенья и т.п.), решение находится достаточно быстро, качество (оптимальность) решения приемлемое.
Для поиска оптимального решения задачу лучше всего свести к целочисленному линейному программированию и решать через "Поиск решения" (или аналогичные, например, Open Solver) Во вложении раскладка по последнему примеру, найденная с помощью линейного программирования. На сколько она оптимальная, не могу сказать, но данных не очень много, поэтому задачу возможно решить полным перебором и выбрать оптимальный вариант. Решение через "Поиск решения считаю более удобным, т.к. можно решать аналогичные задачи с большим количеством данных (больше дней, больше различных пачек печенья и т.п.), решение находится достаточно быстро, качество (оптимальность) решения приемлемое.MCH