powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Медитация над полной гистограммой оптимизации
25 сообщений из 28, страница 1 из 2
Медитация над полной гистограммой оптимизации
    #40003129
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пусть мы производим оптимизацию каким-то более-менее случайным методом проверки точек (исследуемого пространства).

И, предположим, мы накапливаем гистограмму всех полученных нами -- в процессе перебора -- значений целевой функции. И видим на этой гистограмме

-- более менее вблизи текущего найденного лучшего её значения (а не где-то "ниже плинтуса") --

области сгущения (пики гистограммы) и области разряжения (впадины гистограммы) плотности встреченных нами значений (целевой функции).

Вопрос: какие из этих двух типов (областей) более перспективны для исследования (то есть продолжения случайного поиска)?
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40003144
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала я тоже помедитирую, с опорой на методы кластеризаии. И с оглядкой на отжиг,потому что со сферической случайностью дело тёмное: либо она равномерная (или белый шум), либо она даёт клоастеры (напр, Гаусс). Кластеры (например в естественных предм. областях могут тоже разбросаны или сгруппированы).

Предполагаю с сомнением. Допустим мы как в соцопросах провели представительное предварительное тестирование. А как вела себя в динамике дисперсия по Х для сгустков F(x) и пустот? Если как в отжиге: -->0, я возьму сгустки. Если неизвестно как - а такое возможно? Постоянная - тем более. А после нескольких таких проб вдруг бац! - облом, надо было пустоты изучать. Так опыт и нарабатывается.
Пока могу только для сферического распределения подходить так, как выполняют разведочный анализ (см. Мешалкин,Айвазян или аналогия с соцопросом) Начальная оценка Д и МО, потом тестирование, уточнение Д и МО. И т.д итерационно. Целая наука.
Скажу только, что проведя тесты, не имеем гарантии т.н. "ураганных проб" из геологии. против них специально изобретали робастные методы оценок (в данном случае речь об априорном стат. оценивании показателей Д и МО). Как ни странно, адаптивные оценки на основе медианы в свое время показали себя лучше других.

Ясны же истоки вопроса: как с завязанными глазами отличить локальную лужу от глобального болота. Носить с собой шарик на длинной резинке, забрасывать его в разные стороны и ждать, когда скатится. Сколько ждать? хороший вопрос.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40003151
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

а не проще искать чем ни будь более обоснованным с таких мест? н-р, Алгоритм Левенберга — Марквардта
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40003168
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
Ясны же истоки вопроса
-- истоки вопроса -- попытка выстроить (и обсудить) полную антитезу подходу, который -- как обсужденный ранее метод отжига -- настолько ничего не помнит о процессе перебора точек (исследуемого пространства), что даже найденные (в процессе) хорошие результаты (а среди них, возможно, и глобальный оптимум) предлагает отбрасывать ...

При том что ресурсы (памяти) современного железа позволяют вообще ничего отбрасывать, но весь процесс блуждания по исследуемому пространству сохранять. Однако сохранить-то можно -- вопрос: как задействовать этот массив информации в повышении эффективности поиска?
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40003302
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А каким подходом найти минимум стохастической функции?
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40003410
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
При том что ресурсы (памяти) современного железа позволяют вообще ничего отбрасывать, но весь процесс блуждания по исследуемому пространству сохранять.

Если ресурсы это позволяют, то и блуждание не нужно.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40003512
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, ресурсы позволяют это , но всё-таки не всё (что душе угодно).
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40005226
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо отжига сделал просотой вариант на VBA. Метод роящихся частиц для 1-мерной ф-ции. Делал, чтоб скорее.
Выглядит как готовый макрос для эксэлки-2003. Можно на этом макете обдумать подходы к сферической случайности для сферической ф-ции.
- В чистой книге открыть "Вижуал бэйсик".
- Через меню вставить новый "Модуль".
- В чистоеполедля кода Модуля вставить текст проги.
- Дополнительно открыть окно "Immidiate" - туда пойдут отладочные принты.
- "F5" = start, и подождать недолго. В случе чего "ESC".

В основном описал параметры в начале проги. Кратенько описание остального.
Главные недостатки примера:
ф-ция одномерная, дискретная (150 значений),
её аргументы целочисленные,
случ.величины не явл. независимыми, все из одной последоват-сти.
ГПСЧ сам по себе недостаток.
Параметры метода подбирать рукми.

