
题目:脉冲神经网络
代码 一、33分版本#include
using namespace std;
static unsigned long ne = 1;
const int M = 1000;
const int BM = 100000;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
ne = ne * 1103515245 + 12345;
return((unsigned)(ne/65536) % 32768);
}
typedef struct nerve{
int cnt;
double I,v,u,a,b,c,d;
}nerve;
nerve nerves[M];
typedef struct tran{
int out;
int arrive_time[BM];
double w;
int D;
}tran;
map<int,tran> trans;
map<int,set<int> > relation;
typedef struct pulse{
int id,r;
}pulse;
map<int,pulse> pulses;
void update(nerve &ner, double t){
double v = ner.v,u = ner.u;
ner.v = v + t*(0.04*v*v+5*v+140-u) + ner.I;
ner.u = u+t*ner.a*(ner.b*v-u);
}
int cid(int in,int out){
return in*M+out;
}
void make_pulse(int in,int time){
int temp_in = in;
set<int> outs = relation[temp_in];
for(auto temp_out:outs){
//cout<<"temp_out:"<
int temp_id = cid(temp_in,temp_out);
trans[temp_id].arrive_time[time+trans[temp_id].D] = 1;
//cout<<"temp_id£»"<
}
}
int main()
{
int N,S,P,T;
cin>>N>>S>>P>>T;
double t;cin>>t;
int temp_N = N;
int i=0;
while(temp_N){
//cout<<"test0!"<
int r;
double v,u,a,b,c,d;
cin>>r>>v>>u>>a>>b>>c>>d;
temp_N-=r;
while(r--){
nerves[i] = nerve{0,0,v,u,a,b,c,d};
i++;
}
}
//cout<<"test1!"<
while(P--){
int r;cin>>r;
pulses[i] = pulse{i,r};
i++;
}
//cout<<"test2!"<
while(S--){
int in,out;
double w;
int D;
cin>>in>>out>>w>>D;
int id = cid(in,out);
trans[id] = tran{out,{},w,D};
if(relation.count(in) == 0){
relation[in] = set<int>();
relation[in].insert(out);
}else{
relation[in].insert(out);
}
}
//cout<<"test3!"<
vector<double> vs;
vector<int> cnts;
for(int i=1; i<=T; i++){
//cout<
//cout<<"number i:"<
for(auto p:pulses){
int rand = myrand();
//cout<<"r:"<
if(p.second.r>rand){
make_pulse(p.first,i);
//cout<<"pulse makeing pulse:"<
}
}
/*int a = cid(1,0);
for(auto time:trans[a].arrive_time){
cout<<"in1,out0,arrive_time:"<
认真审题!!!!!!!!!!!!!!!!
这一次漏掉了“在每个时间刻,按照编号顺序从小到大,每个脉冲源调用一次上述的伪随机函数”这句话,我以为是每个时刻只需要调用一次随机函数就可以了,实际是有多少个脉冲源就调用多少次!
做了三次模拟题,都遇到了这个问题,不认真审题漏了条件,导致少部分结果正确,其他都错误,提交就0分。以后读题,每个字都给我读清楚!
然后就是超时问题,代码超时的主要原因在于传递脉冲的过程,因为一个脉冲可能同时传给多个神经元,我用的方法是用map这样的方式来保存某脉冲或者神经元的后继节点,一旦产生脉冲就遍历后继节点,但我看很多题解都是用一个二维数组进行传递,用空间换取时间,以后改进。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)