Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 16

Ускорить работу вложенного цикла for() C#

31.10.2015, 15:49. Показов 5445. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Имеется цикл в котором подбираются коэффициенты к массивам таким образом, чтобы коэф регрессии стремился к нулю

C#
1
2
3
4
5
6
7
8
9
10
11
12
for (int i2=5; i2<=5; i2=i2+0.01){
for (int i3=5; i3<=5; i3=i3+0.01){
for (int i4=5; i4<=5; i4=i4+0.01){
for (int n=0; n<=150; n++){
rez[n] = a1[n] + a2[n]*i2 + a3[n]*i3 + a4[n]*i4;}
koef = KoefLinearRegression(rez);
if (koef<koef_min)
{
i2_min=i2; i3_min=3; i4_min=i4
}
}
}
Можно ли каким-то образом оптимизировать код, чтобы ускорить расчет?
При конструкции с одним циклом, когда имеется только a1[] и a2[] расчет занимает 10 сек, с двумя - несколько минут, с тремя минут 15.
Ну а если n увеличить до 2000, чтобы повысить качество расчета, то вообще не дожидался, вырубал.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2015, 15:49
Ответы с готовыми решениями:

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

Как обойтись без вложенного цикла?
Нужно в данном конкретном случае перебрать, например, все возможные комбинации символов цепочки из нулей и единиц. Но! Нужно обойтись без...

Ускорить работу методов
Здравствуйте, есть два метода, которые ну очень медленно работают при key = 1000 и более... Как ускорить работу с минимальными потерями? ...

11
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
31.10.2015, 16:19
Самое интересное думаю в KoefLinearRegression происходит?
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 16
31.10.2015, 16:42  [ТС]
Нет, именно вложенные циклы тормозят. Koef.. я отключаю и время исполнения кода практически не меняется.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18296 / 14220 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
31.10.2015, 17:29
Цитата Сообщение от Schielend Посмотреть сообщение
C#
1
2
3
for (int i2=5; i2<=5; i2=i2+0.01){
for (int i3=5; i3<=5; i3=i3+0.01){
for (int i4=5; i4<=5; i4=i4+0.01){
Какие-то странные у тебя циклы. Во-первых, он не откомпилируется т.к. double не приводится к int. Во-вторых, если даже заменить int на double кол-во итераций всегда будет равно одному. Следовательно причина медленной работы в методе KoefLinearRegression, а не в циклах как таковых.
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 16
31.10.2015, 17:36  [ТС]
Ошибся когда печатал здесь код, конечно же там double а не int. Просто я не копировал, а набрал здесь по новой.
Метод KoefLinearRegression, повторюсь, сейчас вообще не используется на время поиска способа оптимизации. После его отключения время почти не изменилось, визуально на несколько процентов.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18296 / 14220 / 5368
Регистрация: 17.03.2014
Сообщений: 28,897
Записей в блоге: 1
31.10.2015, 17:38
Schielend, выложи весь код на котором можно увидеть проблему. Потому что иначе единственный совет который можно дать это - улучшай алгоритм. Совет правильный, но бесполезный.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.11.2015, 01:25
Schielend, потому что нужно не перебирать действительную область, а взять любой метод многомерной оптимизации и задать для него нужные параметры. Я так рассчитывал в своё время вектор коинтеграции для случайных процессов, у меня критерием оптимальности было равенство автокорелляционной функции в "окнах", на которые я делил исходный стохастический процесс. Тут ровно то же самое, только намного проще.
1
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 16
01.11.2015, 10:44  [ТС]
Psilon раз Вы с эти сталкиваетесь, то можете порекомендовать конкретный метод оптимизации? Я не программист и мне это нужно все-лишь один раз.
Библиотеку планирую взять отсюда http://accord-framework.net/do... zation.htm
Какой из доступных методов взять?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.11.2015, 21:59
Schielend, при чем тут программист? Тут математика.

Я лично использовал метод розенброка, у меня в принципе есть реализация на шарпе. Но у меня там в качестве одномерного метода используется метод дихотомии (простейший метод одномерной оптимизации), можете взять уже готовое или улучшить (взять какой-нибудь метод получше).
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 16
02.11.2015, 11:46  [ТС]
Математику нужно преобразовать в программный код, а это мне не по силам.

Пошел по другому пути и решил распараллелить вычисления на потоки. Чтобы понять сам процесс сделал простую программу чтобы нагрузить процессор

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
double[] a = new double[11];
            double[] b = new double[11];
            var count = Environment.TickCount;
                    for (double s2 = 0; s2 <= 3; s2++)
                    {
                        for (double s3 = 0; s3 <= 5000; s3++)
                        {
                            for (double s4 = 0; s4 <= 5000; s4++)
                            {
                                 for (int i = 0; i <= 10; i++)
                                 {
                                     a[i] = i*i;
                                 }
                            }
                        }
                    }
            Console.WriteLine("a[0] = " + a[0]);
            Console.WriteLine("a[10] = " + a[10]);
            Console.WriteLine("Однопоточный: " + (Environment.TickCount - count));
            count = Environment.TickCount;
            Parallel.For(0,4, s2 =>
            {
                for (double s3 = 0; s3 <= 5000; s3++)
                {
                    for (double s4 = 0; s4 <= 5000; s4++)
                    {
                        for (int i = 0; i <= 10; i++)
                        {
                            b[i] = i*i;
                        }
                    }
                }
            });
            Console.WriteLine("b[0] = " + b[0]);
            Console.WriteLine("b[10] = " + b[10]);
            Console.WriteLine("Многопоточный: " + (Environment.TickCount - count));
            Console.ReadKey();
Но многопоточный процесс вычисляется почему-то дольше, чем однопоточный: 6568 против 7905 Tick.Count

Что делаю не так?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.11.2015, 13:02
Schielend, у вас экспоненциальная сложность. Это значит, что при n=2000 (как вы привели выше) время на вычисления скорее всего превосходит (и сильно) время тепловой смерти Вселенной.

Если точнее, то по данным из первого поста моя аппроксимация дает формулу y = 2.32en - 2.15 секунд. При n=2000 получаем 9e+868 секунд или 2,85e+861 лет. Учитывая, что возраст вселенной всего лишь 1.3e+10 лет, то не удивлен, что не дождались результатов.

Так что многопоточность вряд ли тут сможет помочь. Даже если будет в миллиард потоков фигачить.
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 16
02.11.2015, 13:34  [ТС]
Цифры в цикле я уже уменьшил до -2, 2, 0.01 и n=150 и теперь считает порядка 10 мин.
Но так как это цикл не весь, а только часть "матрешки", то расчет затянется от 10 мин до 1-2 часа, в зависимости от входных параметров. Вот это время я и хочу уменьшить хотя бы на 30% по возможности, что мои 8 ядер должны, я надеюсь, сделать.
Осталось только понять, что в приведенном последнем примере многопоточности я делаю не так, и тогда смогу применить это уже непосредственно к исходному коду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2015, 13:34
Помогаю со студенческими работами здесь

Ускорить работу метода
Здравствуйте. Имеется небольшой и простой метод: private string ToStringLine(byte byteArray) { string line =...

Ускорить работу программы
// 1-й вариант using System; using System.Net; using System.Collections.Generic; using System.Linq; namespace Les8._13...

Ускорить работу WebBrowser
мне нада сам код документа(Так как я шарюсь по всему сайте и собираю инфу). Тоесть то отображает webBrowser меня совсем неволнует, но...

Ускорить работу с файлом
Программа создает sitemap.xml файл для индексации поисковиками. Работает ну очень долго. Помогите ускорить. a = примерно 25000 ...

Ускорить работу с файлами
Всем привет! Вот код программы: void FileCompare(Object Info) { ProgressBar progressBar =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru