Пропорциональное распределение по знакопеременному ряду

Volvgant

Пусть есть последовательность чисел:
2000
-1000
-1000
Нужно пропорционально распределить -100 по этой последовательности.
Как это сделать?
Пока не придумал ничего умнее кроме как:
1. разделить основной ряд на два подряда - положит и отрицательный
2. если распределяемое положительное, то распределяем по положительному подряду
3. если отрицательное, то распределяем по отрицательному подряду
В таком случае распределение получится:
2000 0
-1000 -50
-1000 -50
Но может есть какой-нибудь более кошерный способ?

Volvgant

хотя может лучше в study это перенести?

sashok01

[telepathy mode]
сформировать ряд из модулей элементов, т.е. b_i =|a_i|, затем определить вес каждого элемента k_i = b_i/sum(b_i затем поправку применять к первоначальному ряду a_i согласно весам k_i, т.е. будет ряд c_i = a_i + d*k_i
То есть для d=-100 будет как-то так:
2000 -> 1950
-1000 -> -1025
-1000 -> -1025
[/telepathy mode]
а так зависит от того, что именно нужно. Ну и вообще вспоминается сага об x,y,z .

Volvgant

Спасибо!
а так зависит от того, что именно нужно. Ну и вообще вспоминается сага об x,y,z
:) вспоминается видимо из-за того, что можно придумать бесконечное количество вариантов распределений из-за схлопывания в ноль знакопеременных частей?
Просто может кто встречался с такой проблемой, или упоминалось в курсе математики, и знает оптимальные варианты решений?

Volvgant

То есть для d=-100 будет как-то так:
2000 -> 1950
-1000 -> -1025
-1000 -> -1025
касательно самого варианта решения - не подходит, т.к. сильно раздувает распределяемое.

griz_a

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

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

sashok01

и знает оптимальные варианты решений?
в каком смысле оптимальное? Сформулируй что ты хочешь, нихрена не понятно

Volvgant

Есть вот это число, его нужно распихать по ряду? Из каких соображений?

из соображений пропорции.
если есть положительный ряд [1 10 20], то -100 можно однозначно распределить по этому ряду.
а если в ряд добавить отриц.число, то возникает неопределенность распределения.
Я ни разу за обучение с таким не сталкивался, хотя проблема довольно тривиальна, и по любому есть какой-то опыт решения.
по поводу исходной задачи - сек, щас напишу.

Volvgant

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

Mausoleum

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

Volvgant

не, это система, которая обрабатывает данные бухгалтерии.
Предполагается, что данные бухгалтерии на входе нормальные. Они могут быть конечно и кривыми, но это проблема бухгалтеров. Просто НДС по плану счетов и аналитике в принципе не имеет детализации по контрагентам. Пофиксить можно изменив методологию бухучета, но это делать никто не будет)

griz_a

если есть положительный ряд [1 10 20], то -100 можно однозначно распределить по этому ряду.

Нифига непонятно, что такое "можно однозначно". Это пропорционально распилить -100 на три куска? Ну так это не только для положительных работает, а для всех, у которых сумма не 0.

sashok01

ну в такой постановке непонятно, зачем вообще нужна какая-то оптимальность. Можно же размазывать эти -100 как угодно - хоть равномерно, хоть пропорционально абсолютным значениям, хоть всю сумму -100 запихнуть в одну позицию, хоть размазывать через хитрую формулу в десять строчек.
Сформулируй, что ты хочешь от оптимальности размазывания. Как сравнить между собой два абстрактных варианта, которые допустим можно было бы предложить - какой из двух вариантов будет лучше?

Volvgant

ну в такой постановке непонятно, зачем вообще нужна какая-то оптимальность.
Нууу...хотелось бы делать правильно, а не на коленке.
Но вообще меня удивило, что никогда не сталкивался с подобным. Стало интересно - вдруг это где-то как-то решается. Поэтому и постарался сформулировать в обобщенном виде.
Твой вариант хорош, его можно было б отнормировать до минимальной дисперсии или еще какого параметра, чтоб избавиться от раздувания. Но ты его придумал за пару минут, и это не совсем то - интересовало существование "стандартного" решения.

griz_a

 
его можно было б отнормировать до минимальной дисперсии

 :ooo: До минимальной дисперсии кого?
Ты удивишься, но задачи-то мы так и не услышали. Ну надо распихать сумму между числами, а какие критерии "хорошего" распихивания - непонятно. Что такое правильно и неправильно распихать, соответственно, тоже

Volvgant

сорри, не ответил
Нифига непонятно, что такое "можно однозначно"

1. есть распределяемое - y. Есть база распределения [x1 x2 x3].
2. сумма чисел из базы S = Sum(xi).
3. под пропорциональным распределением zi я понимаю,что каждому элементу из базы ставится в соответствие часть распределяемого zi = y*xi/S. Т.о. Sum(zi) = y.
Если взять пример y = -100, zi - [1 10 20],
то пропорциональное распределение получится: [-3.2 -32.3 -64.5]. Такое распределение однозначно.
Но если сумма чисел базы будет равна нулю, то ничего не получится сделать. И да, это условие я не озвучил в описании задачи - извини. Это пожалуй основное требование.
Оставить комментарий
Имя или ник:
Комментарий: