Страницы: 1 2 След.
RSS
Как разделить разные суммы между n людей так, чтоб у всех было поровну?, надо узнать кто кому сколько передает
 
Как разделить разные суммы между n людей так, чтоб у всех было поровну (надо узнать кто кому сколько передает)?
То есть например есть четыре человека (А, Б, В и Г): у А в кармане 100$, у Б в кармане 80$, у В в кармане 150$, а у Г в кармане 20$.
Надо посчитать кто, кому и сколько денег передает, чтоб в результате у каждого в кармане оказалось одинаковая сумма (в нашем примере 87,5$).
Причем желательно знать общее решение, то есть не для 4х человек, а для произвольного числа людей.
Кто-то может подсказать как это реализовать на экселе?
 
Barmaldon, суммировать содержимое карманов и разделить на количество карманов
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
И решение должно быть оптимальным, то есть вариант, что все отдают одному, а потом этот один каждому выделяет его долю - это НЕоптимальное решение. Надо минимизировать число транзакций (передач) и исключить транзитные передачи (А передает Б, а Б передает часть этой суммы В), то есть передачи должны быть только прямые.
 
Barmaldon, без файла примера с исходынми данными и показанынм результатом долго придется ждать) имхо
Не бойтесь совершенства. Вам его не достичь.
 
Через "Поиск решения"

UPD: добавил вариант на 10 человек
Изменено: MCH - 13.11.2020 16:23:24
 
MCH, огромнейшее спасибо!!!
Я в шоке как вы красиво и с минимальным напряжением решили эту задачу!!! Я думал, все будет гораздо-гораздо сложнее. Много лет работаю с экселем, а вот данный инструмент, к своему стыду не освоил. Поиск параметра - часто применяю, а вот Поиск решения - надо бы освоить.
Респект Вам, уважаемый человек!
 
Думаю, что в общем случае максимальное количество "транзакций" будет n-1, где n - число людей.

P.S. Крупнейшие специалисты по "разделить, чтоб у всех было поровну" жили сто с небольшим лет назад. :)  
Изменено: sokol92 - 13.11.2020 18:13:22
Владимир
 
формула:
Код
=МИН(МАКС(;ЕСЛИ(ЕПУСТО(R4C);1;-1)*(RC2-ср.)-СУММ(RC3:RC[-1]));МАКС(;ЕСЛИ(ЕПУСТО(R4C);1;-1)*(ср.-ИНДЕКС(R5C2:R8C2;ПОИСКПОЗ(R3C;R3C4:R3C7;)))-СУММ(R4C:R[-1]C)))
решает 2 задачи:
1. когда у А,Б,В,Г оказалось определенное количество денег - решает кто сколько кому должен чтобы  выровнять доходы поравну
2. когда А,Б,В,Г понесли некоторые затраты - решает кто сколько кому должен, чтобы распределить затраты поравну

см. вложение
и.... количество участников мероприятия - ограничено только размерами листа Excel
Изменено: Ігор Гончаренко - 13.11.2020 18:30:16
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, тоже отличное решение, спасибо. Только я не понял принцип работы вашей формулы, вы можете пояснить пож-та?
 
Ігор Гончаренко, и еще вопрос: какие данные вы планировали вводить в строку 4 вашего файла?
Изменено: Barmaldon - 13.11.2020 22:27:36
 
что значит "планировал"? данные внесены
а вообще 4-я строка, как и 3-й столбец нужны были для суммирования, чтобы не нарываться на циклические ссылки
а уже потом,, когда я подумал, что могу решить этой формулой и другую задачу - в самой формуле появился небольшой дополнительный блок вычислений (ЕСЛИ(ЕПУСТО(R4C);1;-1) в двух местах формулы) , а в Табло 2, появились данные, которые позволят понимать что формула на территории Табло 2, а не Табло 1 и должна некоторые значения учитывать наоборот (с минусом)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо вам за ответ, возможно я не до конца вас понял, но 4я строчка полностью пустая - в ней нет ни формул, ни данных, потому непонятно какой смысл в том, что на 4ю строку есть ссылки из строк 5,6,7,8. В каком случае 4я строка может быть заполнена данными и что это за данные?
 
заполнено в области Табло2
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, так в том то и дело, что вся 4я строчка пустая, включая область Табло2
 
в том то и дело, что 4-я строка в области табло2 заполнена, может поспорим на 100 баксов???
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Сделал свое фармульное решение, получилось похоже на то, что сделал Ігор Гончаренко
Есть сложный и более простой вариант, простой вариант будет легче понять

PS: В желтых ячейках находятся формулы массива введенные сразу в диапазон (Ctrl+Shift+Enter), поэтому править их нужно иначе, чем обычные формулы  
PPS: Пустые строки и столбцы нужны для того чтобы написать одну универсальную формулу для всех ячеек
Изменено: MCH - 15.11.2020 09:52:58
 
Barmaldon,
:) даже по скрину видно что 4 строчка не вся пустая
 
Ігор Гончаренко, может вы не ту версию файла запостили? На скрине видно, что курсор стоит на J4 и в ней нет никаких данных, в других ячейках тоже.
Изменено: Barmaldon - 14.11.2020 23:49:39
 
MCH, спасибо за ваш вариант. А какая вкладка в вашем файле является финальной версией?
 
давайте на $1000 поспорим что в I4, J4, K4 и L4 находятся данные|
отметьте строку 4, нажмите Del, содержимое Табло2 изменилось? (очистилось. потому что в перечисленных ячейках лежали данные, на основании которых формула в ячейках Табло2 "знала" что она в Табло2 и считала правильно)
Изменено: Ігор Гончаренко - 15.11.2020 00:01:15
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Barmaldon написал:
А какая вкладка в вашем файле является финальной версией?
На "Лист1" - реализация от Ігор Гончаренко
На листах Вар4 и Вар10 - реализация простой формулой с доп. вычислениями, на 4 и 10 человек соответственно
На листе Вар10 (2) - вариант для 10 человек с более сложной формулой, но без доп. вычислений
Можете использовать любой вариант.

Я бы рекомендовал использовать вариант с простыми формулами и доп. вычислениями, как более простой в понимании и который легче править и масштабировать.
Изменено: MCH - 15.11.2020 10:52:32
 
Добрый день, коллеги.
Михаил MCH, но ведь при формульном раскладе не выполняется
Цитата
Barmaldon написал:
Надо минимизировать число транзакций
В приложенном файле, число транзакций 4, но можно же уложиться в 3. В принципе, в смысле минимизации числа транзакций, задача того же класса, что и Распределение ящиков по заданному числу машин с минимальным перемешиванием товаров
 
Цитата
Андрей VG написал:
но ведь при формульном раскладе не выполняется
Добрый день Андрей, я это знаю
Могут быть варианты, когда формульное решение не приводит к минимальному количеству транзакций, но все же транзакций не более n-1 (не стал публиковать данные примеры, но их можно сгенерировать много).

Возможны случаи, когда то что забираем у одного отдаем столько же другому или сумма нескольких расходов одних, равна сумме доходов других тогда количество транзакций можно не много сократить.
Кстати и Поиск решения не обязательно сократит количество транзакций.
И формулы и Поиск решения находят решение с минимальной суммой всех транзакций, но не с минимально возможным их количеством  

Чтобы решить еще и задачу на минимизацию количество транзакция (если это возможно), то потребуется существенно больше времени.
 
Цитата
MCH написал:
Кстати и Поиск решения не обязательно сократит количество транзакций.
Не уловил почему. У вас число транзакций по раскладке коробок по машинам было 28 в решении как раз через поиск решения. Если рассматривать текущее формульное, то 35. В том решении вы написали, что
Цитата
MCH написал:
Теоретически решение задачи можно полностью автоматизировать и будет гарантированно найден оптимальный вариант
Здесь же можно рассматривать, как целочисленное решение в копейках, только приход имеет разную вместимость (если сопоставлять его с ёмкостью машины в коробках).
 
Эти задачи похожи, но разные, т.к. вместимость транспорта больше товаров, то деление товаров между транспортом можно сократить в большем количестве, чем в текущей задаче
про "Поиск решения" я писал именно про то, как было применено мной здесь в сообщении № 5, там не стоит задача минимизация количества транзакций, а только минимизация суммы всех транзакций
 
Ігор Гончаренко, увидел - в 4й строке пробелы. Вы можете тогда объяснить зачем они там?
 
чтобы отличать территорию табло2
формула одна и та же, но на территории табло2 она выдает другой результат
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Большое спасибо, Михаил за комментарии и размышления.
 
Сделал решение макросом в котором попытался уменьшить количество транзакций, на примере из 20 чисел, там где формулы генерируют 19 транзакций, макросом получилось 14
Это не обязательно оптимально, но лучше чем формулы.

На примере данных машин и грузов получилось 29 транзакций (это всего лишь на одну больше, чем в самом оптимальном варианте)

PS: макрос работает только с целыми числами, т.к. применяется динамическое программирование для задачи суммы подмножеств
Изменено: MCH - 16.11.2020 09:10:30
 
Огромное спасибо, Михаил! На выходных расковыряю, увы, неделя будет плотной, отпишусь.
Страницы: 1 2 След.
Наверх