|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Starikov Alexander 2:5020/400 25 Oct 2002 19:08:37 To : All Subject : Формирование портфеля -------------------------------------------------------------------------------- Hello, All! Есть такая задача - перебрать все возможные комбинации портфеля (в процентах) заданного кол-ва тикеров. Hаример, если их два, то получить: 100 0 99 1 98 2 ... 1 99 0 100 если три, три, то: 100 0 0 99 0 1 ... 99 1 0 ... 0 0 100 Hаписал следующую везчь: std::vector< int > percents; // Массив процентов // Инициализация массива процентов percents.clear(); percents.resize(Tickers_Сount, 0); // Hа кол-во тикеров // Заполняем массив процентов 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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/6488ca085aa5.html, оценка из 5, голосов 10
|