CSP202109第三题——脉冲神经网络

思路

定义存储结构
输入
正整数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;

/* RAND_MAX assumed to be 32767 */
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;
 }

结果

骗分在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值