CSP 脉冲神经网络

检查了很多遍都觉得没有问题,不知道为什么提交到官网就WA了

#include <iostream>
#include <cstring>
#include <stdio.h>

using namespace std;

const int MAXN = 2e3 + 10,M = 2010;

int N,S,P,T;
double dt;
int rn;
double v1,u1,a1,b1,c1,d1;

int h[MAXN],e[MAXN],ne[MAXN],idx;
int s,t,D[MAXN];
double w[MAXN];
double w1;
int D1;

int Ik[MAXN][M]; // 每个时刻的脉冲加上每个神经元的


struct NERU{
    int id;
    double v,u,a,b,c,d;
    int times;
}ner[MAXN];

struct MAI{
    int id;
    int r;
}mai[MAXN];

static unsigned long nexts = 1;

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

void add(int a, int b,double w1,int D1)
{
    e[idx] = b, w[idx] = w1,D[idx] = D1; ne[idx] = h[a], h[a] = idx ++ ;
}

int main()
{
    cin >> N >> S >> P >> T;
    cin >> dt;

    for(int i=0;i < N;i++) // shuru shenjingy
    {
        cin >> rn >> v1 >> u1 >> a1 >> b1 >> c1 >> d1;
        while(rn--)
        {
            ner[i].id = i;
            ner[i].v = v1;
            ner[i].u = u1;
            ner[i].a = a1;
            ner[i].b = b1;
            ner[i].c = c1;
            ner[i].d = d1;
            if(rn != 0) i++;
        }
    }

    for(int i=N;i < P + N;i++)
    {
        cin >> mai[i].r;
        mai[i].id = i;
    }

    memset(h, -1, sizeof h);
    for(int i=0;i < S;i++)
    {
        cin >> s >> t >> w1 >> D1;
        add(s,t,w1,D1);
    }

    for(int t=1;t <= T;t++)
    {
        // 对于每个脉冲源 ,再从突触里面找到对应的 ,是不是忽视了神经元发出的东西
        for(int j=N;j < P + N;j++)
        {
            int aa = myrand();
            // cout << aa << endl;
            if(mai[j].r > aa) // 发送突触
            {
                for (int ii = h[mai[j].id]; ii != -1; ii = ne[ii])
                {
                    int jj = e[ii];
                    double ww = w[ii];
                    int DD = D[ii];
                    Ik[t+DD][jj] += ww;
                }
            }
        }

        for(int j=0;j < N;j++) // shenjingyuan gengxin
        {
            double vv = ner[j].v,uu = ner[j].u; // 一开始没有考虑先后顺序,发现必须要记录下这个值,但是又写惯了int,所以算不对
            ner[j].v = vv + dt*(0.04*vv*vv + 5*vv + 140 - uu) + Ik[t][j];
            ner[j].u = uu + dt*ner[j].a*(ner[j].b*vv - uu);

            if(ner[j].v >= 30.00)
            {
                ner[j].times++;
                for (int ii = h[ner[j].id]; ii != -1; ii = ne[ii])
                {
                    int jj = e[ii];
                    double ww = w[ii];  // 这里又写成了int
                    int DD = D[ii];
                    Ik[t+DD][jj] += ww;
                }
                
                ner[j].v = ner[j].c;
                ner[j].u += ner[j].d;
            }
            // cout << ner[j].v << endl;
        }
    }

    double min_v = ner[0].v,max_v = ner[0].v;
    int min_t = ner[0].times,max_t = ner[0].times;
    for(int j=0;j < N;j++)
    {
        // printf("%lf\n", ner[j].v);
        min_v = min(ner[j].v,min_v);
        max_v = max(ner[j].v,max_v);
        min_t = min(ner[j].times,min_t);
        max_t = max(ner[j].times,max_t);
    }

    // cout << min_v << " " << max_v << endl;
    printf("%.3f %.3f\n",min_v,max_v);
    printf("%.d %.d\n",min_t,max_t);
    // cout << min_t << " " << max_t ;

    return 0;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值