2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5
 
 Re: Весьма нетривиальная оптимизация
Сообщение17.12.2018, 01:20 


25/02/11
123
В общем изрядно поиздевавшись над "Леннардом Джонсом" пришел к следующему выражению:
$h(d) = \frac{1}{d}-(\frac{0.1}{d})^{10}$
Как мне кажется обрыв достаточно резкий чтобы отбить всяческое желание сближать точки ближе чем $0.1$. Завтра проверю.

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение17.12.2018, 13:26 


25/02/11
123
vpb в сообщении #1357281 писал(а):
$$ f(\Phi)=\sum_{i=1,\ldots,N;\ j=1,\ldots,M} h(d(x_i, \Phi y_j)) (f(x_i)-g(y_j))  ? $$
где $x_i$ --- это точки первой поверхности, $M$ штук, $y_j$ --- точки второй, $N$ штук, $d(x,y)$ --- обычное расстояние между точками в трехмерном пространстве, $\Phi$ означает то самое движение (а $\Phi y$ соответственно --- результат применения движения к точке $y$) ?

vpb в сообщении #1357558 писал(а):
Есть такая возможность ускорить вычисление $f(\Phi)$. Рассмотрим функции от $x$ и $y$:
$$ p(x)=\sum_{j=1}^M h(d(x,y_j))g(y_j)\,, \qquad q(y)=\sum_{i=1}^N h(d(x_i,y)) f(x_i)\,.$$
Тогда легко видеть, что
$$f(\Phi)=\sum_{j=1}^Mq(\Phi y_j)-\sum_{i=1}^Np(\Phi^{-1}x_i)$$


В общем я только сейчас понял ещё один неприятный момент - хоть я и писал ранее "разность энергий близлежащих (одна от первой поверхности, другая от второй) точек", на деле надо учитывать и когда наборот.
Т.е. на деле мне нужна не разность, а модуль разности (f и g нормированы так чтобы лежать в интервале $\pm 0.5$) :facepalm:
$$ f(\Phi)=\sum_{i=1,\ldots,N;\ j=1,\ldots,M} h(d(x_i, \Phi y_j)) \lvert f(x_i)-g(y_j) \rvert  ? $$

При этом с $f(x_i)$ и $g(y_j)$ можно делать все что вздумается (сдвигать/масштабировать), лишь бы сохранялся принцип - маленькое f хочет к большому g, а маленькое g хочет к большому f.

vpb, возможно ли все ещё ускорить вычисления при таком раскладе?

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение17.12.2018, 16:53 


25/02/11
123
Пока единственное что приходит в голову это заменить модуль квадратом и тогда уже считать четыре таблицы вместо двух. Но вот раскрыть этот кошмар у меня пока не выходит, быть может это и невозможно.

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение17.12.2018, 18:22 
Заслуженный участник


18/01/15
3299
Подумать надо, однако !

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение20.12.2018, 03:38 


25/02/11
123
Так и не смог раскрыть честно, поэтому решил просто прикинуть как оно должно выглядеть чтобы было красиво:
$$ p(x)=\sum_{j=1}^M h(d(x,y_j))g(y_j)\,, \qquad q(y)=\sum_{i=1}^N h(d(x_i,y)) f(x_i)\ $$
$$ pp(x)=\sum_{j=1}^M h(d(x,y_j))g^2(y_j)\,, \qquad qq(y)=\sum_{i=1}^N h(d(x_i,y)) f^2(x_i)\ $$
$$ f(\Phi)=\sum_{j=1}^Mqq(\Phi y_j)+\sum_{i=1}^Npp(\Phi^{-1}x_i)-\sum_{j=1}^Mg(y_j)q(\Phi y_j)-\sum_{i=1}^Nf(x_i)p(\Phi^{-1}x_i) $$
Только что опробировал с $h(d) = \frac{1}{d}-(\frac{0.1}{d})^{10}$ и результаты хоть и адекватные (нет постоянных вылетов за границы, несходимости и т.д.), но противоречат ожиданиям - теперь второе тело отчаянно стремится залезть в первое.
Завтра попробую с какой-нибудь экспонентой в качестве $h$. Просто не могу быть уверен, проблема в моем $h$ или в интуитивном нахождении $f$.

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение20.12.2018, 11:04 


