思路
定义存储结构 输入 正整数N,S,P,T,表示一共有N个神经元,S个突触和P个脉冲源,输 出时间刻T。 正实数Dt N个神经元,每个神经元v u a b c d,以及上一次的v和u。 结构体数组,数组下标为神经元的编号 P个脉冲源的r参数正整数。 S个突触。脉冲源的r参数正整数。两个整数s,t、一个实数w和一个正整数D ,其中s和t分别是入结点和出结点的编号;w和D分别表示脉冲强度和传播延迟。 计算所有脉冲源在1到T时刻,是否会发送脉冲,并将脉冲强度值赋值到连接的神经元lk中 计算每个时刻,每个神经元按照公式计算。如果值满足条件,发出脉冲。 遍历每个神经元,求得T时刻的最值和发送脉冲数的最值
代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
static unsigned long next = 1;
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
int N, S, P, T;
double Dt;
int rn;
struct neural {
double v_pre, u_pre;
double v, u;
double a, b, c, d;
}NN[1000];
int r[1000];
double IK[1000][10000] = {0};
struct edg {
int from, to;
double w;
int D;
}e[1000];
int main()
{
scanf("%d%d%d%d", &N, &S, &P, &T);
scanf("%lf", &Dt);
int rn;
double vv, uu, aa, bb, cc, dd;
int sum = 0;
while (sum < N) {
scanf("%d%lf%lf%lf%lf%lf%lf", &rn, &vv, &uu, &aa, &bb, &cc, &dd);
for (int i=sum; i<sum+rn; i++) {
NN[i].v_pre = NN[i].v = vv;
NN[i].u_pre = NN[i].u = uu;
NN[i].a = aa;
NN[i].b = bb;
NN[i].c = cc;
NN[i].d = dd;
}
sum += rn;
}
for (int i=0; i<P; i++) {
scanf("%d", &r[i]);
}
for (int i=0; i<S; i++) {
int ff, tt;
double ww;
int DD;
scanf("%d%d%lf%d", &ff, &tt, &ww, &DD);
e[i].from = ff;
e[i].to = tt;
e[i].w = ww;
e[i].D = DD;
}
for (int t=1; t<=T; t++) {
for (int i=0; i<P; i++) {
if (r[i] > myrand()) {
for (int j=0; j<S; j++) {
if ((e[j].from==i+N) && (t+e[j].D<=T)) {
IK[e[j].to][t+e[j].D] = e[j].w;
}
}
}
}
}
int cnt[1000] = {0};
for (int t=1; t<=T; t++) {
for (int i=0; i<N; i++) {
NN[i].v = NN[i].v_pre + Dt*(0.04*NN[i].v_pre*NN[i].v_pre + 5*NN[i].v_pre + 140.0 - NN[i].u_pre) + IK[i][t];
NN[i].u = NN[i].u_pre + Dt*NN[i].a*(NN[i].b*NN[i].v_pre - NN[i].u_pre);
if (NN[i].v >= 30) {
cnt[i]++;
NN[i].v = NN[i].c;
NN[i].u += NN[i].d;
for (int j=0; j<S; j++) {
if ((e[j].from==i) && (t+e[j].D<=T)) {
IK[e[j].to][t+e[j].D] += e[j].w;
}
}
}
NN[i].v_pre = NN[i].v;
NN[i].u_pre = NN[i].u;
}
}
double minv = NN[0].v, maxv = NN[0].v;
int mincnt = cnt[0], maxcnt = cnt[0];
for (int i=1; i<N; i++) {
if (minv > NN[i].v)
minv = NN[i].v;
if (maxv < NN[i].v)
maxv = NN[i].v;
if (mincnt > cnt[i])
mincnt = cnt[i];
if (maxcnt < cnt[i])
maxcnt = cnt[i];
}
printf("%.3lf %.3lf\n", minv, maxv);
printf("%d %d\n", mincnt, maxcnt);
return 0;
}
结果
骗分
|