Izhikevich нейрон является простым , но довольно эффективной моделью биологического нейрона, предназначенным для использования в дискретное время пошагового моделирования. В этой игре в гольф вы будете реализовывать эту модель.
параметры
Эта модель включает в себя только 7 переменных, организованных в 2 дифференциальных уравнения, по сравнению с десятками параметров физиологически точной модели.
v
иu
две переменные состояния нейрона. Здесьv
- «быстрая» переменная, представляющая потенциал клетки со временем, иu
«медленная» переменная, представляющая определенные свойства мембраны.v
Переменная является наиболее важным, так как это выход моделирования.a
,b
,c
, Иd
являются фиксированными константами , которые описывают свойства нейрона. Различные типы нейронов имеют разные константы, в зависимости от желаемого поведения. Примечательно, чтоc
это потенциал сброса, то есть мембранный потенциал, к которому клетка возвращается после пика.I
представляет входной ток для нейрона. В сетевых симуляторах это будет меняться со временем, но для наших целей мы будем рассматривать егоI
как фиксированную постоянную.
Модель
Эта модель имеет очень простой псевдокод. Сначала мы берем постоянные значения abcd
и используем их для инициализации v
и u
:
v = c
u = b * c
Далее, мы перебираем код симуляции столько раз, сколько пожелаем. Каждая итерация представляет 1 миллисекунду времени.
for 1..t:
if v >= 30: # reset after a spike
v = c
u = u + d
v += 0.04*v^2 + 5*v + 140 - u + I
u += a * (b*v - u)
print v
Некоторые реальные реализации включают в себя дополнительные шаги для точности чисел, но мы не включаем их здесь.
вход
Как вход, ваша программа / функция должна принимать значения a
, b
, c
, d
, I
, и t
(число шагов по времени для имитации). После установки ни один из этих параметров не будет изменяться во время нашего простого моделирования. Порядок ввода не имеет значения: вы можете указать порядок, в котором ваша программа принимает эти параметры.
Выход
Выходными данными будет список чисел, представляющих потенциал мембраны клетки (заданный переменной v
) в течение моделирования. Список может быть в любом подходящем формате.
У вас есть выбор: включить ли 0-е значение симуляции (начальная конфигурация до истечения какого-либо времени) в ваши выходные данные. Например, для ввода 0.02 0.2 -50 2 10 6
(для a b c d I t
), вывода либо
-50
-40
-16.04
73.876224
-42.667044096
-25.8262335380956
29.0355029192068
или
-40
-16.04
73.876224
-42.667044096
-25.8262335380956
29.0355029192068
приемлемо
Ваши значения не обязательно должны быть такими же, как указано выше, в зависимости от того, как ваш язык обрабатывает плавающие выражения.
Реализация эталона
Вот реализация TIO, которую я написал на Perl для демонстрации модели. Параметры - это «болтающий» нейрон из статьи, связанной выше, и это служит демонстрацией того, как эта модель способна воссоздать некоторые из более сложных свойств нейронов, таких как чередование состояний высокой и низкой активности. Если вы посмотрите на выходной сигнал, то увидите, что нейрон сразу несколько раз скачет, но затем подождет некоторое время, прежде чем вспыхнет еще несколько раз (несмотря на то, что входное напряжение ячейки I
остается постоянным все время).
источник
t
когда-нибудь отрицательным?Ответы:
R ,
11099 байтовАнонимная функция, которая принимает 6 аргументов. Ничего особенного, просто прямой порт эталонной реализации. Обновление
u
,v
и печатьv
все были объединены в одну линию, благодаря тому , что АиРprint
возвращает значение , которое печатается, так что вы можете использовать его в задании. Большое спасибо Джузеппе за сохранение 11 байт!Попробуйте онлайн!
источник
pryr::f()
иfunction()
. Однако после некоторого эксперимента вы можете переместить объявленияv
иu
объявления в тело функции, сохранив порядок аргументов, чтобы сохранить дюжину байтов: попробуйте это онлайн!v
не обязательно принимать целочисленные значения, вам не нужноv>=30
, хотяЧистый ,
150145140138 байтПопробуйте онлайн!
Определяет функцию
$ :: Real Real Real Real Real Int -> [Real]
, реализующую алгоритм, как описано в ОП, начиная с 0-го члена.источник
Python 2 , 100 байт
Попробуйте онлайн!
Сохранено 2 байта благодаря user71546 .
источник
0.04*v*v
кv*v/25.
должно сохранить 1 байт. Если float всегда указывается для,c
тоv*v/25
достаточно для -2 байтов.v>29
в моей первоначальной версии. Однако это неверно, потому чтоv
это не обязательно целое число.JavaScript (Node.js) ,
107...103101 байтПредоставлено @apsillers
Попробуйте онлайн!
Исходный подход:
105103 байта. -1 байт, спасибо Арно, и -2 байт, спасибо @ Kamoroso94.Попробуйте онлайн!
Или, если всплывающие оповещения в порядке, то
101...9997 байт (-1 байт, спасибо, Арно, -2 байт, спасибо @ Kamoroso94):источник
v>29
не эквивалентноv>=30
для поплавков. Вы, вероятно, хотите сделатьv<30?0:(v=c,u+=d)
вместо этого, или еще лучше,v<30||(v=c,u+=d)
который сохраняет байт.t-->0
просто изменивt--
.for
цикла вmap
операции на массиве длиныt
:(a,b,c,d,I,t)=>[...Array(t)].map(_=>(v<30||(v=c,u+=d),v=v*(v/25+6)+140-u+I,u+=a*(b*v-u),v),u=b*(v=c))
. Функция возвращает массив вместо регистрации значений, которые, как представляется, удовлетворяют спецификации. Не бьетalert
решение, хотя.Рубин , 94 байта
Попробуйте онлайн!
Еще один простой порт эталонной реализации - лямбда, принимающая 6 аргументов.
источник
Haskell ,
112111 байтовПопробуйте онлайн!
Не выводит нулевой регистр. Предполагается, что
c
это никогда,>=30
так как это не имеет смысла.Никогда не думал, что мне придется использоватьwhere
предложение в коде гольф, но слишком много переменных.РЕДАКТИРОВАТЬ: Спасибо @ Линн за снятие байта! Я забыл, что вы можете поместить
let
заявления в охранников. Конечно, убивает читабельность, хотяисточник
where
странныйf x|let g a=b=y
синтаксис для сохранения байта:(a#b)c d i t|let r(v,u)|v>=30=r(c,u+d)|p<-0.04*v^2+6*v+140-u+i=(p,u+a*(b*p-u))=fst<$>take t(iterate r$r(c,b*c))
Элемент , 81 байт
Попробуйте онлайн! , Страница Esolangs
Объяснение:
Эта часть программы принимает входные данные. Он хранит константы
a
,b
,d
иI
в переменные. Входные данныеc
никогда не сохраняются в переменной, а остаются в основном стеке на протяжении всего выполнения. Сделано три копии: одна сверху для инициализацииu
, одна посередине, чтобы служить инициаломv
, и одна снизу, чтобы служить константойc
. Ввод для fort
сразу бросается в стек управления, чтобы служить основой для цикла FOR ([...]
), окружающего остальную часть программы.Эта часть программы принимает текущее значение
v
и вычисляет новое значение, после чегоv
создаются четыре копии нового значения.Первый экземпляр
v
дополнен новой строкой и напечатан.Вторая копия
v
используется, чтобы проверить, не заскочил ли нейрон. Результат этого теста помещается в стек управления для последующего использования.Эта часть вычисляет «дельту
u
», то есть сумму, которую нужно добавитьu
.Этот блок IF добавляет
d
к вышеупомянутой сумме, если нейрон пикирует. Это объединяет то, что обычно было бы двумя назначениями в одно назначение.Это хранит обновленное значение
u
.Этот блок IF является продолжением вышеуказанного блока IF. Если нейрон заостряется, удалите текущее значение
v
(которое теперь находится на вершине основного стека) и замените его дубликатомc
(который был на дне основного стека все это время).И это в основном все, что нужно сделать. Одно незначительное замечание в том, что эта вещь утечка памяти: она требует дополнительного
"#
для удаления вершины стека управления (оцененного условия IF) после каждой итерации цикла .Хотя я бы не назвал Element самым изящным языком игры в гольф, эта задача позволяет мне продемонстрировать интересную особенность: из-за разделения основного стека и стека управления я могу взять оператор IF и разделить условие и тело на несколько части, чередующиеся с безусловным кодом.
источник
MATLAB, 111 байт
Довольно простая реализация, вероятно, может быть улучшена.
источник