25/02/11
123
Ах да, $\sum_{j=1}^Mg(y_j)q(\Phi y_j) $ и $ \sum_{i=1}^Nf(x_i)p(\Phi^{-1}x_i) $ равны друг другу вплоть до 5го знака, очевидно что незначительная ошибка исходит из интерполяции. Это подверждает что все считается как я думаю. Вопрос лишь в том правильно ли это.

(Оффтоп)

upd: в поисках ошибок нахожу даже то, чего нет :mrgreen:


-- Чт дек 20, 2018 11:59:42 --

В общем сегодня ещё попробую $h(d) = \frac{100}{d}-(\frac{1}{d})^{10}$, т.е. теперь пик в 1, а не в 0.1. Теперь внутри первого тела точно не должно хватить места для второго.

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение20.12.2018, 16:42 


25/02/11
123
$h(d) = \frac{100}{d}-(\frac{1}{d})^{10}$ оправдала ожидания, теперь наложения практически нет (если использовать Пауэлла и Нелдер-Мида, ЛБФГС да и любой другой метод использующий производные как мне кажется здесь не справляется с задачей), однако чисто на глаз мне кажется что найденное положение отнюдь не самое лучшее, хотя и неплохое.
Попробую ещё сдвинуть пик например в 3. Экспонента теперь точно отменяется: в ней нет смысла, т.к. автоматическое предотвращение наложения перевешивает все минусы.

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение20.12.2018, 22:43 


25/02/11
123
$h(d) = \frac{1}{d^3}-(\frac{1}{d})^{10}$
Поигравшись со стартовыми углами поворота (раньше они были нулевые) и стартовыми сдвигами убедился что увы наложение очень даже возможно. Не знаю почему так получается. Как мне казалось с таким резким спадом отсутствие наложений должно быть гарантировано. Хотя быть может он слишком резкий и поэтому любой дальнейший сдвиг приводит к ухудшению ситуации и как следствие метод застревает.
https://i.ibb.co/dt4kPWF/untitled.png

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение21.12.2018, 05:46 
Заслуженный участник


18/01/15
3299
_genius_
Как я раньше Вам писал в ЛС, я более-менее решил вопрос, как ускорить вычисления с новой функцией (содержащей $|f(x_i)-g(y_j)|$). Но аккуратно это написать требует некоторого времени. Имейте терпение. Начало, однако, я уже написал,
см.ниже.

Вы пишете что-то странное:
_genius_ в сообщении #1362603 писал(а):
Так и не смог раскрыть честно, поэтому решил просто прикинуть как оно должно выглядеть чтобы было красиво:
$$ pp(x)=\sum_{j=1}^M h(d(x,y_j))g^2(y_j)\,, \qquad qq(y)=\sum_{i=1}^N h(d(x_i,y)) f^2(x_i)\ $$
$$ f(\Phi)=\sum_{j=1}^Mqq(\Phi y_j)+\sum_{i=1}^Npp(\Phi^{-1}x_i)-\sum_{j=1}^Mg(y_j)q(\Phi y_j)-\sum_{i=1}^Nf(x_i)p(\Phi^{-1}x_i) $$

Но, собственно, к задаче то это не имеет отношения ! Это очень напоминает то, как школьник (причем бестолковый), "решая" задачу, комбинирует данные в условии числа каким-то случайным образом, типа складывает метры с килограммами. В общем, подозреваю, что Вы в логике задачи путаетесь.

Перейдем, однако, собственно к предмету. Можно и в предлагаемом случае ускорить вычисления, правда, не так сильно.