С т.зр. модульности оформлено так:
Собственно метод "Function roen()"
Над ним обёртка "Sub test()". Она запускает послед-ность прогонов одного теста.

Работает так:
52 раза Х 800 прогонов.
Разница у погонов в том, что после вызова roen() там внутри ГПСЧ стартует заново с другого значения (секунды от полуночи).
Окончив прогон, roen() возвращает приближённое значени миниммуа ф-ции.
И так 800 раз.
Затем test() печатает МОж и СКО от полученных 800 значений.
И так 52 раза, из к-рых первые 2 раза для предположительного "разогрева" ГПСЧ.
Затем копируем 3-52 разы на лист в эксэлу и смотри графики.
Потом, как это делал я, для разных параметров метода можно сравнивать общее среднее этих средних или их медиану, чтобы понимать точность матода.
Сейчас roen() возвращаетв test() оценку минимума в массиве структур "f0().fm". В test() МатОж и СКО считаются для минимума. Лёгким движением руки их можно считать для номера точки "f0().ym".

Учитывая недостаток (целочисленность аргументов ф-ции), подбор параметров менее очевиден, чем для непрерывного случая. Поскольку точки должны прыгать на целое число шагов. Но в отжиге прыгает одна точка, а в отжиге их несколько и в конце итераций они могут сходиться друг к другу.
Эти прыжки в процессе уменьшаются и чем-то похожи на прыжки в отжиге, так что есть и общее у обоих методов.
И конечно никакой гарантии точного поиска.

Здесь текст проги на VBA (133 строки).
Код: vbnet
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
'' Искать Min( f()) и точку Xmin, метод роения M целочисленных точек
Option Explicit
Option Base 1
Private Type MyStat
    fm As Single
    ym As Single
End Type

 '' M точек роения, NN итераций, k Значений оптимизируемой ф-ции,
 '' {alf, bet, gam} параметры для расчёта след точки
 '' Ksi - независимые случ.вел. (но здесь они НЕ независ.)
 '' f(x(i)) - аргумент и значения ф-ции, аргументы x(i) целые
 '' Xm(M), Xm2(M) - M эволюционирующих точек: x(i) и x(i+1) 
 '' V(M) - вектор скорости эволюционирования к следующей итерации x(i)= x(i+1) + V(i+1)
 '' eps - не исп.
''''''const dd= 0, NN=10^2, M=7, k= 34+21,  alf=0.95, bet=0.2, gam=0.2, eps= 1.0e-6 
const dd= 0, NN=10^2, M=10, k= 150, alf=0.85, bet=0.3, gam=0.3, eps= 1.0e-6 

'' Тест для статистики
Sub test()
    On Error GoTo myerr
    Dim tn As Integer, ind As Integer, t As Integer
    tn = 800: ind = 1  ''2

    Dim tt As Integer, pp As Integer, x As Single
    For tt = 1 To 52
        x = Timer: For pp = 1 To 1023 * (x - Int(x)): DoEvents: Next pp
        
        ReDim f0(tn) As MyStat
        Dim m0 As Double, d0 As Double, tmp As Single
        m0 = 0: d0 = 0
        
        For t = 1 To tn
            tmp = roen(f0(t))
            m0 = m0 + f0(t).fm: d0 = d0 + f0(t).fm ^ 2
        Next t
        
        m0 = m0 / tn: d0 = d0 / (tn - 1) - m0 ^ 2
        Debug.Print "m="; Round(m0, 4); " sqr(d)="; Round(Sqr(d0), 4); "   m-s="; _
                   Round(m0 - Sqr(d0), 4); "  m+s="; Round(m0 + Sqr(d0), 4)
    Next tt
    Exit Sub

    myerr:
        Debug.Print Err.Number; " "; Error
        Resume Next
End Sub
'' ******************************************************


