একটি মডেল নিউরন অনুকরণ


16

একটি ইজিকেভিচ নিউরন একটি জৈবিক নিউরনের একটি সহজ তবে বেশ কার্যকর মডেল, এটি একটি পৃথক সময়-পদক্ষেপের সিমুলেশনে ব্যবহারের জন্য ডিজাইন করা হয়েছে। এই গল্ফিং চ্যালেঞ্জে আপনি এই মডেলটি বাস্তবায়ন করবেন।

পরামিতি

শারীরবৃত্তীয়ভাবে সঠিক মডেলের কয়েক ডজন পরামিতিগুলির তুলনায় এই মডেলটিতে 2 টি ডিফরেনশনাল সমীকরণে সংগঠিত কেবল 7 ভেরিয়েবল জড়িত।

  • 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

গ্রহণযোগ্য।

আপনার ভাষা কীভাবে ভাসমান তা নির্ভর করে আপনার মানগুলি উপরেরগুলির মতো হুবহু হতে হবে না

রেফারেন্স বাস্তবায়ন

মডেলটি প্রদর্শনের জন্য পার্লে একটি টিআইও বাস্তবায়ন এখানে লিখেছি। প্যারামিটারগুলি উপরের লিঙ্কযুক্ত কাগজটি থেকে একটি "বকবক" নিউরনের হয় এবং এটি এই মডেলটি কীভাবে নিউরনের আরও জটিল বৈশিষ্ট্যগুলি যেমন উচ্চ এবং নিম্ন ক্রিয়াকলাপের রাজ্যের মধ্যে বিকল্প পরিবর্তনের জন্য পুনরায় তৈরি করতে সক্ষম হয় তা প্রদর্শনের কাজ করে। যদি আপনি আউটপুটটি দেখেন, আপনি দেখতে পাচ্ছেন যে নিউরনটি সঙ্গে সঙ্গে কয়েকবার স্পাইক করে, তবে আরও কয়েকবার স্পাইক করার আগে কিছুক্ষণ অপেক্ষা করে (সেল ইনপুট ভোল্টেজ Iপুরো সময় স্থির থাকা সত্ত্বেও )।


হবে tকি কখনো নেতিবাচক হতে পারে?
kamoroso94

1
@ kamoroso94 না, আপনি নেতিবাচক সময় অনুকরণ করতে পারবেন না।
PhiNotPi

উত্তর:


6

আর , 110 99 বাইট

বেনামে ফাংশন যা 6 টি আর্গুমেন্ট নেয়। কিছুই অভিনব নয়, রেফারেন্স বাস্তবায়নের কেবল একটি সরল বন্দর। আপডেট হওয়া u, vএবং মুদ্রণ vসবগুলি একক লাইনে একত্রিত করা হয়েছে, আর printযে মুদ্রিত হচ্ছে তার মানটি ফেরত দেয় বলে ধন্যবাদ , যাতে আপনি এটি নির্ধারিত ক্ষেত্রে ব্যবহার করতে পারেন। 11 বাইট সংরক্ষণের জন্য জিউসেপিকে অনেক ধন্যবাদ!

pryr::f({v=c;u=b*c;for(i in 1:t){if(v>=30){v=c;u=u+d}
u=a*b*(v=print((.04*v+6)*v+140+I-u))-a*u+u}})

এটি অনলাইন চেষ্টা করুন!


2
এটি দুর্দান্ত, +1। যদিও, যেহেতু আপনি স্পষ্টভাবে আর্গুমেন্ট লেবেল করছি, কোন বাইট মধ্যে সংরক্ষণ করেন pryr::f()এবং function()। তবে, আপনি কিছু পরীক্ষা-নিরীক্ষার পরে আর্গুমেন্টের ক্রম সংরক্ষণ করে এক ডজন বাইট সংরক্ষণের জন্য ফাংশন বডিতে সরানো vএবং uএর ঘোষণাগুলি করতে পারেন: অনলাইনে চেষ্টা করে দেখুন!
জিউসেপ

যেহেতু vঅগত্যা পূর্ণসংখ্যার মানগুলি গ্রহণ করে না, আপনার প্রয়োজন v>=30, যদিও
জিউসেপ

@ জিউসেপ ধন্যবাদ, এই উন্নতিগুলি দুর্দান্ত। কিছু কারণে আমি সুস্পষ্টভাবে যুক্তিগুলি লেবেল না করার বিষয়টি বিবেচনা করি নি ...
rturnbull

4

পরিষ্কার , 150 145 140 138 বাইট

import StdEnv
$a b c d i t=map snd(iterate(\(u,v)#(w,n)=if(30.0<v)(c,u+d)(v,u)
#y=0.04*w*w+6.0*w+140.0-n+i
=(a*b*y-a*n+n,y))(b*c,c))%(0,t)

এটি অনলাইন চেষ্টা করুন!

