202109-3 CCF 脉冲神经网络 66分题解 + 解题思路 + 解题过程

news/2024/7/10 5:26:11 标签: 脉冲神经网络, CCFCSP, 大模拟, , 优化

解题思路

根据题意,脉冲源的阈值大于随机数时,会向其所有出点发送脉冲
神经元当v>=30时,会向其所有出点发送脉冲,unordered_map <int, vector > ne; //存储神经元/脉冲源的所有出点集合vector
所有脉冲会有一定的延迟,所以使用unordered_map <int, unordered_map <int, double>> I; //存储神经元i的j时刻收到的所有脉冲和
暴力做法就是遍历每一时刻,每一时刻更新神经元和脉冲源,最后统计答案

解题过程

  1. 一开始用结构体实现,并且没有考虑到一个神经元/脉冲源可能会对多个神经元发出脉冲这个问题,直接按照题意纯模拟,得了16分。。
  2. 发现了一对多的情况,在结构体中加入了一个vector存储所有的出点,爆内存了,得了33分。。
    在这里插入<a class=图片描述" />
  3. 由于每个神经元也不是每一时刻都会收到脉冲,所以稍微改了下,不采用数组存储,采用unorder_map存储,不爆内存了,TLE了。。66分。。在这里插入<a class=图片描述" />

66分暴力版本代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <unordered_map>

using namespace std;

const int N = 1010;

static unsigned long nt = 1;

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

struct node
{
    int id;
    double w;
    int D;
};

double v[N], u[N], a[N], b[N], c[N], d[N];
unordered_map <int, vector <node>> ne;
unordered_map <int, unordered_map <int, double>> I;
int sum[N];
int r[2 * N];

int main()
{
    int n, s, p, t;
    cin >> n >> s >> p >> t;
    double dt;
    cin >> dt;
    int rn;
    for (int i = 0; i < n; i += rn) //0 ~ n - 1神经元
    {
        cin >> rn;
        double vv, uu, aa, bb, cc, dd;
        cin >> vv >> uu >> aa >> bb >> cc >> dd;
        for (int j = i; j < i + rn; j ++)
        {
            v[j] = vv;
            u[j] = uu;
            a[j] = aa;
            b[j] = bb;
            c[j] = cc;
            d[j] = dd;
        }
    }

    for (int i = n; i < n + p; i ++) //n ~ n + p - 1脉冲源
    {
        cin >> r[i];
    }

    for (int i = 0; i < s; i ++) //突触
    {
        int bn, ed;
        double w;
        int D;
        cin >> bn >> ed >> w >> D;
        struct node t = {ed, w, D};
        ne[bn].push_back(t);
    }

    for (int i = 1; i <= t; i ++) //遍历每一时刻
    {
        for (int j = 0; j < n; j ++) //更新神经元
        {
            double pv = v[j], pu = u[j];
            v[j] = pv + dt * (0.04 * pv * pv + 5.0 * pv + 140.0 - pu) + I[j][i];
            u[j] = pu + dt * a[j] * (b[j] * pv - pu);
            if (v[j] >= 30.0)
            {
                v[j] = c[j];
                u[j] += d[j];
                sum[j] ++;
                for (auto x : ne[j]) //向所有出点释放脉冲
                {
                    int id = x.id;
                    double w = x.w;
                    int D = x.D;
                    I[id][i + D] += w;
                }
            }
        }
        for (int j = n; j < n + p; j ++) //脉冲源释放脉冲
        {
            int x = myrand();
            if (r[j] > x) //r大于随机值
            {
                for (auto x : ne[j]) //向所有出点释放脉冲
                {
                    int id = x.id;
                    double w = x.w;
                    int D = x.D;
                    I[id][i + D] += w;
                }
            }
        }
    }

    double r1 = v[0], r2 = v[0];
    int s1 = sum[0], s2 = sum[0];
    for (int i = 1; i < n; i ++) //得到答案
    {
        r1 = min(r1, v[i]);
        r2 = max(r2, v[i]);
        s1 = min(s1, sum[i]);
        s2 = max(s2, sum[i]);
    }
    printf("%.3lf %.3lf\n", r1, r2);
    cout << s1 << " " << s2;
    return 0;
}

http://www.niftyadmin.cn/n/140151.html

相关文章

腾讯一面面经

一面技术面 1、自我介绍 2、项目介绍 3、项目难点 4、负载均衡需要考虑哪些东西&#xff0c;怎么实现的负载均衡 5、负载均衡之后&#xff0c;测过能够承受多少压力吗 6、另一个项目介绍 7、为什么选择Reactor 8、其他还有什么事件模型 9、两个事件模型的区别 10、ai…

【7.MySQL行格式存储】

1.MySQL数据存放文件 我们每创建一个 database&#xff08;数据库&#xff09; 都会在 /var/lib/mysql/ 目录里面创建一个以 database 为名的目录,创建一个student表 [rootxiaodainiao ~]#ls /var/lib/mysql/my_test db.opt student.frm student.ibddb.opt&#xff1a;用…

【STL】Vector剖析及模拟实现

✍作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C vector的常用接口 首先贴上&#xff1a;vector的文档介绍,以备查阅使用。 vector的基本框架&#xff1a; vector的成员变量分别是空间首部分的_start指针和最后一个元素的下一个位置的_finish指针&#xff0c;以…

【java基础】ArrayList源码解析

文章目录基本介绍构造器指定初始容量默认创建通过集合创建添加add扩容机制批量添加addAll添加指定位置add添加多个元素到指定位置addAll删除删除指定元素remove删除指定索引元素remove条件删除removeIf批量删除removeAll修改修改指定位置set替换所有满足要求元素replaceAll一些…

JVM的几种GC

GC JVM在进行GC时&#xff0c;并不是对这三个区域统一回收。大部分时候&#xff0c;回收都是新生代~ 新生代GC&#xff08;minor GC&#xff09;&#xff1a; 指发生在新生代的垃圾回收动作&#xff0c;因为Java对象大多都具备朝生夕灭的特点&#xff0c;所以minor GC发生得非…

面向数据安全共享的联邦学习研究综述

开放隐私计算 摘 要&#xff1a;跨部门、跨地域、跨系统间的数据共享是充分发挥分布式数据价值的有效途径&#xff0c;但是现阶段日益严峻的数据安全威胁和严格的法律法规对数据共享造成了诸多挑战。联邦学习可以联合多个用户在不传输本地数据的情况下协同训练机器学习模型&am…

Java中的深克隆与浅克隆

浅克隆&#xff1a; 实现Cloneable接口即可实现&#xff0c;浅克隆只对象内部的基础数据类型&#xff08;包括包装类&#xff09;被克隆&#xff0c;引用数据类型&#xff08;负责对象&#xff09;会被使用引用的方式传递。 简单来说&#xff0c;就是浅克隆属性如果是复杂对象…

【运筹优化】拉格朗日松弛 次梯度算法求解整数规划问题 + Java调用Cplex实战

文章目录一、拉格朗日松弛二、次梯度算法三、案例实战一、拉格朗日松弛 当遇到一些很难求解的模型&#xff0c;但又不需要去求解它的精确解&#xff0c;只需要给出一个次优解或者解的上下界&#xff0c;这时便可以考虑采用松弛模型的方法加以求解。 对于一个整数规划问题&…