CSP 202109-3 脉冲神经网络

哎,这个写的很痛苦,思路并不复杂,但是有一些细节总是出现莫名奇妙的问题,经常与自己的预期不符,另外利用滚动数组的优化很有意思,值得学习。这一版是卡着时间过的,并且代码并不优雅,啥时候再改进吧。

还有一点令我疑惑的是这个题,关了流同步反而更慢了,不理解。

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAX = 1e3 + 10;
int N,S,P,T;
int RN;
double dt;
double v,u,a,b,c,d;
double vMax=-INF,vMin=INF;
int cntMax=-INF,cntMin=INF;
int maxd;
int idx;
int rArg[MAX];
vector<int> edges[MAX << 1];
struct NeuralNode {
    double v,u,a,b,c,d;
    int activeTimes;
}neuralNodes[MAX];
struct edge {
    int s,t;
    double w;
    int D;
}msc[MAX];
static unsigned long nxt = 1;
int myrand(void) {
    nxt = nxt * 1103515245 + 12345;
    return((unsigned)(nxt/65536) % 32768);
}
int main() {
    //read
    idx = 0;
    cin >> N >> S >> P >> T;
    cin >> dt;
    while (idx < N) {
         cin >> RN >> v >> u >> a >> b >> c >> d;
        for (int i = idx; i < idx + RN; i++) {
            neuralNodes[i].v = v;
            neuralNodes[i].u = u;
            neuralNodes[i].a = a;
            neuralNodes[i].b = b;
            neuralNodes[i].c = c;
            neuralNodes[i].d = d;
            neuralNodes[i].activeTimes = 0;
        }
        idx += RN;
    }
    for (int i = 0; i < P; i++) {
        cin >> rArg[i];
    }
    for (int i = 0; i < S; i++) {
        cin >> msc[i].s >> msc[i].t >> msc[i].w >> msc[i].D;
        maxd = max(maxd,msc[i].D);
        edges[msc[i].s].push_back(i);
    }
    int MOD = maxd + 1;
    //开始处理
    vector<vector<double>> I(MOD,vector<double>(N));
    for (int k = 0; k < T; k++) {
        for (int i = 0; i < N; i++) {
            I[(k + maxd) % MOD][i] = 0;
        }
        for (int i = 0; i < P; i++) {
            int myRnad = myrand();
            if (rArg[i] > myRnad) {
                for (int j = 0; j < edges[i + N].size(); j++) {
                    edge mc = msc[edges[i + N][j]];
                    I[(k + mc.D) % MOD][mc.t] += mc.w;
                }
            }
        }
        for (int i = 0; i < N; i++) {
            double uk_ = neuralNodes[i].u;
            double vk_ = neuralNodes[i].v;
            double a_ = neuralNodes[i].a;
            double b_ = neuralNodes[i].b;
            neuralNodes[i].v = vk_ + dt * (0.04 * vk_ * vk_ + 5 * vk_ + 140 - uk_) + I[k % MOD][i];
            neuralNodes[i].u = uk_ + dt * a_ * (b_ * vk_ - uk_);
            if (neuralNodes[i].v >= 30) {
                neuralNodes[i].activeTimes++;
                for (int j = 0; j < edges[i].size(); j++) {
                    edge mc = msc[edges[i][j]];
                    I[(k + mc.D) % MOD][mc.t] += mc.w;
                }
                neuralNodes[i].v = neuralNodes[i].c;
                neuralNodes[i].u += neuralNodes[i].d;
            }
        }
    }
    for (int i = 0; i < N; i++) {
        vMin = min(vMin, neuralNodes[i].v);
        vMax = max(vMax, neuralNodes[i].v);
        cntMin = min(cntMin, neuralNodes[i].activeTimes);
        cntMax = max(cntMax, neuralNodes[i].activeTimes);
    }
    cout<<fixed<<setprecision(3)<<vMin<<" "<<vMax<<endl;
    cout<<cntMin<<" "<<cntMax<<endl;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值