Сначала несколько общих слов.
1) Произошла накладка в обозначениях, которую я и сам не заметил: употреблял букву $f$ в двух разных смыслах. Пусть то, что было $f(\Phi)$, обозначается $E(\Phi)$.
2) Разумно будет у функции $h$ поменять знак, так как это на самом деле потенциальная энергия: $h(d)=(0,1/d)^{10}-(1/d)$. Кроме того, в задачах оптимизации обычно ведется речь о нахождении минимума какой-либо функции, а не максимума. Имея же дело с потенциальной энергией, сам бог велел искать минимум.
3) Функции $f$ и $g$ сдвинем, из соображений удобства. Считаем, что они принимают значения в отрезке $I=[0;1]$.

Итак, пусть $x_i$, $i=1,\ldots,N$, $y_j$, $j=1,\ldots,M$, $f(x),g(y)\in[0;1]$ --- как раньше, $h(d)=(0,1/d)^{10}-(1/d)$,
$$ E(\Phi)=\sum_{i,j} h(d(x_i,\Phi y_j))\cdot |f(x_i)-g(y_j)|, $$
$$ p(x)=\sum_{j=1}^M h(d(x,y_j)) g(y_j)\, \qquad q(y)=\sum_{i=1}^N h(d(x_i,y)) f(x_i)\,.$$
Собственно, функции $p(x)$, $q(y)$ как таковые нам нужны не будут. Нужны же будут некоторые их модификации.

Разобьем отрезок $I$ на несколько частей, скажем, на три равных: $I_1=[0; 1/3]$, $I_2=[1/3; 2/3]$, $I_3=[2/3; 1]$. Также для дальнейших вычислений, заметим, удобно будет перенумеровать точки $x_i$ в порядке возрастания функции $f(x_i)$, и аналогично поступить с $y_j$.

Основная мысль --- разбить множество всех пар $(i,j)$ на девять частей, согласно тому, в какой из отрезков $I_{1,2,3}$ попадают $f(x_i)$ и $g(y_j)$. А именно, пусть
$$ E_{ab}(\Phi)=\sum'_{i,j} h(d(x_i,\Phi y_j))\cdot |f(x_i)-g(y_j)|, $$
где штрих означает, что сумма берется по парам $(i,j)$, для которых $f(x_i)\in I_a$, $g(y_j)\in I_b$, $a,b=1,2,3$. Ясно, что $E(\Phi)=\sum_{a,b=1}^3 E_{ab}(\Phi)$.

Суммы $E_{aa}(\Phi)$ вычисляются прямо. А при $a\ne b$ можно сэкономить. Например, если $a=1$, $b=2$, то $|f(x_i)-g(y_j)|=g(y_j)-f(x_i)$, значит сумма есть
$$ E_{12}(\Phi)=\sum'_{i,j} h(d(x_i,\Phi y_j))\cdot (g(y_j)-f(x_i)) = $$
$$ = -\sum_{\{j\mid g(y_j)\in I_2\}} q_1(\Phi y_j) + \sum_{\{i\mid f(x_i)\in I_1\}} p_2(\Phi^{-1} x_i), $$
где
$$ q_1(y)=\sum_{\{i\mid f(x_i)\in I_1\}} h(d(x_i,y)) f(x_i)\,, \qquad 
p_2(x)=\sum_{\{j\mid g(y_j)\in I_2\}}h(d(x,y_j)) g(y_j)\,.$$
Аналогично можно поступить для вычисления сумм $E_{ab}(\Phi)$ в остальных случаях с $a\ne b$.

Такова основная мысль. Предлагаю Вам ее осознать, прежде чем переходить
к тому, что будет написано ниже.

(продолжение следует)

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение22.12.2018, 11:06 
Заслуженный участник


