Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2012, 19:46   #1
wol4aravio
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 18
Вопрос Обработка и вычисление математического выражения

Доброе время суток.

Занимаюсь реализацией генетических алгоритмов оптимизации функций. Возникла следующая проблема: в связи с большой размерностью решаемых задач необходимо в огромных количествах выполнять подсчет значения функции в точках. Функция задается пользователем как строка, которая разбивается и переводится в постфиксную форму, по которой потом строится дерево выражения. Подсчитал, что очень много времени уходит на эти операции, порой даже минут 40. Собственно, возник следующий вопрос: есть ли алгоритмы подсчета значения выражения, заданного в виде строки, который бы работал быстрее, чем описанный?
wol4aravio вне форума Ответить с цитированием
Старый 18.09.2012, 20:09   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Что у Вас за выражение такое, разбор которого требует 40-ка минут? Вы пытаетесь одной формулой описать Вселенную?
Дерево выражения? Можно не строить, по-крайней мере для математических выражений можно пытаться вычислить непосредственно через рекурсию (в естественном виде без всяких там постфиксных форм). Не могу ничего сказать по поводу эффективности - никогда не проводил такого сравнения. Вообще условие описано очень мутно, можно сказать, что задача не описана вообще. Приведите примеры выражений которые Вы разбираете по 40 минут.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 18.09.2012 в 20:11.
Utkin вне форума Ответить с цитированием
Старый 18.09.2012, 20:12   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что это за функция такая что 40 мин компилируется?
Проекты из тысяч строк и то компиляторы за секунды проводят, а у тебя более получаса...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.09.2012, 20:22   #4
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Цитата:
есть ли алгоритмы подсчета значения выражения, заданного в виде строк
я бы подключил какой-нить скриптовой язык (я вроде когда-то делал через ironruby) либо можно выражение завернуть в функцию и скомпилить через CodeDom
Reskov вне форума Ответить с цитированием
Старый 18.09.2012, 21:39   #5
wol4aravio
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 18
По умолчанию

Извиняюсь, немного некорректно описал проблему: 40 минут идет не на построение дерева выражений - это происходит почти моментально, простые задачи долго обсчитываются. Проблема в долгом подсчете самого выражения по дереву.

Последний раз редактировалось wol4aravio; 18.09.2012 в 21:41.
wol4aravio вне форума Ответить с цитированием
Старый 18.09.2012, 22:03   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Покажите образец выражения
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 18.09.2012, 22:25   #7
wol4aravio
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Покажите образец выражения
-x*sin(sqrt(abs(x)))-y*sin(sqrt(abs(y)))
wol4aravio вне форума Ответить с цитированием
Старый 19.09.2012, 00:10   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
-x*sin(sqrt(abs(x)))-y*sin(sqrt(abs(y)))
Это легко вычисляется
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 19.09.2012, 07:19   #9
wol4aravio
Пользователь
 
Регистрация: 27.04.2012
Сообщений: 18
По умолчанию

Цитата:
Это легко вычисляется
Я знаю. Я через алгоритм Дейкстры перевожу в постфиксную форму, по ней строю дерево, по которому и считаю. Меня интересует есть ли методы сделать подсчет быстрее?
wol4aravio вне форума Ответить с цитированием
Старый 19.09.2012, 10:50   #10
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Обратная польская нотация не понравилась? А вообще, скачайте какой-нибудь математический парсер с возможностью компиляции выражений, и вперёд. Если просто пипец как нужна скорость, есть OpenCL/CUDA или шейдеры, но думаю вам это не нужно.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение математического выражения DeadWarlock Паскаль, Turbo Pascal, PascalABC.NET 2 18.09.2012 18:23
вычисление математического выражения Gunina Помощь студентам 4 12.09.2012 17:34
чтение из файла математического выражения Student1992 Паскаль, Turbo Pascal, PascalABC.NET 5 14.11.2011 02:40
решение математического выражения akum905 Общие вопросы C/C++ 0 12.11.2011 00:04
Cоздание дерева математического выражения CilCatblack Общие вопросы C/C++ 3 20.04.2009 14:22