Как стать автором
Обновить
237
-0.4
Ермоленко Игорь @Yermack

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

Отправить сообщение
shell> systeminfo

Название ОС:                      Microsoft Windows 7 Максимальная
Процессор(ы):                     Число процессоров - 1.
                                  [01]: Intel64 Family 6 Model 58 Stepping 9 GenuineIntel ~2601 МГц
Полный объем физической памяти:   8 010 МБ
Доступная физическая память:      3 173 МБ

Вариант на Julia


function divisorsum(n::Int64)

    arr = zeros(Int64, n)

    for k1 = 1:Int(round(sqrt(n))), k2 = k1:n÷k1

        val = k1 != k2 ? k1 + k2 : k1
        arr[k1 * k2] += val
    end
end

using BenchmarkTools
@benchmark divisorsum(1_000_000)

BenchmarkTools.Trial: 
  memory estimate:  7.63 MiB
  allocs estimate:  2
  --------------
  minimum time:     56.909 ms (0.00% GC)
  median time:      59.520 ms (0.00% GC)
  mean time:        60.466 ms (2.21% GC)
  maximum time:     107.803 ms (45.13% GC)
  --------------
  samples:          83
  evals/sample:     1

@benchmark divisorsum(10_000_000)

BenchmarkTools.Trial: 
  memory estimate:  76.29 MiB
  allocs estimate:  2
  --------------
  minimum time:     856.228 ms (0.61% GC)
  median time:      891.972 ms (0.95% GC)
  mean time:        897.030 ms (2.68% GC)
  maximum time:     941.900 ms (5.56% GC)
  --------------
  samples:          6
  evals/sample:     1
А в вашей жизни были приключения интереснее, чем в компьютерных играх?

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

Нильсен Чанг Квантовые вычисления и информация — там 7я глава про физические реализации. Это библия квантовых вычислений — следует начинать с нее, а потом искать курс РКЦ, там про алгоритмы — по ходу поймёте, надо ли оно Вам

Сакс Оливер человек который принял жену за шляпу и другие книги автора. Агнозии, разделение полушарий и кучу всяких патологий объясняет этот великий нейропсихолог. Для полноты картины при спорах о разуме нужно базироваться не на среднестатистических людях, а как раз на личностях утративших ту или иную функцию и адаптировавшихся компенсировав потерю
Upd не обновил страницу, поэтому мысль чуть опоздала,. но книжку всё равно почитайте

Да, кстати, все вот спорят, дескать, есть сознание иль нету, а вот сложно провести границу, когда имеешь в расчете отклонения: врожденное слабоумие, слепоту-немоту-глухоту. Обладала ли мышлением девочка с рождения имеющая только тактильные ощущения? Пожалуйста, вот вам более простой, я бы даже сказал модельный случай — она по сути ведет себя как улитка, которая вытягивает усики, когда хочет покушоц. Или синдром Дауна — человек в большинстве случаев на всю жизнь в своих способностях к коммуникациям или долговременным планированиям застревает на уровне тех шимпазешек из экспериментов.
Сознание, мышление, эмоции — всё это просто слова, и мы спорим о других наборах слов, которые хотим привязать к этим понятиям, чтобы объяснить химию в жирной кашице, а потом мы начнем спорить, можно ли эти слова применять к устройству, в котором поочередно разряжаются конденсаторы (ну или в будущем меняются спины). На работу и того и другого оно не влияет. Нам не нужны определения, нам нужны функции, в которые можно слить данные, чтобы получить поведение системы через время

http://ai-news.ru/2018/06/centr_nejronauk_i_kognitivnyh_nauk_mgu.html советую посмотреть четвертую лекцию — там Зоя Александровна довольно широко охватила про эксперименты над животными с целью нахождения зачатков мышления и самосознания

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

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


Второй выдал


DomainError with -1:
Cannot raise an integer x to a negative power -1.
Make x a float by adding a zero decimal (e.g., 2.0^-1 instead of 2^-1), or write 1/x^1, float(x)^-1, or (x//1)^-1

То есть, скорей всего возведение в отрицательную степень инта вынудило бы создавать переменную флоат, которую бы возвращали, а так разработчики нас вынуждают возводить вещественное число, чтоб вычисления можно было проводить непосредственно на нем.
(вспоминаю gotcha на С/С++ когда всё занулялось из-за деления на инт)


Короче, нежданчики будут везде, и хорошо быть предупрежденным.
А что на счет Julia, то я нашел её очень удобной: можно быстро набросать абстрактные вычисления, всё проверить, а потом ускорить, а то и скачать готовый пакет. Да и сам процесс кодинга приятен, но в моем случае это скорее страстное хобби

Хотел было поправить, оказывается, такая игра тоже есть, а я вспомнил про Powder toy
image
Здраствуйте, увидел у Вас похожие штуки и решил спросить. Где почитать и найти таблицы с объяснениями всех команд, чисто чтоб подобное
.text
Filename: In[35]
pushq %rbp
movq %rsp, %rbp
Source line: 1
mulsd %xmm0, %xmm0
popq %rbp
retq
nopw (%rax,%rax)

не представлялось какой-то магией, чтоб можно было такую вещь окинуть взором и сделать вывод, де, тут сумма и цикл, можно сделать и лучше

На самом деле многие пакеты представляют собой обертки для решений на других языках: вышепредставленный 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
Ну да я на него давно поглядываю, в скором времени планирую попробовать

Информация

В рейтинге
Не участвует
Откуда
Волгоград, Волгоградская обл., Россия
Работает в
Зарегистрирован
Активность