• Знаете ли вы ещё подобные проекты?

    @d0lph1n
    Здравствуйте.

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

    А генетических алгоритмов много. Мне, к примеру, на университетских курсах повезло познакомиться только с тремя, и описанное мной ниже - это т.н. классический ГА:
    • вначале берется случайный набор чисел (популяция особей)
    • из контекста задачи выбирается функция проверки качества (фитнесс-функция, ее-то мы и оптимизируем)
    • числа "спариваются" с определенной вероятностью, часто в районе 0,7 (кроссинговером называется: можно, например, местами поменять старшие и младшие двоичные разряды),
    • появляются и мутируют "дети" с небольшой вероятностью (можно инвертировать один бит, например)
    • при помощи фитнесс-функции собранные вместе предки и потомки ранжируются (чем выше/ниже показатель фитнесс-функции, тем лучше/хуже или хуже/лучше особь)
    • по результатам ранжирования худшие особи отбрасываются

    Как видно, в основу положены базовые биологические эволюционные механизмы. Они применяются для задачи оптимизации, но не симуляции.

    Т.е. возможно, что автор ролика создал параметризуемую симуляцию на основе клеточных автоматов, и эти параметры он оптимизировал при помощи ГА. Задача не столько математическая или техническая, сколько "креативная". А это значит, что Вам, вероятно, будет интереснее разработать самому какой-нибудь комбайн на стыке ГА и клеточных алгоритмов, чем копаться в чужом, возможно, малопонятном коде.
    Ответ написан
    Комментировать
  • Сервисы для тренировок по взлому?

    @d0lph1n
    Здравствуйте. Попробуйте посмотреть Guided Hacking.
    Ответ написан
    Комментировать
  • Как правильно организовать взаимодействия объектов в игре, что бы не нужно было узнавать тип объекта(с++, ООП)?

    @d0lph1n
    Не вижу красивого решения, подходящего под Ваши ограничения. Мне кажется, можно добавить дополнительную абстракцию: BaseObject <- BasePoint <- Point, а в GameField из LevelLoader передавать не массив BaseObject'ов, а контейнер (назовем его Level, например), который содержит Ваши точки и прочие игровые объекты в отдельных структурах данных.

    С другой стороны, если у Вас GameField - это доска для игры в ГО, на которой всего-то и есть, что черные точки да белые точки, тогда вовсе нет смысла создавать BaseObject. Задача больше похожа на архитектурную, чем на техническую, и решать ее будет удобнее, если Вы подробнее опишете задумку.

    UPD. p. s. От "грязных" трюков совсем уж отказываться не стоит, особенно если приперло. В Qt, например, реализован механизм определения типа, и это не костыль, а жизненно важная фича для реализации концепции управления объектами. А в Java так и вовсе существует т. н. "рефлексия", что подразумевает не только способ определить имя класса, но и получить информацию о его методах и атрибутах. Казалось бы, какая гадость! Но ведь работает.

    UPD2: Не знаю, актуально это еще для Вас или нет, но я наткнулся вот на какой трюк в Книге "Эккель - Философия C++, часть вторая", страница 234.

    template <class t>
    class base {
        static int sn_objects;
    public:
        base() {
            sn_objects++;
        }
        ~base() {
            sn_objects--;
        }
        static int count() {
            return sn_objects;
        }
    };
    
    template<class t> int base<t>::sn_objects = 0;
    
    class daughter : public base<daughter> {};
    class son : public base<son> {};
    
    int main(int argc, char** argv) {
        daughter d1;
        daughter d2;
        daughter d3;
        son s1;
        std::cout << daughter::count() << std::endl; // --------- 3 ---------
        std::cout << son::count() << std::endl; <b>   // --------- 1 ---------
    
        return 0;
    }


    Однако в этом случае мы не сможем посчитать все объекты, унаследованные от base. Только если мы base унаследуем от какого-нибудь другого класса, где будем считать статические переменные по-старинке:

    #include <iostream>
    
    class the_very_base {
        static int sn_common_counter;
    public:
        the_very_base() {
            sn_common_counter++;
        }
        ~the_very_base() {
            sn_common_counter--;
        }
        static int count_all() {
            return sn_common_counter;
        }
    };
    int the_very_base::sn_common_counter = 0;
    
    template <class t>
    class base : public the_very_base {
        static int sn_objects;
    public:
        base() {
            sn_objects++;
        }
        ~base() {
            sn_objects--;
        }
        static int count() {
            return sn_objects;
        }
    };
    
    template<class t> int base<t>::sn_objects = 0;
    
    class daughter : public base<daughter> {};
    class son : public base<son> {};
    
    int main(int argc, char** argv) {
        daughter d1;
        daughter d2;
        daughter d3;
        son s1;
        std::cout << daughter::count() << std::endl;              // --------- 3 ---------
        std::cout << son::count() << std::endl;                       // --------- 1 ---------
        std::cout << the_very_base::count_all() << std::endl; // --------- 4 ---------
    
        return 0;
    }


    Основано, разумеется, на статических переменных, но только в самом исходном коде статическая переменная всего одна - не приходится объявлять их по 10 штук.
    Ответ написан
  • Собираюсь учить С++, но какими знаниями надо обладать?

    @d0lph1n
    Почему-то в последнее время люди одержимы языками программирования, возносят их в абсолют, делают из них манну небесную, эдакую сакральную мудрость, особенно если речь заходит о C или C++. Для того, чтобы научиться программировать, не нужно знать ничего. Поэтому дерзайте - если Вы смогли осилить физику, осилить такую ерунду, как язык программирования, Вам труда не составит. :)

    UPD. Я, кстати, рекомендую Вам прочесть следующие книги и в следующей последовательности:
    1. "Доусон Майкл - C++ через программирование игр". Там, конечно же, не рассказывается, как в одно лицо создать "Кваку", но зато полно красивых и содержательных абстракций, которые не только упростят понимание, но и помогут по-настоящему полюбить язык.
    2. А после Доусона возьмите "Солтер - C++ для профессионалов". Именно после Доусона. Очень хорошая книга в хорошем переводе.

    После этих двух прочтите (погуглите) о современных стандартах: C++11, C++14, C++17. И все - Вы "сипипишник".
    Ответ написан
    Комментировать
  • Какие книги по математике стоит прочитать?

    @d0lph1n
    Не знаю, насколько современные, насколько абстрактные математические книги и из какой области Вам нужны, так что ответ мой будет однобоким: все перечисленное в большей части относится к статистике, однако в ИИ (и во всем, что называют ИИ) используется и формальная логика, и нечеткая логика, и конечные автоматы, и формальные грамматики, причем, все это одновременно, вперемешку. Я не думаю, что перечислил хотя бы половину.

    Чтобы ВУЗовскую статистику освежить, можно Письменный - Конспект лекций по теории вероятностей. Там все излагается поверхностно, но при этом очень просто и кратко. Имея ее под рукой, удобно лезть в дебри.

    Для того, чтобы освоить непараметрическую статистику, Тарасенко - Непараметрическая статистика. По обычной статистике я ничего порекомендовать не могу.

    По теории распознавания образов можно взятьФукунага - Введение в статистическую теорию распознавания образов и Ту, Гонсалес - Принципы распознавания образов. Сами они ссылаются на книгу Нильсона Нильсон - Обучающиеся машины. Еще у него (Нильсона) есть Принципы искусственного интеллекта, и там рассказывается про продукционные системы ИИ на основе формальной логики.

    Из современных книг многие рекомендуют Рассел, Норвиг - Искусственный интеллект, современный подход. Там все собрано, из разных областей, так что талмуд получился большой, аж на 1500 страниц.

    Уверен, что мой ответ можно дополнить.
    Ответ написан
    Комментировать
  • Как запустить exe ве Qt Creator??

    @d0lph1n
    blog.harrix.org/article/1015

    Хорошая подробная и, что главное, рабочая инструкция.
    Ответ написан
    Комментировать
  • Как конвертировать временой ряд в мультиграф?

    @d0lph1n
    Похоже, имеется в виду следующее.

    Предположим, у нас имеется временной ряд, где на шкале времени отложены значения [10 20 30 40 50].

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

    Т.е. сформировать полносвязный граф, в котором из вершины 10 можно попасть в 20, 30, 40, 50 - в каждую вершину за один переход по дуге, каждая пара вершин связана дугой. Аналогично для вершин 20, 30, 40 и 50.

    Плюс, каждой дуге будет присвоено какое-либо весовое значение.
    Ответ написан
    Комментировать
  • Почему неправильно определяется угол наклона прямой?

    @d0lph1n
    Потому что в картографии используются проекции. Если Вы попытаетесь нарисовать геометрическую фигуру (дом, например) только по координатам, в районе экватора все будет отображаться как надо, но чем ближе мы смещаемся к полюсам, тем сильнее наша картинка "сплющивается" по вертикали. У вас 60-я широта, а это означает примерно 2-кратное сплющивание.

    Даю фрагмент кода, чтобы поправить с учетом пропорций:
    RAD2DEG = 180 / Math.PI;
    PI_4 = Math.PI / 4;
    
    /* The following functions take or return their results in degrees */
    
    function y2lat(y) { return (Math.atan(Math.exp(y / RAD2DEG)) / PI_4 - 1) * 90; }
    function x2lon(x) { return x; }
    
    function lat2y(lat) { return Math.log(Math.tan((lat / 90 + 1) * PI_4 )) * RAD2DEG; }
    function lon2y(lon) { return lon; }

    Источник

    Хотите пропорциональности - преобразуйте координаты при помощи lat2y и lon2x и считайте на основе того, что получилось при преобразовании.
    Ответ написан
    Комментировать
  • С чего начать изучение C++, если есть опыт программирования на других языках?

    @d0lph1n
    Предлагаю такой марафон:

    1. Доусон Майкл - Изучаем C++ через программирование игр.
    Небольшая книга, полна красивых манипуляций с CPP-классами, разобраны некоторые приемы ООП, и все снабжено настолько показательными и красивыми примерами, что остается только снять шляпу.

    2. После этого рекомендую взять Солтера: "Солтер - C++ для профессионалов".
    Книга очень полезная в качестве самоучителя при имеющемся наборе знаний, а также в качестве справочника. Довольно большая, на 900 страниц, но после Доусона некоторые главы Вы будете пролистывать по диагонали, так что много времени (даже если читать от корки до корки) это не займет.

    3. Однако книга Солтера не переиздавалась с 2006 года. Она осталась актуальной, но перестала быть полной, поэтому прочтите тонкости и фишки новых стандартов: c++11, c++14 и можете замахнуться на c++17, если останется время и будет необходимость. Специальную книгу для этого искать необязательно - просто погуглите.

    4. Для полноты картины прихватите "Гамма, Хелм... - Приемы объектно-ориентированного программирования. Паттерны проектирования". Книга концептульных идей про то, как организовывать структуру и взаимодействие классов. Знания эти применимы к любому объектно-ориентированному языку, но в ней примеры разбираются именно на C++, что очень удобно. Уж не знаю, прочтете ли Вы ее всю, сразу или нет, но держать под рукой не помешает.

    И вот Вам дополнительная ссылка на шпаргалку по паттернам, чтобы было проще ориентироваться в книге.

    5. Если Вам понадобится строить интерфейсы, возьмите книгу по библиотеке Qt "Шлее - Qt 4.8". По Qt есть еще книга товарищей Бланшет и Саммерфилд, но мне она понравилась меньше.

    Пункты 1,2,3 - рекомендуемые. Пункт 4 - рекомендуемый в долгосрочной перспективе. Пункт 5 - популярный (в т.ч. среди работодателей).

    6. Керниган, Ритчи - язык программирования C. Формально язык C++ - это надмножество языка C с полной обратной совместимостью. Книга очень короткая и очень простая. Прочтите, чтобы получить полную картину.
    Ответ написан
    1 комментарий
  • Eсть ли бесплатный аналог MS VISIO, в котором можно открывать файлы с расширением визио?

    @d0lph1n
    VSD Viewer. Сам не пробовал - хорошо проверенные слухи.
    Ответ написан
    Комментировать