whitefox, насколько я понял, вы разделяете варианты а) и б) в вашем пункте 2 - если на очередную заявку не хватает остатка средств, распределенных по процентам, то мы в варианте а) оставляем эту заявку частично погашенной, а в варианте б) всю эту сумму выделяем в резервный фонд? Осталось непонятным, как вы реализуете вариант б) в пункте 4 - если на очередную заявку по приоритету суммы не хватает, а допустим хватает на другие, да еще есть варианты?
А так навскидку алгоритм имеет право на жизнь, хотя я не согласен с пунктом 4 и всем что после него. Я предложу другой вариант, имхо более оптимальный. Начнем с простого - распределение в варианте а):
получаем сводную таблицу затребованных сумм по статьям затрат, сумму к распределению считаем равной сумме
В цикле пока сумма к распределению больше
делаем:
1. пробегаем по этой таблице, пропускаем те статьи, по которым выделенная сумма равна затребованной, по остальным строкам считаем суммарный (накопительный) процент статей. Если этот итоговый процент равен 0 (нет непогашенных статей) - выход из внешнего цикла.
2. второй раз пробегаем по этой таблице, также пропускаем те статьи, по которым выделенная сумма равна затребованной, по остальным строкам увеличиваем выделенную сумму на сумму к распределению, умноженную на коэффициент = процент текущей статьи/накопительный процент непогашенных статей (рассчитанный в п 1.). Если при этом выделенная сумма превышает затребованную, то приравниваем выделенную на статью сумму затребованной, а излишек накапливаем в "резервный фонд".
3. сумму к распределению приравниваем "резервному фонду" и идем на шаг 1 в начало цикла.
То есть в отличие от вашего предложения, мы каждый раз распределяем получающийся резервный фонд по назначенным процентам оставшихся непогашенных статей - имхо это справедливее. Этот нехитрый алгоритм распределяет сумму
по статьям затрат. А далее внутри каждой статьи распределяем сумму (распределенную на статью) по заявкам в порядке приоритета, последняя заявка каждой статьи будет в общем случае частично погашена (если статья погашена не полностью). Пункт а) закончен.
Теперь остается пункт б) - имхо, тут тоже есть над чем подумать.
-- 06.03.2014, 21:41 --Вот этот принцип:
Средствами из "резервного фонда" удовлетворяем заявку принадлежащую статье с максимальной общей суммой неудовлетворённых заявок (ибо нужда в этой статье больше чем в других).
имхо порочен, ибо так будет выгодно завышать суммы заявок, чтобы получить больше денег. При распределении по моему алгоритму затребованные суммы почти не принимаются во внимание при распределении, только назначенные проценты статей.