Private Function roen(ByRef f0 As MyStat) As Single
  On Error GoTo myerr
  
  Redim f(k), x(k), Xm(M) As Single, Xm2(m) As Single, V(m) As Single
  Dim minf, Xmm, Ksi1,Ksi2, tmp, t As Integer, kmin As Integer, fXmm As Single
  Dim i As Integer, j As Integer, kdim As Integer
  
  Randomize
  tmp= Rnd ''(Time)
  For i=1 to k: x(i)= i :Next i   '' начальные точки на оси X
  tmp= Rnd ''(Time)    на [0; 1]
  For i=1 to M: V(i)= Round(1+ Rnd, dd) :Next i   '' начальные скорости
  '''For i=1 to k: x(i)= -1 +0.01*(i-1) :Next i
  
  '' f(k) - оптимизируемая ф-ция
  For i = 1 TO 9 :  f(i)= 1/x(i): Next i
  For i = 1 TO 10 :  f(9+i)= 1/x(i): Next i
  For i = 1 TO 8 :  f(9+10+i)= 1/x(i): Next i
  For i = 1 To 7:   f(9 + 10 + 8 + i) = 1 / x(i): Next i
  
  For i = 1 To 8:   f(9 + 10 + 8 + 7 + i) = 1 / x(i): Next i
  For i = 1 To 7:   f(9 + 10 + 8 + 7 + 8 + i) = 1 / x(i): Next i
  For i = 1 To 6:   f(9 + 10 + 8 + 7 + 8 + 7 + i) = 1 / x(i): Next i

  For i = 1 To k:   f(i) = 2 + (1 + Sin(i)) * Sin(7 * i + 3.14159265358979 / 1023): Next i
  '''For i = 1 TO k :  f(i)= x(i)^2*(2+abs(sin(8*x(i)))): Next i  '' на [-4.0; +4.0]
  '' ******************************************************
  
  '' Случайные точки начальных min значений
  For i=1 to M: Xm(i)= Round( 1+ Rnd *(k-1), dd): Xm2(i)= Xm(i) :Next i  '' нормировать случ.знач. на оси X
  
  '' Основной цикл работы
  For t=1 to NN
  
      '' Xm() - точки предыдущей итерации, Xm2() - новые точки для текущей итерации
      '' Xmm - их общий минимум
      For i = 1 To M
          tmp = Xm2(i)
          If f(Xm2(i)) >= f(Xm(i)) Then Xm2(i) = Xm(i)
          Xm(i) = tmp
      Next i
  
      kmin= 1:  minf= f(Xm2(kmin))
      For i = 1 + 1 To M
          If f(Xm2(i)) < minf Then minf = f(Xm2(i)): kmin = i
      Next i
      Xmm = Xm2(kmin)
  
  
      '''' новые скорости
      For i=1 to M
          tmp= Rnd:  Ksi1 = Rnd:  tmp= Rnd: Ksi2 = Rnd
          V(i) = alf * V(i) + bet * Ksi1 * (Xm2(i) - Xm(i)) + gam * Ksi2 * (Xmm - Xm(i))  
      Next i
  
      '' новые точки    
      For i = 1 To M
          Xm2(i) = Round(Xm(i) + V(i), dd)
          If Xm2(i) < 1 Then Xm2(i) = 1
          If Xm2(i) > k Then Xm2(i) = k
      Next i
  
  Next t
  
  '' Итоговый min и его координата
  kmin = 1: minf = f(Xm2(kmin))
  For i = 1 + 1 To M
      If f(Xm2(i)) < minf Then minf = f(Xm2(i)): kmin = i
  Next i
  fXmm = f(Xm2(kmin))
      ''''''''''ret = MsgBox("min=" + Str(fXmm) + ", " + Str(Xm2(kmin)), vbOKOnly, "Закончили")
  
  f0.fm = fXmm: f0.ym = Xm2(kmin)
  roen = fXmm
Exit Function ''Sub
'' ******************************************************

 myerr:
     Debug.Print Err.Number; " "; Error
     Resume Next
 
End Function
'' ******************************************************

...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40005323
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считаю полезным дополнить.
К недостаткам реализации. Поведение вектора скорости на краях области определения ф-ции (т.е. на концах отрезка). Ну я просто сажаю точку в границу отреза, 1 или к соответственно.

К вопросу о скорости работы. Ф-ция задана в 150 точках, среди к-рых 5-7-10 точек роятся в течение 100 итераций, и для них на каждой итерации считается 2 случ значения. Конечно быстрее найти точный минимум полным перебором среди 150 значений.

Тем более статметод в половине случаев не даёт глобального минимума (точный минимум= 0.0093 в 33-й точке). Я сравнивал точность для роев из 5, 7 и 10 точек при 10 и 100 итерациях алгоритма. 100 итераций в данном случае избыточны, но 10 итераций может не хватить.
При M= 7 и 10, и NN=100 оценка минимума практически одинаковая ~0,1116.
Но при М=5 для NN=10 оценка ~0,13, а для NN=100 она ~0,12.
Значения конечно зависят от весов, используемых для расчёта скорости каждой точки.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40005552
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь можно потрогать вариант метода для непрерывной ф-ции. Сама ф-ция та же самая. Изменения в порге минимальные.
Зато изменения в параметрах весьма значительны:

52*80прогонов по 10^3 итераций M=40 точек на [1; 15]
MO= 0,6089 mediana= 0,6016 СКО= 0,6087

- Начальная скорость= 1+Rnd (на первой итерации метода).
- Кол-во точек M= 40 (вмесо 10). Даже этого недостаточно, из-за вида непрерывной ф-ции. Шаг=+1.0 теряет слишком много подробностей. Уменьшил область определения ф-ции до отрезка [1; 15] (вмесо 1-150).
- Кол-во итераций одного прогона NN = 10^3 (и скажу, даже этого недостаточно, но может сгодиться для разведочного анализа).
- Чтобы не терять время коло-во прогонов для усреднения tn= 80 (вместо 800).
- Учитывая, что аргументы ф-ции теперь непрерывные и double, округление их до целого не выполнять.
И всё равно судя по тестовым прогонам оценка глобального минимума на [1; 15] очень неточна. При шаге дискретизации =+0.1 глобальный мин на отрезке = 0,043.
Ещё кучка локальных минимумов на уровнях 0,5 1,0 1,5 2,0.
Однако судя по СКО==МО, на 80 прогонах оценка гуляла по всем перечисленным уровням. Причём похоже, что именно уровень глобального мин. достигался реже всего. Неудивительно, поскольку впадин уровня ~ 0.000 меньше,чем на других уровнях.

Как может помочь гибрид Ньютона и градиента, не представляю.
А значит проще всего в такой ситуации (если ф-ция вычисляется достаточно быстро) полный перебор с достаточно мелким шагом. Но надо ещё выбрать этот шаг.
ИМХО, без разведочного анализа не обойтись.

Теперь вариант проги для непрерывного случая (точнее сказать ф-ция,опредедлена на отрезке):
Код: vbnet
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
'' Искать Min( f()) и точку Xmin, метод роения M вещественных точек
Option Explicit
Option Base 1
Private Type MyStat
    fm As Single
    ym As Single
End Type

 '' M точек роения, NN итераций на непрерывном [1; k],
 '' {alf, bet, gam} параметры для расчёта след точки
 '' Ksi - независимые случ.вел. (но здесь они НЕ независ.)
 '' FF(x) - аргумент x и значения ф-ции double
 '' Xm(M), Xm2(M) - M эволюционирующих точек: x(i) и x(i+1), где i - итерации.
 '' Xm0(M) - начальный значени точек (чтобы потом сравнить с окончанием) 
 '' V(M) - вектор скорости эволюционирования к следующей итерации x(i)= x(i+1) + V(i+1)
 '' eps - не исп.
Const dd = 0, NN = 10 ^ 3, M = 40, k = 15, alf = 0.95, bet = 0.2, gam = 0.2, eps = 0.000001
''''''Const dd = 0, NN = 10 ^ 2, M = 40, k = 15, alf = 0.85, bet = 0.3, gam = 0.3, eps = 0.000001 
'' ******************************************************

  
'' Тест для статистики
Sub test()
    On Error GoTo myerr
        Dim tn As Integer, t As Integer '', ind As Integer

    tn = 80    '' : ind = 1  ''2

    Dim tt As Integer, pp As Integer, x As Single
    For tt = 1 To 52
        x = Timer: For pp = 1 To 1023 * (x - Int(x)): DoEvents: Next pp
        
        ReDim f0(tn) As MyStat
        Dim m0 As Double, d0 As Double, tmp As Single
        m0 = 0: d0 = 0
        
        For t = 1 To tn
            tmp = roen(f0(t))
            m0 = m0 + f0(t).fm: d0 = d0 + f0(t).fm ^ 2
        Next t
        
        m0 = m0 / tn: d0 = d0 / (tn - 1) - m0 ^ 2
        Debug.Print "m="; m0; " sqr(d)="; Sqr(d0); "   m-s="; _
                   m0 - Sqr(d0); "  m+s="; m0 + Sqr(d0)
    Next tt
    Exit Sub

    myerr:
        Debug.Print Err.Number; " "; Error
        Resume Next
