脉冲神经网络csp

1.解题思路

这道题只想出了暴力解法,按题意设计三种数据结构,分别是神经元node,脉冲源mai和突触tu,其中node中的edge保存了该神经元作为入节点相连的突触编号和神经元编号,mai的v保存了该脉冲源作为入节点相连的突触编号和神经元编号,时间从1到t开始遍历,对每一个时间步,首先遍历脉冲源,当其r大于myrand()时发送脉冲,从而更新相应神经元的I[t]值,其次遍历各神经元,按公式计算u和v,当v大于等于30时,更新相应神经元的I[t]值并进行发送脉冲数计数cnt,更新v和u值。然而。。。只得了66分

也尝试过优化内存和读入数据,但似乎没什么用?

还有一个一直很疑惑的点,csp官网的测试集是不是在不断加强。。。之前过的满分代码也是跑了66分。。。期待有无大佬能解决这个问题。

2.66分代码


#include<iostream>
#include<vector>
#include<utility> 
using namespace std;
const int N=1e3+1;
const int T=1e5+1;
struct node{
	double v0,v1;
	double u0,u1;
	double a,b,c,d;
	int cnt;
	double I[T];
	vector<pair<int,int>>edge;
}node[N];
struct tu{
	double w;
	int D;
}a[N];
struct mai{
	int r;
	vector<pair<int,int>>v;
}b[N];
static unsigned long nex=1;
int myrand(void)
{
	nex=nex*1103515245+12345;
	return ((unsigned)(nex/65536)%32768); 
}
int main()
{
	int n,s,p,t;
	double t1;
	scanf("%d%d%d%d",&n,&s,&p,&t);
	scanf("%lf",&t1);
	int index=0;
	while(index<n)
	{
		int rn;
		double u,v,a,b,c,d;
		scanf("%d%lf%lf%lf%lf%lf%lf",&rn,&v,&u,&a,&b,&c,&d);
		for(int i=0;i<rn;i++)
		node[index+i].a=a,node[index+i].b=b,node[index+i].c=c,node[index+i].d=d,node[index+i].v0=v,node[index+i].u0=u;
		index+=rn;
	}
	for(int i=0;i<p;i++)
	{
		scanf("%d",&b[i].r);
	}
	for(int i=0;i<s;i++)
	{
		int st,ed;
		scanf("%d%d%lf%d",&st,&ed,&a[i].w,&a[i].D);
		if(st>=n)
		{
			b[st-n].v.push_back(make_pair(i,ed)); 
		}
		else
		node[st].edge.push_back(make_pair(i,ed));
	}
	for(int i=1;i<=t;i++)
	{
		for(int j=0;j<p;j++)
		{
			if(b[j].r>myrand())
			{
				for(auto it:b[j].v)
				{
					node[it.second].I[i+a[it.first].D]+=a[it.first].w;
				}
			}
		}
		
		for(int j=0;j<n;j++)
		{
			node[j].v1=node[j].v0+t1*(0.04*node[j].v0*node[j].v0+5*node[j].v0+140-node[j].u0)+node[j].I[i];
			node[j].u1=node[j].u0+t1*node[j].a*(node[j].b*node[j].v0-node[j].u0);
			if(node[j].v1>=30)
			{
				for(auto it:node[j].edge)
				{
					node[it.second].I[i+a[it.first].D]+=a[it.first].w;
				}
				node[j].v1=node[j].c;
				node[j].u1=node[j].u1+node[j].d;
				node[j].cnt++;
			}
			node[j].u0=node[j].u1;
			node[j].v0=node[j].v1;
		}
	}
	int cntmin=node[0].cnt,cntmax=node[0].cnt;
	double vmin=node[0].v1,vmax=node[0].v1;
	for(int i=1;i<n;i++)
	{
		if(node[i].cnt<cntmin)cntmin=node[i].cnt;
		if(node[i].cnt>cntmax)cntmax=node[i].cnt;
		if(node[i].v1<vmin)vmin=node[i].v1;
		if(node[i].v1>vmax)vmax=node[i].v1;
	}
	printf("%.3lf %.3lf\n",vmin,vmax);
	printf("%d %d\n",cntmin,cntmax);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值