csp2021-09-3 脉冲神经网络

神经元与脉冲源是节点,突触是边,按题意模拟即可。
突触传递脉冲有一个时间D的延迟,开一个 a d d [ 1005 ] [ 1005 ] add[1005][1005] add[1005][1005] 数组来记录不同时刻脉冲到达的强度。如果延迟最大是 D m a x D_{max} Dmax,那只要记录当前时刻往后 D m a x D_{max} Dmax 时刻内的变化就行,对 D m a x + 1 D_{max}+1 Dmax+1 取模以节约空间(类似循环队列)。
把传递脉冲封装成函数,TLE。
所有时刻对1001取模,TLE。
最后卡着时限过去了(

#include<bits/stdc++.h>
using namespace std;
#define chkmax(a,b) a=max(a,b)
#define chkmin(a,b) a=min(a,b)
static unsigned long Next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void)
{
	Next = Next * 1103515245 + 12345;
	return((unsigned)(Next/65536) % 32768);
}
struct edge {
	int to;
	double w;
	int D;
};
vector<edge> G[2005];
double v[1005],u[1005];
double a[1005],b[1005],c[1005],d[1005];
double add[1005][1005]= {0};
double delt;
int r[2005];
int cnt[1005]= {0};
int T,N,S,P,t,mod=0;
int main ()
{
	scanf("%d%d%d%d",&N,&S,&P,&T);
	scanf("%lf",&delt);
	int now=0,rn;
	double tv,tu,ta,tb,tc,td;
	while(now<N) {
		scanf("%d%lf%lf%lf%lf%lf%lf",&rn,&tv,&tu,&ta,&tb,&tc,&td);
		for(int i=0; i<rn; i++) {
			v[now]=tv,u[now]=tu,a[now]=ta,b[now]=tb,c[now]=tc;
			d[now++]=td;
		}
	}
	while(now<N+P)
		scanf("%d",&r[now++]);
	int s,to,D;
	double w;
	for(int i=0; i<S; i++) {
		scanf("%d%d%lf%d",&s,&to,&w,&D);
		G[s].push_back({to,w,D});
		chkmax(mod,D);
	}
	mod++;
	for(t=1; t<=T; t++) {
		for(int i=0; i<N; i++) {
			double I=add[i][t%mod];
			add[i][t%mod]=0;
			double up=u[i],vp=v[i];
			v[i]=vp+delt*((0.04*vp+5)*vp+140-up)+I;
			u[i]=up+delt*a[i]*(b[i]*vp-up);
			if(v[i]>=30) {
				cnt[i]++;
				for(int j=0; j<G[i].size(); j++) {
					edge e=G[i][j];
					add[e.to][(t+e.D)%mod]+=e.w;
				}
				v[i]=c[i];
				u[i]+=d[i];
			}
		}
		for(int i=N; i<N+P; i++)
			if(r[i]>myrand())
				for(int j=0; j<G[i].size(); j++) {
					edge e=G[i][j];
					add[e.to][(t+e.D)%mod]+=e.w;
				}
	}
	int mint=99999999,maxt=0;
	double minv=9999999,maxv=-9999999;
	for(int i=0; i<N; i++) {
		chkmin(minv,v[i]);
		chkmax(maxv,v[i]);
		chkmax(maxt,cnt[i]);
		chkmin(mint,cnt[i]);
	}
	printf("%.3lf %.3lf\n",minv,maxv);
	printf("%d %d\n",mint,maxt);
}
  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值