Разработка алгоритма

Кирилл13 лет в сервисе
Данные заказчика будут вам доступны после подачи заявки
15.11.2013

Что нужно:

алгоритм,

1) дающий результат

2) за приемлемое время (в идеале - секунды, единицы минут; реализация планируется на Java).

Готов разъяснить задачу по Скайпу, или при личной встрече в Санкт-Петербурге (кофе-чай в кофейне - за мой счет :).

Описание системы

Есть счета. На них есть деньги.

Через некоторые из этих счетов должны периодически проходить определенные суммы. Это движение ограничено временным интервалом длительностью меньшей или равной месяцу. В пределах интервала, желательно, чтобы движение прошло как можно раньше. Период повторения интервалов движения - 1 месяц. Пример: через счет должно пройти 300 тыс. руб.; начало интервала движения: 20-е число каждого месяца, продолжительность интервала движения - 25 дней.

В определенные даты на определенные счета могут добавляться определенные суммы (приходить извне системы), а также с них могут сниматься определенные суммы (уходить вовне системы). Эти даты и суммы известны к началу расчета. Все счета могут принимать извне системы. Отправлять из системы - не все.

Некоторые счета можно создавать в ходе расчета.

Задача

Определить движение денег по счетам в течение заданного временного интервала, дающее максимальную сумму денег по всем счетам (сколько денег всего) в конце этого интервала. Интервал расчета - календарные месяцы.

При начислении сумм с задержкой (проценты, комиссии, бонусы), если начисление планируется позже окончания интервала расчета, включать эти суммы в сумму всех денег по всем счетам, использующуюся выше.

Результат - перечень переводов между счетами в порядке осуществления в формате:

Дата Счет-источник Счет-приемник Сумма Перевод Комиссия Бонус

Типы счетов:

кредитный (через такой счет должны пройти деньги)

сумма, которая должна пройти через счет

период времени, в течение которого она должна пройти:

число месяца начала

продолжительность, дни

задержка между приходом денег и доступностью их для перевода:

часы

количество ночей

депозитный

ставка годовых, возможна зависимость (в т.ч. нелинейная):

от суммы на счете

от срока нахождения на счете

от суммы и срока

когда начисляются проценты, число месяца

задержка списания со счета ушедшей суммы (несмотря на то, что сумма ушла, на нее продолжают начисляться проценты в течение указанного количества дней), дни

задержка между приходом денег и доступностью их для перевода:

часы

количество ночей

лимит входящих сумм, руб.

с n-го числа месяца по n-1 число следующего месяца

за последние n дней

лимит выходящих сумм, руб.

с n-го числа месяца по n-1 число следующего месяца

за последние n дней

позволяет отправлять из системы, да/нет

текущий

максимально возможная сумма на счете, руб.

возможность более одного пополнения, да/нет

лимит входящих сумм, руб.

с n-го числа месяца по n-1 число следующего месяца

за последние n дней

лимит выходящих сумм, руб.

с n-го числа месяца по n-1 число следующего месяца

за последние n дней

можно создавать в ходе расчета, да/нет

позволяет отправлять из системы, да/нет

Параметры переводов (задаются для определенных пар счетов):

возможны

каждый день

по рабочим дням

срок получения денег на счете-приемнике после отправки со счета-источника

часы

количество ночей

комиссия за перевод

фиксированная сумма, руб

процент

фиксированная сумма + процент

процент, но не менее определенной суммы

бонус за перевод

размер

процент

процент, если сумма не менее

ограничение размера бонуса за определенный период (с n-го числа месяца по n-1 число следующего месяца), руб.

куда начисляется

на счет-источник

на счет-приемник

на третий счет

когда начисляется

сразу

через n дней

в n-е число следующего месяца, если расход был за m-е число дней до конца предыдущего

в n-е число следующего месяца, если приход был за m-е число дней до конца предыдущего

Upd. На странице проекта текст показан без tab'ов, поэтому дублирую вложением.

Upd2. Исправил грамматическую ошибку.