Sebuah Izhikevich neuron adalah sederhana namun model yang cukup efektif dari neuron biologis, dirancang untuk digunakan dalam simulasi waktu-melangkah diskrit. Dalam tantangan golf ini, Anda akan menerapkan model ini.
Parameter
Model ini hanya melibatkan 7 variabel yang disusun dalam 2 persamaan diferensial, dibandingkan dengan lusinan parameter model fisiologis yang akurat.
v
danu
merupakan dua variabel keadaan neuron. Di sini,v
adalah variabel "cepat" yang mewakili potensi sel dari waktu ke waktu, danu
merupakan variabel "lambat" yang mewakili sifat membran tertentu. Thev
variabel yang paling penting satu, karena ini adalah output dari simulasi.a
,b
,c
, Dand
yang konstanta yang menggambarkan sifat-sifat neuron tetap. Berbagai jenis neuron memiliki konstanta yang berbeda, tergantung pada perilaku yang diinginkan. Khususnya,c
adalah potensi reset, yang merupakan potensi membran sel kembali setelah spiking.I
mewakili arus input ke neuron. Dalam simulasi jaringan, ini akan berubah seiring waktu, tetapi untuk tujuan kami, kami akan memperlakukannyaI
sebagai konstanta tetap.
Model
Model ini memiliki kodesemu yang sangat sederhana. Pertama, kami mengambil nilai konstan abcd
dan menggunakannya untuk menginisialisasi v
dan u
:
v = c
u = b * c
Selanjutnya, kita mengulang-ulang kode simulasi sebanyak yang diinginkan. Setiap iterasi mewakili 1 milidetik waktu.
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
Implementasi dunia nyata tertentu mencakup langkah-langkah tambahan untuk akurasi numerik, tetapi kami tidak memasukkannya di sini.
Memasukkan
Sebagai masukan, program anda / fungsi harus mengambil nilai-nilai a
, b
, c
, d
, I
, dan t
(jumlah langkah waktu untuk mensimulasikan). Setelah diatur, tidak ada parameter ini yang akan berubah selama simulasi sederhana kami. Urutan input tidak masalah: Anda dapat menentukan urutan program Anda mengambil parameter ini.
Keluaran
Output akan berupa daftar angka yang mewakili potensi membran sel (diberikan oleh variabel v
) selama simulasi. Daftar dapat dalam format apa pun yang sesuai.
Anda memiliki pilihan apakah akan memasukkan nilai 0 simulasi (konfigurasi awal sebelum waktu berlalu) dalam output Anda. Misalnya, untuk input 0.02 0.2 -50 2 10 6
(untuk a b c d I t
), output dari keduanya
-50
-40
-16.04
73.876224
-42.667044096
-25.8262335380956
29.0355029192068
atau
-40
-16.04
73.876224
-42.667044096
-25.8262335380956
29.0355029192068
bisa diterima.
Nilai Anda tidak harus persis sama dengan yang di atas, tergantung pada bagaimana bahasa Anda menangani float.
Implementasi Referensi
Berikut ini adalah implementasi TIO yang saya tulis di Perl untuk menunjukkan model. Parameternya adalah neuron "mengobrol" dari makalah yang dihubungkan di atas, dan ini berfungsi sebagai demonstrasi bagaimana model ini mampu menciptakan kembali beberapa sifat neuron yang lebih kompleks, seperti berganti-ganti antara keadaan aktivitas tinggi dan rendah. Jika Anda melihat outputnya, Anda dapat melihat di mana neuron segera melonjak beberapa kali, tetapi kemudian menunggu beberapa saat sebelum melonjak beberapa kali lagi (meskipun tegangan input sel I
konstan sepanjang waktu).
sumber
t
negatif?Jawaban:
R ,
11099 byteFungsi anonim yang mengambil 6 argumen. Tidak ada yang mewah, hanya port langsung dari implementasi referensi. Memperbarui
u
,v
dan pencetakanv
semuanya telah digabungkan menjadi satu baris, berkat fakta bahwa Rprint
pengembalian nilai yang sedang dicetak, sehingga Anda dapat menggunakannya dalam tugas. Terima kasih banyak kepada Giuseppe karena telah menghemat 11 byte!Cobalah online!
sumber
pryr::f()
danfunction()
. Namun, Anda dapat, setelah beberapa percobaan, memindahkanv
danu
deklarasi ke dalam fungsi tubuh sambil menjaga urutan argumen, untuk menyimpan selusin byte: Coba online!v
tidak selalu mengambil nilai integer, Anda memang perluv>=30
,Bersih ,
150145140138 byteCobalah online!
Menentukan fungsi
$ :: Real Real Real Real Real Int -> [Real]
, mengimplementasikan algoritma seperti yang dijelaskan dalam OP, mulai dari istilah ke-0.sumber
Python 2 , 100 byte
Cobalah online!
Disimpan 2 byte berkat pengguna71546 .
sumber
0.04*v*v
kev*v/25.
harus menyimpan 1 byte. Jika float selalu diberikanc
makav*v/25
cukup untuk -2 byte.v>29
versi awal saya. Namun, itu tidak valid karenav
belum tentu integer.JavaScript (Node.js) ,
107...103101 byteDikontribusikan oleh @apsillers
Cobalah online!
Pendekatan Asli:
105103 byte. -1 byte Terima kasih Arnauld, dan -2 byte Terima kasih @ Kamoroso94.Cobalah online!
Atau jika pemberitahuan muncul tidak apa-apa, maka
101...9997 byte (-1 byte Thanks Arnauld, -2 byte Thanks @ Kamoroso94):sumber
v>29
tidak setara denganv>=30
untuk mengapung. Anda mungkin ingin melakukanv<30?0:(v=c,u+=d)
sebaliknya, atau lebih baik lagiv<30||(v=c,u+=d)
yang menghemat satu byte.t-->0
ke sederhanat--
.for
lingkaran menjadimap
operasi pada array panjangt
:(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))
. Fungsi mengembalikan array daripada nilai logging, yang muncul untuk memenuhi spesifikasi. Tidak mengalahkanalert
solusinya.Ruby , 94 byte
Cobalah online!
Port langsung lain dari implementasi referensi, lambda menerima 6 argumen.
sumber
Haskell ,
112111 byteCobalah online!
Tidak menampilkan kotak nol. Anggap itu
c
tidak pernah>=30
karena itu tidak masuk akal.Tidak pernah berpikir saya harus menggunakanwhere
klausa dalam kode golf tetapi ada terlalu banyak variabel.EDIT: Terima kasih @Lynn untuk melepas byte! Saya lupa bahwa Anda dapat menempatkan
let
pernyataan di penjaga. Tentu membunuh keterbacaansumber
where
denganf x|let g a=b=y
sintaks aneh untuk menyimpan byte:(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))
Elemen , 81 byte
Cobalah online! , Halaman Esolangs
Penjelasan:
Bagian dari program ini membutuhkan input. Ini menyimpan konstanta
a
,b
,d
, danI
menjadi variabel. Input untukc
tidak pernah disimpan dalam variabel, tetapi tetap berada di tumpukan utama selama eksekusi. Tiga salinan dibuat: satu di atas untuk inisialisasiu
, satu di tengah untuk dijadikan sebagai inisialv
, dan satu di bawah untuk dijadikan sebagai konstantac
. Input untukt
dilemparkan segera ke tumpukan kontrol untuk dijadikan dasar loop FOR (the[...]
) yang mengelilingi sisa program.Bagian dari program ini mengambil nilai saat ini
v
dan menghitung nilai baru, dan kemudian empat salinan dari nilai baruv
dibuat.Salinan pertama
v
memiliki baris baru yang ditambahkan dan dicetak.Salinan kedua
v
digunakan untuk menguji apakah neuron telah berduri. Hasil tes ini diletakkan pada tumpukan kontrol untuk digunakan nanti.Bagian ini menghitung "delta
u
", artinya jumlah yang ditambahkanu
.Blok IF ini menambah
d
jumlah di atas jika neuron spiking. Ini menggabungkan apa yang biasanya menjadi dua tugas menjadi satu tugas.Ini menyimpan nilai pembaruan dari
u
.Blok IF ini merupakan kelanjutan dari blok IF di atas. Jika neuron melonjak, hapus nilai saat ini
v
(yang sekarang ada di atas tumpukan utama), dan ganti dengan duplikatc
(yang telah berada di bagian bawah tumpukan utama sepanjang waktu ini).Dan pada dasarnya itu semua ada untuk itu. Satu catatan kecil adalah bahwa hal ini bocor memori: dibutuhkan tambahan
"#
di sana untuk menghapus bagian atas tumpukan kontrol (kondisi IF yang dievaluasi) setelah setiap iterasi loop.Walaupun saya tidak akan menyebut Elemen bahasa golf yang paling anggun, tantangan ini memungkinkan saya untuk menampilkan fitur yang menarik: karena pembagian antara tumpukan utama dan tumpukan kontrol, saya dapat mengambil pernyataan IF dan membagi kondisi dan tubuh menjadi beberapa. bagian, terkait dengan kode tanpa syarat.
sumber
MATLAB, 111 byte
Implementasi yang cukup sederhana, mungkin dapat lebih ditingkatkan.
sumber