Забавная програмка

Модератор: Бессмертные

Ответить
Prospero
Сообщения: 234
Зарегистрирован: Чт июн 14, 2007 9:17 am

Забавная програмка

Сообщение Prospero » Пт май 14, 2010 12:13 pm

Вообщем я тут столкнулся с такой забавной штукой как оптимизация, по едрическому колличеству параметров, функции, которая очень криво зависит от этих параметров.
Большинство методов выдаёт оптимум относительно какой-то точки, ну фактически пытается двигать по шажкам точку в многомерном пространстве и смотреть, не приходим ли мы к минимуму (а мне минимум нужно найти).
Результатом этого вылилось в такой вот забавный метод оптимизации:
Есть скажем 6 координат функции, каждой координате задаём отрезок локализации, разбиваем отрезок на 5 частей, ну и шарашим вложенные циклы по всем 6 коорденатам. В самом нижнем проверяем, что выходит у нас (вдруг уменьшилось), ну а потом наращиваем постепенно на шажок каждую координату. Потом от оптимумов делаем шаг в право - новый максимум, шаг в лево - новый минимум. В результате уменьшаем область локализации на 40%. Потом делим отрезок опять на пять частей и по новой.
Проблема в том, что нужно как-то прогнать все комбинации для каждой из всех переменных, а функция вычисляется довольно-таки долго. 6 координат в результате минут за 14-15 один проход делает. Следующим посту кину кусок из программы. Если кто знает как можно это сделать оптимальнее - помогите :)
Пасущий иожиков

Prospero
Сообщения: 234
Зарегистрирован: Чт июн 14, 2007 9:17 am

Сообщение Prospero » Пт май 14, 2010 12:16 pm

while (Divm>DF) {


O[1]=Omin[1];
while (O[1]<Omax[1]) {O[2]=Omin[2];
while (O[2]<Omax[2]) {O[3]=Omin[3];
while (O[3]<Omax[3]) {O[4]=Omin[4];
while (O[4]<Omax[4]) {O[5]=Omin[5];
while (O[5]<Omax[5]) {O[6]=Omin[6];
while (O[6]<Omax[6]) {O[7]=Omin[7];
while (O[7]<Omax[7])
{
Divt=All1();
if (Divm>Divt)
{
Divm=Divt;
for (m=1;m<(N+1);m++) {OO[m]=O[m];}

}
O[7]=O[7]+h[7];
}
O[6]=O[6]+h[6];}
O[5]=O[5]+h[5];}
O[4]=O[4]+h[4];}
O[3]=O[3]+h[3];}
O[2]=O[2]+h[2];}
O[1]=O[1]+h[1];}
for (m=1;m<(N+1);m++)
{
Omax[m]=OO[m]+h[m];
if (Omax[m]>Og2[m]) {Omax[m]=Og2[m];}
Omin[m]=OO[m]-h[m];
if (Omin[m]<Og1[m]) {Omin[m]=Og1[m];}
h[m]=(Omax[m]-Omin[m])/5;
}
}

All1() как раз функция что у меня считается. Ну а остальное весьма и весьма прозрачно
Пасущий иожиков

Kyrand
c7i.team
Сообщения: 310
Зарегистрирован: Сб янв 07, 2006 4:17 pm

Сообщение Kyrand » Сб май 15, 2010 10:20 am

На сочетание "оптимизация" и "едрическое число параметров" первая ассоциация - генетический алгоритм, но он не обеспечит полного прогона.
Или там точно известно, что один единственный минимум?
Обходя грабли, ты теряешь ценную экспу!
Мохнолапый Следопыт.

Prospero
Сообщения: 234
Зарегистрирован: Чт июн 14, 2007 9:17 am

Сообщение Prospero » Сб май 15, 2010 12:03 pm

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

Kyrand
c7i.team
Сообщения: 310
Зарегистрирован: Сб янв 07, 2006 4:17 pm

Сообщение Kyrand » Сб май 15, 2010 12:15 pm

Ну, тогда я бы как раз генетический алгоритм заюзал.
Обходя грабли, ты теряешь ценную экспу!
Мохнолапый Следопыт.

Prospero
Сообщения: 234
Зарегистрирован: Чт июн 14, 2007 9:17 am

Сообщение Prospero » Сб май 15, 2010 7:11 pm

Я поискал немного про эту тему, но самое фигня в том, что или я такой тугадум, ну или так написано для слишком общего случая, мне к 20 числу надо что-то насчитать, а я скорее до этого времени только генерить алгоритм буду :) Ладна, пасиба и на этом
Пасущий иожиков

Almar
Сообщения: 205
Зарегистрирован: Чт янв 19, 2006 11:41 am
Откуда: Ярославль

Сообщение Almar » Вт май 18, 2010 10:25 am

О боже
Ничего не понял.
Есть функция, которая зависит от множества параметров? И надо найти ее минимумы? Дак если производную посчитать и все?
Вредный и пушистый

Almar
Сообщения: 205
Зарегистрирован: Чт янв 19, 2006 11:41 am
Откуда: Ярославль

Сообщение Almar » Вт май 18, 2010 10:29 am

А если ее формулы нет, то можно на основании F(x)=y создать эту формулу. (Такое точно проходили в универе, название не понмю как это делается) Но она не точная будет конешно, но чем больше точек возмешь, тем меньше погрешность будет. И потом вот от нее и считать производные.
Вредный и пушистый

Prospero
Сообщения: 234
Зарегистрирован: Чт июн 14, 2007 9:17 am

Сообщение Prospero » Вт май 18, 2010 12:25 pm

Когда у тебя функция зависит от одного параметра сделать апроксимацию быстро и удобно. От двух получишь плоскость параметров, от трёх - объём. Ну а начиная с некоторого значения колличества переменных возникнет такая фуета с производными, что ты опупыришься создавать апроксимирующие функции и брать производные, искать экстремум, брать вторую производную и находить предел. Учитывая ещё то, что сама целевая функция через задницу получается из артангенса от двухкомплексных функций, которые в свою очередь ещё и являются произведением n-ого колличества квадратных матриц...вообщем производную не легче посчитать. Хотя может было бы и правильнее, но точно дольше
Пасущий иожиков

Ответить