18/01/15
3299
Теперь мы изложенное выше обобщим и улучшим.
Пусть $s\geq2$. Разобьем отрезок $I$ на $s$ частей $I_1,\ldots,I_s$, где $I_t=[(t-1)/s; t/s]$. Определим
$$ p_a(x)=\sum_{\{j\mid g(y_j)\in I_a\}} h(d(x,y_j))g(y_j)\,,\qquad q_a(y)=\sum_{\{i\mid f(x_i)\in I_a\}} h(d(x_i,y))f(x_i)\,, \qquad a=1,\ldots,s.$$ Также определим функции $$ \widetilde p_1(x)=p_2(x)+p_3(x)+\ldots+p_s(x)\,, \qquad \widetilde p_2(x)=-p_1(x)+p_3(x)+\ldots+p_s(x)\,, $$ $$ \widetilde p_3(x)=-p_1(x)-p_2(x)+p_4(x)+\ldots+p_s(x)\,. $$ короче,
$$ \widetilde p_a(x)=\sum_{l=1}^s{\rm sgn}(l-a) p_l(x)\,, $$ где ${\rm sgn}(m)=-1$ при $m<0$, $1$ при $m>0$, $0$ при $m=0$.
Аналогично положим $$ \widetilde q_a(y)=\sum_{l=1}^s{\rm sgn}(l-a) q_l(y)\,.$$ Сумму для $E(\Phi)$ разобьем на два слагаемых: $E(\Phi)=E_1(\Phi)+E_2(\Phi)$, где $E_1(\Phi)$ --- сумма всех слагаемых, отвечающих тем парам $(i,j)$, для которых $f(x_i)$ и $g(y_j)$ лежат в разных отрезках $I_a$, а $E_2(\Phi)$ --- тем парам, дляя которых они лежат в одном $I_a$. Понятно, что если значения $f(x_i)$ и $g(y_j)$ распределены по отрезку
$I$ примерно равномерно, то во вторую сумму попадает примерно $1/s$-я доля всех слагаемых, а все остальные (т.е. почти все, при $s>>1$) --- в первую.

Сумму $E_2(\Phi)$ вычисляем непосредственно.

Затем рассмотрим вычисление суммы $E_1(\Phi)$. Для $1\leq i\leq M$ пусть $a_i$ --- номер того из отрезков $I_a$, в который попадает $f(x_i)$. Аналогично определим $b_j$ тем, что $g(y_j)\in I_{b_j}$.

Выпишем формулу для $E_1(\Phi)$ (обдумать и проверить ее правильность оставляю Вам самому): $$ E_1(\Phi)=\sum_{i=1}^N\widetilde p_{a_i}(\Phi^{-1}x_i)\ +\ \sum_{j=1}^M\widetilde q_{b_j}(\Phi y_j). $$
Применение этой формулы даже для небольших $s$ дает выигрыш в скорости вычисления функции $E(\Phi)$.

Теперь рассмотрим вопрос о том, каковы вычислительные ресурсы (время и память), нужные для вычисления $E_1(\Phi)$. Мы покажем, что время, по существу, примерно то же, что и при вычислении по (неверной) формуле
$$ E(\Phi)=\sum_i p(\Phi^{-1}x_i) -\sum_j q(\Phi y_j)\, $$ а памяти надо в $s$ раз больше.

Для простоты оценок будем считать, что $M=N$.

Пусть $L$ --- число узлов сетки, в которых табулируются $\widetilde p_a$ и $\widetilde q_b$. При вычислении по старой формуле табуляция функций $p$ и $q$ требует, очевидно, $O(ML)$ арифметических операций (вычисление каждого слагаемого $h(d(x,y_j))q(y_j)$ требует, очевидно, не более $C$ арифметических операций, где $C$ --- некоторая не очень большая постоянная (порядка нескольких десятков).) Объем же памяти для хранения значений $p$ и $q$ есть $O(L)$, очевидно (надо хранить значения $p$ и $q$
во всех узлах).

При вычислении "по новому" памяти надо в $s$ раз больше, так как нам надо хранить значения в тех же узлах $2s$ функций $\widetilde p_a$, $\widetilde q_b$.