End Sub
'' ******************************************************


Private Function roen(ByRef f0 As MyStat) As Double
  On Error GoTo myerr
  
  ReDim Xm(M) As Double, Xm2(M) As Double, V(M) As Double, Xm0(M) As Double
  Dim minf as Double, Xmm as Double, Ksi1 as Double, Ksi2 as Double, _
        tmp as Double, t As Integer, kmin As Integer, fXmm As Double
  Dim i As Integer, j As Integer, kdim As Integer, FF1 as Double, FF2 as Double
  
  Randomize
  tmp= Rnd ''(Time):  tmp= Rnd ''(Time)    на [0; 1]
  For i=1 to M: V(i)= 1 + Rnd : Next i   '' начальные скорости
    
  '' FF() - оптимизируемая непрерывная ф-ция
  '' FF() = 2 + (1 + Sin(x)) * Sin(7 * x + 3.14159265358979 / 1023)
  ''' FF= x^2*(2+abs(sin(8*x))) на [-2.0; +2.0]
  '' ******************************************************
  
  '' Случайные точки начальных min значений
  For i=1 to M: Xm(i)= 1+ Rnd *(k-1): Xm2(i)= Xm(i): Xm0(i)= Xm(i) :Next i  '' нормировать случ.знач. на оси X
  
  '' Основной цикл работы
  For t=1 to NN
  
      '' Xm() - точки предыдущей итерации, Xm2() - новые точки для текущей итерации
      '' Xmm - их общий минимум
      For i = 1 To M
          tmp = Xm2(i): FF1= FF(Xm(i)): FF2= FF(Xm2(i))
          If FF2 >= FF1 Then Xm2(i) = Xm(i)
          Xm(i) = tmp
      Next i
  
      kmin= 1:  minf= FF(Xm2(kmin))
      For i = 1 + 1 To M
          If FF2 < minf Then minf = FF2: kmin = i
      Next i
      Xmm = Xm2(kmin)
  
  
      '''' новые скорости
      For i=1 to M
          tmp= Rnd:  Ksi1 = Rnd:  tmp= Rnd: Ksi2 = Rnd
          V(i) = alf * V(i) + bet * Ksi1 * (Xm2(i) - Xm(i)) + gam * Ksi2 * (Xmm - Xm(i))  
      Next i
  
      '' новые точки    
      For i = 1 To M
          Xm2(i) = Xm(i) + V(i)
          If Xm2(i) < 1 Then Xm2(i) = 1
          If Xm2(i) > k Then Xm2(i) = k
      Next i
  
  Next t
  
  '' Итоговый min и его координата
  kmin = 1: minf = FF(Xm2(kmin))
  For i = 1 + 1 To M
      If FF(Xm2(i)) < minf Then minf = FF(Xm2(i)): kmin = i
  Next i
  fXmm = FF(Xm2(kmin))
      ''''''''''ret = MsgBox("min=" + Str(fXmm) + ", " + Str(Xm2(kmin)), vbOKOnly, "Закончили")
  
  f0.fm = fXmm: f0.ym = Xm2(kmin)
  roen = fXmm
Exit Function ''Sub
'' ******************************************************

 myerr:
     Debug.Print Err.Number; " "; Error
     Resume Next
 
End Function
'' ******************************************************

Private Function  FF( x as double) as double '' на [1: k]
    FF = 2 + (1 + Sin(x)) * Sin(7 * x + 3.14159265358979 / 1023)
End Function
'' ******************************************************

Пример ф-ции, отрезок [1; 15], точки с шагом +0,1
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40005554
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...но не успел рисунок подцепить.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40005557
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё немножко подумал. Может оказаться, что, зафиксировав шаг дискретизации ф-ции, и проведя развед. анализ (вкл. тот, что я здесь сделал),так вот,может оказаться, что после этоголучше перейти к дискретному варианту метода. Поскольку (ИМХО) в нём прыжки целочисленные, это напоминает как бы доработку непрерывного метода путём добаваки случайных прыжков.
А также проделанный предв. анализ дискретных случаев хочет убедить меня в том, что локализовав начальные М точек, мы скорее найдём ещё лучшую оценку для глоб. минимума.

И так 10 раз, т.к. изначально был дан отрезок [1; 150].

Затем иерархически дробим каждый отрезок более мелкой дискретизацией ...
И т.д.

Придётся придумать критерий, когда остановиться для взятой сферической ф-ции. И как выполнять разведочные анализы автоматически.

Заключение.
Примерно так мне видится запрашиваемая альтернатива с поправками на к-нибудь другой статметод локального поиска.
Вы готовы к этому?
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40005714
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
Но надо ещё выбрать этот шаг.

Он задаётся ещё на этапе постановки задачи. В пункте "допустимое отклонение".
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40005795
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разведка всё равно нужна.
В задачах, прикладных (к природе или технике), этого шага не знают обычно. Могут задать точность самого минимума, а локализация его места на Х скорее всего будет физико-техническим параметром устройства или модели, для к-рых будет расчёт.
И если заранее загрубить шаг, то (как в примере), позиция минимума выскочит куда-нить вроде того: газануть педалью в пол, вместо лёгкого нажатия. И это мож оказаться не физичным или неприемлемым решением. Помимо того, что значение оптимума будет вообще далёким от оптимума.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006060
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно сравнить метод Роя с методами Отжига и ГА.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006341
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравниьт можно, время выделить - не знаю. С моей колокольни отжиг проще ГА. И есть нюанс для обоих троих: кучка модификаций на разные случаи жизни. Я взял как проще, поскольку отжигу требовались конкретные распределения, а их надо реализовывать, а я не люьлю чужое искать, ну и т.п.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006344
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помнишь мою задачу по поиску границ 2-3 фотографий в фотоальбоме? Отжиг справится?
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006346
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как не помнить, всё жду возможностей продолжить, зацепило. Есть сомнение, чиой-то не могу найти на диске.
Ай, балда садовая, они на другом ноте. Тогда словами. Поиск минимума (максимума) яркости я пробовал. Не всегда надёжно. Могут быть фоты, где фон тоже белый.
Могут быть - совсем криво размещённые.
Я остановился на том, что сначала делю лист вертикально.
Потом на каждой половинке фоты надо сегментировать. Вот на этом месте всё и осталось ... То есть идею проверить не успел. Сранно, что никто больше не захотел.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006350
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. я тоже долго искал. Оказывается в архивариусе (где-то 10 страница)
https://www.sql.ru/forum/1282300-10/chetvergovyy-arhivarius
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006359
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причём, я не просто пробовал искать минимумы. Это была главная гипотеза для нарезки каждой половинки: проектировать пикселы в направлении найденных квазипрямых. Но из-за шумов фото нужно производить отбор из множества претендентов на главное направление. Вот сейчас я это вспомнил. Так что это "to do". У меня секретов нет))
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006368
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я умру на перформансе. Просто не дождусь результатов. Поэтому решать задачу на оригинальном разрешении
фоток не буду. Их надо уменьшить хотя-бы до 64х64 pix.
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006369
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо того, я картинку сравнения даю о последнем эксперименте по Роению.
Напомню, последние параметры были автор52*80прогонов по 10^3 итераций M=40 точек на [1; 15]
ф-ция непрерывна,
MO= 0,6089 mediana= 0,6016 СКО= 0,6087 Если бцть уверенным, что ищем минимум, и видим, что MO-СКО=0, то наверное его и надо брать за оценку минимума.

А на рисунке 3 варианта. Верхний - непрерывная ф-ция, 2 нижних - дискретная.
Для дисретных параметры такие, но вдруг я всё уже спутал, надёжнее проверить:
NN=10^2 M=10
tn=800 МО=0,2587 СКО= 0,2509
alf=0.80 bet=0.3 gam=0.3

NN=10^2 M=10
tn=800 МО=0,3589 СКО=0,4444
alf=0.95 bet=0.2 gam=0.2

Зато точно, что МО-СКО в обоих случаях ~0.
Итого во всех случаях МО-СКО~0.
Беда в том, что ф-ция модет оказаться настолко изгибистой, что распределение в тестах станет многомодальнымили хот ябы как в Пуассоне, а дисперсия огромной, и тогда МО-СКО<< Min(f()).
И неизвестно в какой точке. И придётся точку искать, а она не существует и ... за что боролись статметодами?
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006370
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006372
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Их надо уменьшить хотя-бы до 64х64 pix.
Это я тоже пробовал, помнютолько, что рез-т не понравился. Но ведь прогу прогонять один тоько раз. Ведь не бизнес же на этом?
...
Рейтинг: 0 / 0
Медитация над полной гистограммой оптимизации
    #40006715
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вотдля сравнения рез-ты некоторым отжигом.
Быстренько переделал прямо в прежней проге, по живому резал, оставив много лишнего.
Из выводов. Да, действительно простой отжиг требует много-много итераций.
Да даже и так понятно, в Роении много точек, здесь одна. Когда ещё она запрыгнет во все нужные ямы ... И надо добиться, чтобы это случилось при подходящей температуре, чтобы не выпрыгнуть тут же из нужной ямы. По крайней мере я не смог обеспечить нужную.

Ну и тот самый вывод. При сравнимых с Роением кол-ве итераций Отжиг хорош для низкочвстотных ям. Требует нудной настройки.
"Суперотжиг" не пробовал и не хочу.
Дальнейшее без комментариев.

Результаты, 10*5 прогонов, Т0 - начальная температура, NN=10^4 итераций отжига.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(NN,T0,alf)= 10000  4,66666666666667  0,95 
m= 2,10971186161041  sqr(d)= 1,48214675321754    m-s= 0,62756510839287   m+s= 3,59185861482796 
m= 2,21559595167637  sqr(d)= 1,24712293607302    m-s= 0,96847301560335   m+s= 3,46271888774939 
m= 2,56521064341068  sqr(d)= 1,43709870885513    m-s= 1,12811193455555   m+s= 4,00230935226581 
m= 2,17534555792809  sqr(d)= 1,37297467736085    m-s= 0,802370880567234   m+s= 3,54832023528894 
m= 2,59951611757278  sqr(d)= 1,14973102755754    m-s= 1,44978509001524   m+s= 3,74924714513033 

(NN,T0,alf)= 10000  4,66666666666667  0,95 
m= 2,14511236846447  sqr(d)= 1,2124933304316    m-s= 0,932619038032866   m+s= 3,35760569889607 
m= 2,42599695920944  sqr(d)= 1,09938782507275    m-s= 1,32660913413669   m+s= 3,5253847842822 
m= 2,47587710618973  sqr(d)= 1,10138949907058    m-s= 1,37448760711915   m+s= 3,57726660526031 
m= 2,60762978792191  sqr(d)= 1,12937834392838    m-s= 1,47825144399352   m+s= 3,73700813185029 
m= 2,2336869597435  sqr(d)= 0,978422759681621    m-s= 1,25526420006188   m+s= 3,21210971942512


Как бы отжиг:
Код: vbnet
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
'' Искать Min( f()) и точку Xmin, метод отжига
Option Explicit
Option Base 1
Private Type MyStat
    fm As Single
    ym As Single
End Type

 '' M точек роения, NN итераций на непрерывном [1; k],
 '' {alf, bet, gam} параметры для расчёта след точки
 '' Ksi - независимые случ.вел. (но здесь они НЕ независ.)
 '' FF(x) - аргумент x и значения ф-ции double
 '' Xm(M), Xm2(M) - M эволюционирующих точек: x(i) и x(i+1), где i - итерации.
 '' Xm0(M) - начальный значени точек (чтобы потом сравнить с окончанием) 
 '' V(M) - вектор скорости эволюционирования к следующей итерации x(i)= x(i+1) + V(i+1)
 '' eps - не исп.
Const dd = 0, NN = 10 ^ 1, M = 1, k = 15, alf = 0.9, bet = 0.2, gam = 0.2, eps = 0.000001, T0=100
''''''Const dd = 0, NN = 10 ^ 2, M = 40, k = 15, alf = 0.85, bet = 0.3, gam = 0.3, eps = 0.000001 
'' ******************************************************

  
'' Тест для статистики
Sub testOtj()
Sub testOtj()
    On Error GoTo myerr
    Dim tn As Integer, t As Integer, t1 As Integer

    Debug.Print "T0="; T0

    tn = 10: t1 = 5

    Dim tt As Integer, pp As Integer, x As Single
    For tt = 1 To t1
        x = Timer: For pp = 1 To 1023 * (x - Int(x)): DoEvents: Next pp
        
        ReDim f0(tn) As MyStat
        Dim m0 As Double, d0 As Double, tmp As Single
        m0 = 0: d0 = 0
        
        For t = 1 To tn
            tmp = otjig(f0(t))
            m0 = m0 + f0(t).fm: d0 = d0 + f0(t).fm ^ 2
        Next t
        
        m0 = m0 / tn: d0 = d0 / (tn - 1) - m0 ^ 2
        Debug.Print "m="; m0; " sqr(d)="; Sqr(d0); "   m-s="; _
                   m0 - Sqr(d0); "  m+s="; m0 + Sqr(d0)
    Next tt
    Debug.Print ""
    Exit Sub

    myerr:
        Debug.Print Err.Number; " "; Error
        Resume Next
End Sub
'' ******************************************************


Private Function otjig(ByRef f0 As MyStat) As Double
  On Error GoTo myerr
  
  ReDim Xm(M) As Double, Xm2(M) As Double, V(M) As Double, Xm0(M) As Double
  Dim minf as Double, Xmm as Double, Ksi1 as Double, Ksi2 as Double, _
        tmp as Double, t As Long, kmin As Integer, fXmm As Double
  Dim i As Integer, j As Integer, kdim As Integer, FF1 as Double, FF2 as Double
  ReDim T2(NN) As Double
  Dim p As Double

  
  Randomize
  tmp= Rnd ''(Time):  tmp= Rnd ''(Time)    на [0; 1]

    
  '' FF() - оптимизируемая непрерывная ф-ция
  '' FF() = 2 + (1 + Sin(x)) * Sin(7 * x + 3.14159265358979 / 1023)
  ''' FF= x^2*(2+abs(sin(8*x))) на [-2.0; +2.0]
  '' ******************************************************
  
  '' Случайные точки начальных min значений
  For i=1 to M: Xm(i)= 1+ Rnd *(k-1): Xm2(i)= Xm(i): Xm0(i)= Xm(i) :Next i  '' нормировать случ.знач. на оси X
  
  '' Основной цикл работы
  For t=1 to NN
  
      '' Xm() - точки предыдущей итерации, Xm2() - новые точки для текущей итерации
      '' Xmm - их общий минимум
   
      '''' новая температура TT(t)
      If t = 1 Then T2(t) = alf * T0 Else T2(t) = alf * T2(t - 1)

      FF1= FF(Xm(1)): FF2= FF(Xm2(1))
      Xm(1) = Xm2(1)
  
      kmin= 1:  minf= FF(Xm2(kmin))
      '' Новое значение с вероятностью
      If FF2 < FF1 Then
          Xmm = FF2: kmin = 1
      Else
          tmp= Rnd:  tmp= Rnd
          p= exp(-(FF2 - FF1)/T2(t))
          If tmp<=p Then Xmm = FF2 Else Xmm = FF1
      End If
  
  
      '' новые точки    
      Dim digits As String
      For i = 1 To M
          tmp = Rnd: digits = CStr(tmp): If Asc(Right(digits, 1)) Mod 2 = 1 Then tmp = -tmp
          Xm2(i) = Xm2(i) + tmp * ((k - 1) * T2(t) / T0)
          If Xm2(i) < 1 Then Xm2(i) = 1
          If Xm2(i) > k Then Xm2(i) = k
      Next i
  
  Next t
  
  '' Итоговый min и его координата
  kmin = 1: minf = FF(Xm2(kmin))
  fXmm = FF(Xm2(kmin))
      ''''''''''ret = MsgBox("min=" + Str(fXmm) + ", " + Str(Xm2(kmin)), vbOKOnly, "Закончили")
  
  f0.fm = fXmm: f0.ym = Xm2(kmin)
  otjig = fXmm
Exit Function ''Sub
'' ******************************************************

 myerr:
     Debug.Print Err.Number; " "; Error
     Resume Next
 
End Function
'' ******************************************************

Private Function  FF( x as double) as double '' на [1: k]
    FF = 2 + (1 + Sin(x)) * Sin(7 * x + 3.14159265358979 / 1023)
End Function
'' ******************************************************

Добавлю: это случай непрерывной ф-ции.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Медитация над полной гистограммой оптимизации
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]