Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вычисление доступной суммы. Может кто сходу подскажет алгоритм решения? Или направление?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Задачка внешне простая. Для понятности попробую перейти в плоскость бух.учета
Есть некие "остатки". Они ведутся в разрезе неких "счетов".
На "счетах" кроме "остатков" существует механизм "резервирования".
Но! Резервирование сделано так, что можно резервировать некую сумму с указанием сразу нескольких счетов.
Пример (реально еще и не самый сложный, есть и более запутанные)
Есть 4 счета с остатками: С1 = 200, С2 = 500, С3 = 110, С4 = 180
И есть 3 резервирования:
Р1 = 100 для С1, С2 = ( С1 = 200, С2 = 500 )
Р2 = 200 для С3, С4 = ( С3 = 110, С4 = 180 )
Р3 = 300 для С1, С3 = ( С1 = 200, С3 = 110 )
Нужно расчитать сколько максимум можно забрать с каждого из счета (по отдельности, конечно же) чтобы не нарушить резервирования. Уточнение. Если резервирование на момент расчета уже нарушено (зарезервировано больше, чем в наличии), то этот "сегмент" (и резервирование и счета) можно не учитывать в расчетах.
Для этого примера для С1 можно взять:
Из-под Р1 - все, так как С2 больше нигде не участвует и покрывает Р1 полностью
Из-под Р3 - вроде бы как С1 - (Р3 - С3) = 200 - 190 = 10, но! С3 участвует еще в Р2 и с учетом Р2 получается, что для С3 доступно только С3 - (Р2 - С4) = 90, а не 110 и тогда доступная сумма для С1 получается как С1 - ( Р3 - 90 ) = -10, то есть ответ "ничего" - суммы меньше нуля не считаем :)
Я понимаю, что решение можно получить "простым" (ну, не таким уже и "простым"!) перебором.. Но может кто сталкивался и есть более "правильная" математика?
12 дек 12, 12:41    [13618287]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление доступной суммы. Может кто сходу подскажет алгоритм решения? Или направление?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Crimean
Но может кто сталкивался и есть более "правильная" математика?

В описание глубоко не вникал, но мне кажется, что эта задача линейного программирования. Решить можно, например, симплекс-методом.
12 дек 12, 13:03    [13618481]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление доступной суммы. Может кто сходу подскажет алгоритм решения? Или направление?  [new]
Добрый Э - Эх
Guest
Crimean,

ты бы ещё исходные данные привел и желаемый результат на этих данных. Помогать было бы проще...
12 дек 12, 18:36    [13621668]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление доступной суммы. Может кто сходу подскажет алгоритм решения? Или направление?  [new]
aleks2
Guest
1. Объединяем резервы по пересекающимся группам счетов и группы тож.
2. Имеем искомый ответ. Лехко.

P2+P3=500 для С1 = 200, С3 = 110 и С4 = 180 => -10
12 дек 12, 19:09    [13621772]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление доступной суммы. Может кто сходу подскажет алгоритм решения? Или направление?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Добрый Э - Эх,

да уже тов.Гость333 дал более чем исчерпывающий "пинок". это оно. задача действительно сводится к СЛАУ со всеми втекающими и вытекающими.
12 дек 12, 19:16    [13621792]     Ответить | Цитировать Сообщить модератору
 Re: Вычисление доступной суммы. Может кто сходу подскажет алгоритм решения? Или направление?  [new]
Crimean
Member

Откуда:
Сообщений: 13147
2 aleks2

не очень понял логику. точнее, совсем не понял. вот тестовые данные (вроде соответствуют описанию):

set nocount on

declare @c table ( id int , a money )
declare @r table ( id int , a money )
declare @x table ( c_id int , r_id int )

insert into @c
select 1, 200 union all
select 2, 500 union all
select 3, 110 union all
select 4, 180

insert into @r
select 1, 100 union all
select 2, 200 union all
select 3, 300

insert into @x
select 1, 1 union all
select 2, 1 union all

select 3, 2 union all
select 4, 2 union all

select 1, 3 union all
select 3, 3


p.s.

пример намеренно взят "сбалансированный" - достаточно показательный, но простой. реально все может быть сложнее в смысле перекрестных связей
12 дек 12, 21:25    [13622269]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить