All streams
Search
Write a publication
Pull to refresh
239
0
Ермоленко Игорь @Yermack

Пользователь

Send message

На самом деле многие пакеты представляют собой обертки для решений на других языках: вышепредставленный JuMP содержит сишные и фортрановские солверы, PlotlyJS реализует https://plot.ly/javascript/, ну или реализация популярного ScikitLearn

Я набрал себе ru.wikipedia.org/wiki/Тестовые_функции_для_оптимизации с википедии, все сюда не выкладывал, чтоб не нагружать страницу, а за ссылку спасибо, будет здорово заделать чего с оврагами, пологостями и изломами
У Юлии есть много всяких графических пакетов например Makie использующий средства OpenGL — он самый интерактивный. Я использую Plots docs.juliaplots.org/latest/backends у него много окружений, матплотлиб в том числе. Интерактивны Plotly и PlotlyJS, причем последний сохраняет свои особенности при создании .html. Очень кстати понтово смотрелась моя презентация на курсовой, в которой графики можно было вращать и увеличивать мышкой
Метод роя частиц на C++
Particle Swarm Optimisation C++
#include <cstdlib>
#include <iostream>
#include <math.h>
#define randomer(a,b) (1.*rand())/(RAND_MAX+0.)*(b-a)+a

using namespace std;
/*
double fun(double *x)
{
    return x[0]*x[0] + x[1]*x[1]; //pow( pow(x,3) -125, 2 );
}
*/
double fun(double *x) // Растригина
{
    double ans = 10*2;
    for(int i=0; i<2; i++)
        ans += ( x[i]*x[i] - 10*cos(2*M_PI*x[i]) );
    
    return ans;
}

/*
double fun(double *x) // Швефеля
{
    double ans = 0;
    for(int i=0; i<2; i++)
        ans += -x[i]*sin( sqrt( fabs( x[i] ) ) );
    
    return ans;
}
 */

int main() {

    const int nparts = 50;
    const int ndims = 2, ages = 50; // количество эпох
    double lover[ndims] = {-10, -10};
    double upper[ndims] = {10, 10};
    double C1[ndims] = {1.9, 1.9};
    double C2[ndims] = {1.8, 1.8};
    double Ac[ndims] = {0.1, 0.1}; // определяет длину шага
    
    unsigned short i, j, k, minind = 0;
    double V[nparts][ndims];
    double X[nparts][ndims];
    double R1, R2, funmin = -9999, Fmin = 9999;
    double Fbest[nparts], funx[nparts];
    double xmem[nparts][ndims], xbest[ndims]; // лучшая координата
// частицы разбрасываются по исследуемой области
    for(i=0; i<nparts; i++)
        for(j=0; j<ndims; j++)
        {
            X[i][j] = randomer( lover[j], upper[j] );
            V[i][j] = 0;
            xmem[i][j] = 0;
        }

    for(i=0; i<nparts; i++)
    {
        Fbest[i] = Fmin;
        funx[i] = 0;
    }

    for(i=0; i<ndims; i++)
        xbest[i] = 0;
///////////////////////////////
    for(i=0; i<ages; i++)
    {
        for(j=0; j<nparts; j++)
        {
            funx[j] = fun( X[j] );
            if (funx[j] < Fbest[j])
            {
                Fbest[j] = funx[j];
                for(k=0; k<ndims; k++)
                    xmem[j][k] = X[j][k];
            }
        }

        funmin = funx[0];
        for(j=0; j<nparts; j++)
            if(funx[j] < funmin)
            {
                minind = j;
                funmin = funx[j];
            }

        if(funmin < Fmin)
        {
            Fmin = funmin;
            for(j=0; j<ndims; j++)
                xbest[j] = X[minind][j];
        }

        for(j=0; j<nparts; j++)
            for(k=0; k<ndims; k++)
            {
                R1 = randomer(0, 1);
                R2 = randomer(0, 1);
                V[j][k] = Ac[k]*V[j][k]+C1[k]*R1*( xmem[j][k] - X[j][k] ) +
                        C2[k]*R2*( xbest[k] - X[j][k]);
                X[j][k] += V[j][k];
            }

    cout << "xbest:" << endl;
    cout << " " << xbest[0] << " " << xbest[1] << endl;
    cout << "Fmin: " << Fmin << endl;
    cout << endl;
    }
    return 0;
}




