Формирование портфеля
- From
- Starikov Alexander ()
- To
- All
- Date
- 2002-10-25T19:08:37Z
- Area
- RU.ALGORITHMS
From: "Starikov Alexander" <alex@fnst.spb.ru>
Hello, All!
Есть такая задача - перебрать все возможные комбинации портфеля (в
процентах) заданного кол-ва тикеров.
Наример, если их два, то получить:
100 0
99 1
98 2
...
1 99
0 100
если три, три, то:
100 0 0
99 0 1
...
99 1 0
...
0 0 100
Написал следующую везчь:
std::vector< int > percents; // Массив процентов
// Инициализация массива процентов
percents.clear();
percents.resize(Tickers_Сount, 0); // На кол-во тикеров
// Заполняем массив процентов
void __fastcall PercentEval(int l)
{
int sum;
int j;
int k = Tickers_Сount; // Кол-во тикеров
for (int i = 0; i <= 100; i++) // 100%
{
percents.at(l) = i;
sum = 0;
for (int m = 0; m <= l; m++)
sum = sum + percents.at(m);
if (sum > 100)
exit;
j = l + 1;
if (j < k - 1)
PercentEval(j);
else
{
if (k > 1)
percents.at(k - 1) = 100 - sum;
if (percents.at(k - 1) >= 0) // Массив процентов заполнет
{
// комбинация в массиве, можно дальше что-то делать
}
}
}
}
Это работает, только начиная с 4 тикеров данный процесс занимает достаточно
много времени... а если учесть, что после формирования массива идут ещё
вычисления, то это что-то совсем страшно долгое... 4 тикера с последующими
расчётами я так и не дождался - больше часа прошло :((
Как бы оптимизировать, чтобы быстрее перебор шёл и не могу придумать как
сделать меняемый шаг, т.е. не 1% как сейчас а произвольный....
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
* Origin: Talk.Mail.Ru (2:5020/400)