$ :: Real Real Real Real Real Int -> [Real]0 তম শব্দটি থেকে শুরু করে ওপিতে বর্ণিত অ্যালগরিদমটি কার্যকর করে ফাংশনটি সংজ্ঞায়িত করে ।


3

পাইথন 2 , 100 বাইট

a,b,c,d,I,t=input();v=c;u=b*c
exec"if v>=30:v=c;u+=d\nv=v*v/25+6*v+140-u+I;u+=a*(b*v-u);print v\n"*t

এটি অনলাইন চেষ্টা করুন!

ব্যবহারকারী 71546 ধন্যবাদ 2 বাইট সংরক্ষণ করা


@ ওফস উফ, আপনি ঠিক বলেছেন এখনই ঠিক করা উচিত।
মিঃ এক্সকোডার

বাঁক 0.04*v*vথেকে v*v/25.1 বাইট সংরক্ষণ করা উচিত। যদি সর্বদা ভাসা দেওয়া হয় cতবে v*v/25-২ বাইটের জন্য পর্যাপ্ত পরিমাণ রয়েছে ।
শিয়েরু আসাকোটো

@ এসিলিংক্যাট আপনি যদি আমার পুনর্বিবেচনার ইতিহাসটি একবার দেখুন, আপনি খেয়াল করবেন যে v>29আমার প্রাথমিক সংস্করণটি ছিল। যাইহোক, এটি অবৈধ কারণ vএকটি পূর্ণসংখ্যার প্রয়োজন হয় না।
মিঃ এক্সকোডার

3

জাভাস্ক্রিপ্ট (নোড.জেএস) , 107 ... 103 101 বাইট

@ অ্যাপসিলাররা অবদান রেখেছেন

(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))

এটি অনলাইন চেষ্টা করুন!

আসল পদ্ধতির: 105 103 বাইট tes -1 বাইট ধন্যবাদ আর্নল্ড, এবং -২ বাইট ধন্যবাদ @ কামোরোসো ৯৪।

(a,b,c,d,I,t)=>{for(u=b*(v=c);t--;){v<30||(v=c,u+=d);v=v*(v/25+6)+140-u+I;u+=a*(b*v-u);console.log(v)}}

এটি অনলাইন চেষ্টা করুন!

বা যদি পপিংয়ের সতর্কতাগুলি ঠিক থাকে তবে 101 ... 99 97 বাইট (-1 বাইট ধন্যবাদ আরনাউল্ড, -২ বাইট ধন্যবাদ @ কামোরোসো94):

(a,b,c,d,I,t)=>{for(u=b*(v=c);t--;){v<30||(v=c,u+=d);v=v*(v/25+6)+140-u+I;u+=a*(b*v-u);alert(v)}}

var u, v;
var f = 
(a,b,c,d,I,t)=>{for(u=b*(v=c);t--;){v<30||(v=c,u+=d);v=v*(v/25+6)+140-u+I;u+=a*(b*v-u);alert(v)}}

function run() {
 f(...["a", "b", "c", "d", "I", "t"].map(x => document.getElementById(x).value * 1));
}
a = <input id="a" value="0.02"><br>
b = <input id="b" value="0.2"><br>
c = <input id="c" value="-50"><br>
d = <input id="d" value="2"><br>
I = <input id="I" value="10"><br>
t = <input id="t" value="6"><br>
<input type="button" value="Run" onclick="run()">


v>29v>=30ভাসমানদের সমতুল্য নয় । আপনি সম্ভবত v<30?0:(v=c,u+=d)পরিবর্তে করতে চান , বা আরও ভাল v<30||(v=c,u+=d)যা একটি বাইট সংরক্ষণ করে।
আরনাউল্ড

@ আর্নল্ড ওহ হ্যাঁ, আমি পাইথন উত্তরের দিকে তাকালে বুঝতে পেরেছিলাম যে আমি এটি অপ্টিমাইজ করিনি তবে আমি বুঝতে পারি না যে আমিও ভাসমান প্রক্রিয়াজাত করছি;; পি ফিক্সড।
শিয়েরু আসাকোটো

2
আপনি t-->0সহজভাবে পরিবর্তন করে দুটি বাইট সংরক্ষণ করতে পারেন t--
kamoroso94

1
আপনি refactoring দ্বারা 101 এই নিচে পেতে পারেন 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যদিও সমাধানটি বীট করে না ।
অ্যাপসিলাররা


2

হাস্কেল , 112 111 বাইট

(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))

এটি অনলাইন চেষ্টা করুন!

শূন্য কেস আউটপুট দেয় না। ধরে নেই যে cকখনই নয়>=30 যেহেতু করবে না।

কখনও ভাবিনি আমার একটি ব্যবহার করতে হবে where একটি কোড গল্ফের ধারা তবে কেবলমাত্র অনেকগুলি ভেরিয়েবল রয়েছে।

সম্পাদনা: বাইট বন্ধ করার জন্য @ লিনকে ধন্যবাদ! আমি ভুলে গিয়েছিলাম যে আপনি letপ্রহরীগুলিতে বিবৃতি দিতে পারেন । অবশ্যই পাঠযোগ্যতা বধ করে দেয়


