CCF-CSP 202109-3 脉冲神经网络 时而100分。。

原题链接:CCF-CSP 202109-3 脉冲神经网络
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const int N=1010;

static unsigned long nnext = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    nnext = nnext * 1103515245 + 12345;
    return((unsigned)(nnext/65536) % 32768);
}

struct Node
{
      double v,u,a,b,c,d;
      int num;
      int r;

}node[2010];

double Ik[N][N];//表示该神经元在K时刻接受到的所有脉冲输入的强度之和

int mod=0;

struct tuchu
{
    int t,D;
    double w;
    tuchu(int _t,double _w,int _D):t(_t),w(_w),D(_D) {}
};
vector<tuchu> g[2010];

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int N,S,P,T;
    cin>>N>>S>>P>>T;//一共有N 个神经元,S个突触和 P个脉冲源,输出时间刻 T时神经元的 v值。
    int NP=N,SP=S,PP=P;
    double dt; cin>>dt;//时间间隔。
    int cur=0;
    while(N>0)
    {
        int RN;
        double v,u,a,b,c,d;
        cin>>RN;
        cin>>v>>u>>a>>b>>c>>d;
        for(int i=cur;i<cur+RN;i++)
        {
            node[i].v=v;
            node[i].u=u;
            node[i].a=a;
            node[i].b=b;
            node[i].c=c;
            node[i].d=d;
        }
        cur+=RN;
        N-=RN;
    }
    N=NP;
    while(P--)
    {
        int r; cin>>r;
        node[cur].r=r;
        cur++;
    }
    P=PP;
    while(S--)
    {
        int s,t,D;
        double w;
        cin>>s>>t>>w>>D;
        g[s].push_back(tuchu(t,w,D));
        mod=max(mod,D+1);
    }
    S=SP;
    int f=0;
    for(int ttmp=1;ttmp<=T;ttmp++)
    {
        if(ttmp==T) f=1;
        int tt=ttmp%mod;
        for(int now=N;now<N+P;now++)
        {
            int my=myrand();
            if(node[now].r>my)
            {
                for(int i=0;i<g[now].size();i++)
                {
                    int to=g[now][i].t;
                    double w=g[now][i].w;
                    int D=g[now][i].D;
                    //cout<<tt<<" "<<now<<" "<<to<<" "<<w<<endl;
                    Ik[(tt+D)%mod][to]+=w;
                }
            }
        }
        for(int now=0;now<N;now++)
        {
            double vv=node[now].v;
            double uu=node[now].u;
            double a=node[now].a;
            double b=node[now].b;
            node[now].v=vv+dt*(0.04*vv*vv+5*vv+140-uu)+Ik[tt][now];
            node[now].u=uu+dt*a*(b*vv-uu);
            if(node[now].v>=30)
            {
                node[now].v=node[now].c;
                node[now].u+=node[now].d;
                node[now].num++;
                for(int i=0;i<g[now].size();i++)
                {
                    int to=g[now][i].t;
                    double w=g[now][i].w;
                    int D=g[now][i].D;
                    Ik[(tt+D)%mod][to]+=w;
                }
            }
            //cout<<tt<<" "<<now<<" ";
            //cout<<setiosflags(ios::fixed)<<setprecision(3)<<node[now].v<<endl;
        }
        for(int i=0;i<1010;i++) Ik[tt][i]=0;
        //memset(Ik[tt],0, sizeof Ik[tt]);
    }
    double maxv=node[0].v,minv=node[0].v;
    int maxnum=node[0].num,minnum=node[0].num;
    for(int i=1;i<N;i++)
    {
        maxv=max(node[i].v,maxv);
        minv=min(node[i].v,minv);
        maxnum=max(node[i].num,maxnum);
        minnum=min(node[i].num,minnum);
    }
    cout<<setiosflags(ios::fixed)<<setprecision(3)<<minv<<" "<<maxv<<endl;
    cout<<minnum<<" "<<maxnum<<endl;
    return 0;
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值