Помню, когда был молодым и впечатлительным (полгода назад), узнав про нейросети сразу же кинулся делать свой перцептрон и тоже на С++. Я тогда заморочился с перегрузкой всех матричных операций, а потом, чтоб избавиться от этого узкого места, выполнил всё в виде функций, ну и там ввод вывод в файлы, все-дела, но так и не решил проблему с памятью: там все веса между слоями класса Матрица, а чтоб создать массив этого класса состоящий из матриц разного размера пришлось изголяться с указателями, чтобы вызывать конструктор с параметрами. Тут если интересно. Все проблемы решились переходом на Java
В приведенной реализации ничего не настраивается, как, например длина шага и варьирование в градиентном спуске. Для функции одной-трех переменных можно построить рельеф, чтоб как то всё отслеживать, а вот когда переменных много, то тут только разные начальные значения пробовать. Я начал рассматривать метод роя частиц и по мне, так неплохо пробовать искать глобальный минимум чем то вроде него, а затем уточнять с помощь симплекса. Меня как студента пока интересует оптимизация ради оптимизации, а уж когда встанет задача, где минимизация будет лишь средством, можно будет воспользоваться чем-нибудь из пакетов — там куча понтовых методов с трудновыговариваемыми названиями, до них дело тоже дойдет
julia> str = "(2 + 2) * ((2 * 2) + ((2 * 2) * (2 * 2)))" # строка с арифметикой
"(2 + 2) * ((2 * 2) + ((2 * 2) * (2 * 2)))"

julia> Meta.parse(str)
:((2 + 2) * (2 * 2 + (2 * 2) * (2 * 2)))

julia> eval(ans)
80

julia> str2 = replace(str, '*' => "+ 2 +")
"(2 + 2) + 2 + ((2 + 2 + 2) + ((2 + 2 + 2) + 2 + (2 + 2 + 2)))"

julia> str2 |> Meta.parse |> eval # цепочка функций
26
Ну да я на него давно поглядываю, в скором времени планирую попробовать
Это, кстати интересная тема. Но если подумать, сложновато будет смоделировать все процессы, происходящие в организме — а без гормонов, уровня сахара и защемленного нерва между позвонками, в общем без всех этих нюансов ваш клон будет другой личностью, иначе воспринимающей мир и приобретающую опыт отличный от вашего. Одна личность не может быть субъектом более одного жизненного опыта одновременно. Вот вы закрыли глаза, вам на голову надели шлем, вспышка, шлем снимают, и вы смотрите как выводят робота, на дисплее которого нарисовано удивление. Он имеет Вашу память и такие же взгляды, но на мир он теперь будет реагировать иначе с учетом нового тела, и с этого момента Вы с ним разошлись. Теперь существуют две личности у которых касательно определенного промежутка времени есть общие воспоминания — не более того. А если в процессе процедуры переноса сознания Вы помрёте, то это всё, конец. Теперь будет существовать и взаимодействовать с миром робот, а Вас более нет
Присмотритесь к языку Julia — его создавали как раз переосмысливая хотелки программистов
Очень здоровская подача! Рифмы корявые, ритм хромой, но это комизма лишь добавляет. Пару четверостиший выучу, чтоб начинать декламировать в неловких ситуациях. Автору могу пожелать не терять энтузиазма — побольше тренироваться слагать стихи и уметь с помощью них описать возню с железом и кодинг!
Почему-то из вставки «Исходный код» пропала julia, и перестала работать подсветка, поэтому сейчас всё поменял на ```cpp```
github.com/Matt5sean3/GtkBuilderAid.jl здесь про пакет для всякой интерактивности
pkg.julialang.org — в списке пакетов можно поискать еще подобного (Ctrl+F и ввести gui)
Audiosurf весело игрался под что-нибудь от John5, а под композиции Франка Клепаки Ownage и Haunt, получались нереальные спуски в бездну! Ну вот, теперь знаю, как провести пятничный вечер…
Очень интересная и полезная статья, спасибо за старания! Такой тщательный разбор будет очень полезен для начинающих. Я тоже недавно начал знакомиться с Юлией, но меня интересует как раз возможность решать задачи, так как я студент-физик. Крайне здорово, что кто-то начал публиковать здесь статьи в другом ключе, так что надеюсь на продолжение и дальнейшее всестороннее раскрытие аспектов этого интересного языка
Mathematica, Mathlab и Mathcad коммерческие продукты, я здесь их не рассматривал, потому что большинство студентов и остальных частных лиц могут позволить себе только пиратку, а так да, к примеру Mathcad очень удобно пользовать, но только не выходя за рамки встроенных возможностей, потому как программирование там не ахти
Вопрос — картинки спрятанные под спойлерами помогают тем, кто боится расхода трафика?
Реальность (Jupyter задумывается на минуту на две). В оправдание можно было бы сказать, что DE очень сложный и обширный пакет, а Гадфлай мастер пока бета и вместе они притормаживают. В принципе, подключил пакеты и на протяжении сессии о них не думаешь — в юпитерском ноутбуке можно насобирать кучу однотипных программ и параллельно разбираться с ними, а не подключать пакеты для каждой. Но все равно это портит впечатление: тот же Scilab запускается не дольше 30 сек и уже сходу можно и дифур решить и нарисовать всё что нужно.

Information

Rating
Does not participate
Location
Волгоград, Волгоградская обл., Россия
Works in
Registered
Activity