1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#include<bits/stdc++.h>
using namespace std;
const int N = 2010; //1000个脉冲源+1000个神经元
const double INF = 1e8;
int n, s, p, T;
double dt; //时间间隔
int h[N], e[N], D[N], ne[N],idx; // 神经元邻接表
double W[N], v[N], u[N], a[N], b[N], c[N], d[N];//v, u, a, b, c, d是神经元相关量
int r[N], cnt[N]; //cnt存储神经元释放脉冲的次数
double I[1024][N / 2]; //表示神经网络状态,第一维度是时间,第二维度是脉冲源或神经元的标号,表示t时间下i个脉冲源(神经元)的状态
static unsigned long _next = 1; //注意这里为了防止next和头文件中的某个next冲突,前面加个下划线
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
_next = _next * 1103515245 + 12345;
return((unsigned)(_next/65536) % 32768);
}
void add(int a, int b, double c, int d){
e[idx] = b; W[idx] = c, D[idx] = d, ne[idx] = h[a], h[a] = idx++;
}
int main(){
memset(h, -1, sizeof h);
cin>>n>>s>>p>>T;
cin>>dt;
for(int i = 0; i < n;){
int rn;
cin>>rn;
double vv, uu, aa, bb, cc, dd;
cin>>vv>>uu>>aa>>bb>>cc>>dd;
for(int j = 0; j <rn; j++, i++){
v[i] = vv, u[i] = uu, a[i] = aa, b[i] = bb, c[i] = cc, d[i] = dd;
}
}
for(int i = n; i < n + p; i ++) cin>>r[i];
int mod = 0;
while(s -- ){
int a, b, d;
double c;
cin>>a>>b>>c>>d;
add(a, b, c, d); //构建神经元图
mod = max(mod, d + 1);//此处是对空间的优化
}
for(int i = 0; i < T; i ++){
int t = i % mod;
for(int j = n; j < n + p; j ++){//遍历脉冲源
if(r[j] > myrand()){
for(int k = h[j]; ~k; k = ne[k]){ //释放脉冲
int x = e[k];
I[(t + D[k]) % mod][x] += W[k];
}
}
}
for(int j = 0; j < n; j++){//遍历神经元
double vv = v[j], uu = u[j];
v[j] = vv + dt * (0.04 * vv * vv + 5 * vv + 140 - uu) + I[t][j];
u[j] = uu + dt * a[j] * (b[j] * vv - uu);
if(v[j] >= 30){
for (int k = h[j]; ~k; k = ne[k]) //释放脉冲
{
int x = e[k];
I[(t + D[k]) % mod][x] += W[k];
}
cnt[j]++;
v[j] = c[j], u[j] += d[j];
}
}
memset(I[t], 0, sizeof I[t]);
}
double minv = INF, maxv = -INF;
int minc = INF, maxc = -INF;
for (int i = 0; i < n; i ++ )
{
minv = min(minv, v[i]);
maxv = max(maxv, v[i]);
minc = min(minc, cnt[i]);
maxc = max(maxc, cnt[i]);
}
printf("%.3lf %.3lf\n", minv, maxv);
printf("%d %d\n", minc, maxc);
return 0;
}
|