Собственно вычисление распадается на две части:
(1) табулирование значений функций $\widetilde p_a$, $\widetilde q_b$ и
(2) применение найденной таблицы к вычислению функции $E_1(\Phi)$.
(Есть еще (2а) --- вычисление части $E_2(\Phi)$, которая рассматривается несколько позже.)

Часть (2) имеет ту же трудоемкость, что и в "неправильной" ситуации (это ясно, более-менее).

Для вычисления значений функций $p_a(x)$ в узлах мы вычисляем те же самые слагаемые $h(d(x,y_j))g(y_j)$, что и раньше. Однако, теперь эти слагаемые дают вклады в разные функции $p_a$. Но всего слагаемых столько же, сколько и ранее, а именно порядка $ML$. А стало быть, и сложность
та же. После того, как вычислены все числа $p_a(x)$, мы вычисляем все $\widetilde p_a(x)$. При этом, заметим, не обязательно каждый раз (для каждого $a$) вычислять сумму из $s-1$ слагаемого. Мы можем вычислить $\widetilde p_1(x)$, это требует $O(Ls)$ операций, а затем вычислить $\widetilde p_a(x)$ последовательно, используя соотношение $\widetilde p_a(x)=\widetilde p_{a-1}(x) -p_a(x)-p_{a-1}(x)$. Это опять потребует $O(Ls)$ операций. Таким образом, общая сложность табулирования функций $\widetilde p_a$ и $\widetilde q_b$ есть $O(ML+Ls)$. Что касается вычисления слагаемых $E_2(\Phi)$, то оно для каждого $\Phi$ имеет сложность порядка $M^2/s$ операций.

(Изложенное рекомендуется продумать и проверить. У меня, знаете ли, тоже бывают ошибки.)

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение22.12.2018, 12:07 
Заслуженный участник


18/01/15
3299
vpb в сообщении #1362834 писал(а):
Но, собственно, к задаче то это не имеет отношения ! Это очень напоминает то, как школьник (причем бестолковый), "решая" задачу, комбинирует данные в условии числа каким-то случайным образом, типа складывает метры с килограммами. В общем, подозреваю, что Вы в логике задачи путаетесь.
В этом месте я был неправ (не въехал поначалу).

 Профиль  
                  
 
 Re: Весьма нетривиальная оптимизация
Сообщение22.12.2018, 14:28 


25/02/11
123
Никакой научной тайны здесь нет, буду даже рад если кому-нибудь когда-нибудь наша дискуссия поможет. Поэтому смело переношу сообщение из ЛС в тему:

0) Если $$ \sum_{j=1}^Mqq(\Phi y_j)+\sum_{i=1}^Npp(\Phi^{-1}x_i)-\sum_{j=1}^Mg(y_j)q(\Phi y_j)-\sum_{i=1}^Nf(x_i)p(\Phi^{-1}x_i) = \sum \sum h(d(x_i, \Phi y_j)) (f(x_i)-g(y_j))^2 $$
то в целом я не так уж и не прав. Так ли это, как Вы считаете? Если так, то быть может мне лучше использовать именно квадрат вместо модуля, т.к. я уже убедился что считается он довольно быстро.
1) Это нестрашно, меня это ни разу не смутило.
2) Все правильно, я собственно так и делал при оптимизации (т.е. менял знак), но не из каких-то принципиальных соображений, а просто потому что в библиотеке scipy есть только minimize.
3) Как Вам будет угодно.
4) С $h$ я ещё поиграюсь, вне всякого сомнения. Точек очень и очень много, поведение оптимизитора непредсказуемо, поэтому надо просто пробовать разные варианты.
Я в любом случае попробую Вашу новую идею для сравнения, но мне кажется что она может быть значительно медленнее, т.к. вычислений будет больше плюс дополнительные проверки кто больше, особенно если $f$ и $g$ лежат в одном интервале. Но насколько медленнее можно узнать только протестировав.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу Пред.  1, 2, 3, 4, 5

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: B@R5uk


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group