1
বাইট সংরক্ষণের জন্য আপনি 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))
লিন

1

এলিমেন্ট , 81 বাইট

_a;_b;_3:b~*u;_d;_I;_'[3:\.04*5+*140+u~-+I~++4:\
.`30<!b~*u~-+a~*u~+[d~+]u;[#2:]]

এটি অনলাইন চেষ্টা করুন! , এসোল্যাংস পৃষ্ঠা

ব্যাখ্যা:

_a;_b;_3:b~*u;_d;_I;_'[ ... ]

প্রোগ্রামটির এই অংশটি ইনপুট নেয়। এটা তোলে সঞ্চয় করে ধ্রুবক a, b, d, এবং Iভেরিয়েবল মধ্যে। এর জন্য ইনপুটটি cকোনও চলক ক্ষেত্রে কখনই সঞ্চয় করা হয় না, বরং কার্যকরভাবে পুরো স্ট্যাকের মধ্যে থাকে। তিনটি অনুলিপি তৈরি করা হয়: আরম্ভের জন্য শীর্ষে uএকটি, মাঝখানে একটি প্রাথমিক হিসাবে পরিবেশন vকরা এবং নীচে একটি ধ্রুবক হিসাবে পরিবেশন করা c। প্রোগ্রামটির বাকি অংশটিকে ঘিরে tফোর লুপের (ভিত্তি) ভিত্তি হিসাবে পরিবেশন করার জন্য ইনপুটটি তাত্ক্ষণিকভাবে কন্ট্রোল স্ট্যাকের উপরে ফেলে দেওয়া হয় [...]

3:\.04*5+*140+u~-+I~++4:

প্রোগ্রামটির এই অংশটি vনতুন মানটির বর্তমান মানটি গণনা করে এবং নতুন মানটির চারটি অনুলিপি vতৈরি করে।

\
.`

প্রথম অনুলিপিটিতে vএকটি নতুন লাইন যুক্ত হয়েছে এবং এটি মুদ্রিত হয়েছে।

30<!

vনিউরোনটি ছড়িয়ে পড়েছে কিনা তা পরীক্ষা করতে দ্বিতীয় কপি ব্যবহার করা হয়। এই পরীক্ষার ফলাফলটি পরবর্তী ব্যবহারের জন্য নিয়ন্ত্রণ স্ট্যাকের উপরে রাখা হয়।

b~*u~-+a~*u~+

এই অংশটি "ডেল্টা u" গণনা করে , যার অর্থ যোগ করার পরিমাণ u

[d~+]

এই আইএফ ব্লকটি dযদি নিউরোনটি স্পাইক করে তবে উপরের যোগটিতে যোগ করে। এটি সাধারণভাবে দুটি অ্যাসাইনমেন্টকে একক অ্যাসাইনমেন্টের সাথে সংযুক্ত করে।

u;

এটির আপডেট হওয়া মান সংরক্ষণ করে u

[#2:]

এই আইএফ ব্লকটি উপরের আইএফ ব্লকের একটি ধারাবাহিকতা। যদি নিউরন স্পাইক করছে তবে বর্তমান মানটি v(যা এখন মূল স্ট্যাকের শীর্ষে রয়েছে) মুছুন , এবং এর সদৃশ দিয়ে প্রতিস্থাপন করুনc (যা পুরো সময়টি মূল স্ট্যাকের নীচে ছিল করুন।

এবং এটি মূলত এটি আছে। একটি ছোট্ট নোট এই জিনিসটি মেমরি ফাঁস করে: এটি অতিরিক্ত লাগে takes"# প্রতিটি লুপ পুনরাবৃত্তির পরে নিয়ন্ত্রণ স্ট্যাকের শীর্ষস্থানীয় (যদি অবস্থাটি মূল্যায়িত হয়) মুছতে এতে ।

যদিও আমি এলিমেন্টকে সর্বাধিক কৌতূহলযুক্ত গল্ফিং ভাষা বলব না, এই চ্যালেঞ্জটি আমাকে একটি আকর্ষণীয় বৈশিষ্ট্য প্রদর্শন করতে দেয়: প্রধান স্ট্যাক এবং নিয়ন্ত্রণ স্ট্যাকের মধ্যে বিভাজনের কারণে, আমি একটি আইএফ বিবৃতি নিতে পারি এবং শর্ত এবং শরীরকে একাধিক ভাগে ভাগ করতে পারি অংশগুলি, শর্তহীন কোডের সাথে ইন্টারলেসড।


0

ম্যাটল্যাব, 111 বাইট

function z(a,b,c,d,I,t)
v=c;u=b*c;for i=1:t if v>=30 v=c;u=u+d;end
v=.04*v^2+6*v+140-u+I
u=u+a*(b*v-u);
end
end

খুব সহজ বাস্তবায়ন, সম্ভবত আরও উন্নতি করা যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.