Разработка алгоритма
Что нужно:
алгоритм,
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. Исправил грамматическую ошибку.