CSP CCF: 202109-3 脉冲神经网络 (C++)

CSP CCF: 202109-3 脉冲神经网络 (C++),第1张

题目来源

计算机软件能力认证考试系统

解题思路

由于我有些看不懂这个题目,所以我是先找的他人的博客理解了一下题目。

这个博客写得很详细的(66分),有助于理解题目。 CSP 202109-3 脉冲神经网络(详解)_刘学.的博客-CSDN博客

所以我这里主要就是记录一下这道题啦,想到如何优化到100分,再更新。

代码

66分

#include 
#include 

using namespace std;

// 神经元结构
struct neuron {
    int ID, times;
    double prev, preu; //v, u;  // 由于后续这个v、u用处不大,我就没写上了
    double a, b, c, d;
};

struct pluse {
    int ID;
    long long int r;
};

struct synapse {
    int outID, inID, D;
    double w;
};

neuron neurons[1001];
pluse pluses[1001];
synapse synapses[1001];

void InputData(int N, int P, int S) {
    for (int id = 0; id < N;) {
        int RN;
        double v, u, a, b, c, d;
        cin>>RN>>v>>u>>a>>b>>c>>d;
        for (int j = 0; j < RN; ++j, ++id) {
            neurons[id].times = 0;
            neurons[id].prev = v;
            neurons[id].preu = u;
            neurons[id].ID = id;
            neurons[id].a = a;
            neurons[id].b = b;
            neurons[id].c = c;
            neurons[id].d = d;
        }
    }
    for (int i = 0; i < P; ++i) {
        long long int r;
        cin>>r;
        pluses[i].ID = N + i;
        pluses[i].r = r;
    }
    for (int i = 0; i < S; ++i) {
        cin>>synapses[i].outID>>synapses[i].inID>>synapses[i].w>>synapses[i].D;
    }
}


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



int main() {
    int N, S, P, T;
    double deltaT;
    cin>>N>>S>>P>>T;
    cin>>deltaT;

    InputData(N, P, S);

    // 记录每个时刻的 IK  !!!关键点 !!!
    double IK[1001][100101] = {0};  // int IK[1001][100101];

    for (int t = 1; t <= T; ++t) {  // 每个时刻
        for (int i = 0; i < P; ++i) {  // 每个脉冲源
            if (myrand() < pluses[i].r) {  // 当 r > myrand() 时发放脉冲信号
                for (int j = 0; j < S; ++j) {  // 每个突触
                    if (synapses[j].outID == i + N) {
                        IK[synapses[j].inID][t + synapses[j].D] += synapses[j].w;
                    }
                }
            }
        }
    }

    // 更新每个时刻的神经元
    for (int t = 1; t <= T; ++t) {  // 每个时刻
        for (int i = 0; i < N; ++i) {  // 每个神经元
            double ik = IK[i][t];
            double prev = neurons[i].prev, preu = neurons[i].preu;
            double v = prev + deltaT * (0.04 * prev * prev + 5 * prev + 140 - preu) + ik,  // !!!0.04 not 0.004!!!
                    u = preu + deltaT * neurons[i].a * (neurons[i].b * prev - preu);

            if (v >= 30) { // 神经元发放脉冲
                for (int j = 0; j < S; ++j) {  // 对于每个突触
                    if (synapses[j].outID == i) {
                        IK[synapses[j].inID][t + synapses[j].D] += synapses[j].w;  // += synapses[j].w; not synapses[synapses[j].inID].w;
                    }
                }
                v = neurons[i].c;
                u = neurons[i].d + u;
                ++neurons[i].times;
            }
            neurons[i].prev = v;
            neurons[i].preu = u;
        }
    }

    // 找出最后的答案
    double minVV = neurons[0].prev, maxVV = neurons[0].prev;
    int minTimes = neurons[0].times, maxTimes = neurons[0].times;
    for (int i = 1; i < N; ++i) {
        minVV = min(minVV, neurons[i].prev);
        maxVV = max(maxVV, neurons[i].prev);
        minTimes = min(minTimes, neurons[i].times);
        maxTimes = max(maxTimes, neurons[i].times);
    }

    cout<

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/676140.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-19
下一篇2022-04-19

发表评论

登录后才能评论

评论列表(0条)