15].
Для вирішення цієї проблеми на базі мікроконтролера реалізується не менше одного, але не більше 3 нейродов з однаковим числом збуджуючих і гальмуючих входів. Виходи нейронів під'єднуються до відповідних входів подальшого нейрода [16,17].
Таке рішення дозволяє чітко простежувати послідовність підключення нейродов між собою.
Також використовувати в програмі підлаштовуватися вагові коефіцієнти (pi) дендритів. Це дозволить обійтися одним з'єднанням між різними нейродамі. Поняття «число зв'язків між нейронами» буде закладено в параметрі pi.
Так, якщо інформація, що надходить в нейрон, має високу значимість, то ваговий коефіцієнт Ss i в процесі налаштування мережі (розвитку мережі) буде зростати до певного максимуму. Ця схема реалізації, призводить до концепції пріоритетного взаємодії нейронів: коли найбільш важливі завдання вирішуються в першу чергу; дозволяє нейродам, реалізованим на одному мікроконтролері, не втрачати інформацію в період підключення таймера. Та й сама необхідність у таймері відпадає. Залишається тільки визначити скільки контактів мікроконтролера будуть вхідними для конкретного нейрода.
Отже приступимо до найцікавішого, пора запрограмувати на комп'ютері віртуальний шматок нервової тканини. Для цього необхідно буде чисельно вирішувати систему диференціальних рівнянь задають динаміку мембранного потенціалу нейрона. Для інтегрування буде використовуватися метод Ейлера. Програма буде писатися на мові програмування С ++, після чого результат буде отримано за допомогою скриптів написаних на Python, з використанням бібліотеки Matplolib.
Для цього необхідно створюватимуться двовимірні масиви Vms, Ums розмірності Tsim * Nneur для зберігання мембранних потенціалів і допоміжних змінних кожного нейрона, в кожен момент часу, Tsim цей час симуляції в отсчетах, а Nneur кількість нейронів кількість нейронів в кожен момент в мережі.
Зв'язки, які також відтворені в кожен момент часу, будуть зберігатися у вигляді двох масивів pre_con і post_con розмірності Ncon, де індексами є номери зв'язків, а значеннями є індекси пресинаптичних і постсинаптичних нейронів. Ncon - число связей.Так ж нам необхідно буде створити масив для представлення змінної модулирующей експоненціально затухаючий постсинаптичний струм кожного синапсу, для цього створюємо масив розмірності Ncon * Tsim: float h=.5f;// Часовий крок інтегрування в мс int Tsim=1000/.5f;// Час симуляції в дискретних отсчетахint Nexc=100;// Кількість збуджуючих (excitatory) нейроновint Ninh=25;// Кількість гальмівних (inhibitory) нейронів const int Nneur=Nexc + Ninh; const int Ncon=Nneur * Nneur * 0.1f;// Кількість сязей, 0.1 це ймовірність зв'язку між 2-ма випадковими нейронаміVms [Nneur] [Tsim];// Мембранні потенціалиUms [Nneur] [Tsim];// Допоміжні змінні моделі ІжікевічаIex [Nneur];// Зовнішній постійний струм прикладений до нейронуIsyn [Nneur];// Синаптичний струм на кожен нейронpre_conns [Ncon];// Індекси пресинаптичних нейроновpost_conns [Ncon];// Індекси постсинаптичних нейроновweights [Ncon];// Ваги связейy [Ncon] [Tsim];// Змінна модулирующая синаптичний струм в залежності від спайков на пресинапса psc_excxpire_time=4.0f;// Характерне вермя спадания постсинаптичного струму, мсminWeight=50.0f;// Ваги, розмірність пкАmaxWeight=100.0f;
//Параметри нейронаIex_max=40.0f;// Максимальний прикладений до нейрона струм 50 ПКА
float a=0.02f; b=0.5f;
float c=- 40.0f;// Значення мембранного потенціалу до якого він сбрасиваеться після спайка
float d=100.0f; k=0.5f; Vr=- 60.0f; Vt=- 45.0f;
float Vpeak=35.0f;// Максимальне значення мембранного потенціалу, при якому відбувається скидання до значення сV0= #151; 60.0f;// Початкове значення для мембранного потенціалаU0=0.0f;// Початкове значення для допоміжної переменнойCm=50.0f;// Електрична ємність нейрона, розмірність пкФ
Як вже було сказано, інформація кодується в часах виникнення імпульсів, тому створюються масиви для збереження часів їх виникнення та індексів нейронів де вони виникли. Далі їх можна буде записати у файл, з метою візуалізаціі.spike_times [Nneur * Tsim];// Часи виникнення спайковspike_neurons [Nneur * Tsim];// Індекси нейронів на яких відбуваються спайки
int spike_num=0;// Номер спайка
Далі розкидаються випадково зв'язку і задаються ваги: ??init_connections () {(int con_idx=0; con_idx lt; Ncon;) {// випадково вибираємо постсіпантіческіе і пресинаптичні нейрони
pre_conns [con_idx]=rand ()% Nneur; _conns [con_idx]=rand ()% Nneur; [con_idx]=(rand ()% ((int) (maxWeight - minWeight) * 10))/10.0f + minWeight;
if (pre_conns [con_idx] gt;=Nexc) {// якщо пресинаптичний нейрон гальмові то вага зв'язку йде зі знаком мінус
weights [con_idx]=-weights [con_idx];
}
Установка початкових умов для нейронів і випадкове завдання зовнішнього прикладеного струму. Ті нейрони для яких зовнішній струм перевищить...