⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ga_server.c

📁 一个不错的GA-NN的神经网络模型的示范代码。适合入门学习
💻 C
📖 第 1 页 / 共 3 页
字号:
{	if ( (listenfd[k] = socket(PF_LOCAL, SOCK_STREAM, 0)) < 0)	{		syslog(LOG_CRIT,"Error creating listen socket");		return(1);	}	bzero(&serv_un_addr,sizeof(serv_un_addr));	serv_un_addr.sun_family = PF_LOCAL;	sprintf(char_buffer,"unix%d.str",k);	unlink(char_buffer);	strcpy(serv_un_addr.sun_path,char_buffer);		if ( (bind(listenfd[k], (struct sockaddr *) &serv_un_addr, sizeof(serv_un_addr)) ) < 0)	{		syslog(LOG_CRIT,"Error Binding socket: %d %s",k,strerror(errno));		return(1);	}	if ( (listen(listenfd[k],LISTENQ)) <0 )	{		syslog(LOG_CRIT,"Error listenning %d %s",k,strerror(errno));		return(1);	}}for (k=max_local; k < poblation; k++){	if ( (listenfd[k] = socket(PF_INET, SOCK_STREAM, 0)) < 0)	{		syslog(LOG_CRIT,"Error creating listen socket");		return(1);	}	bzero(&serv_in_addr,sizeof(serv_in_addr));	serv_in_addr.sin_family = PF_INET;		if (inet_pton(AF_INET,ga_conf.ip,&serv_in_addr.sin_addr) < 1)	{		syslog(LOG_CRIT,"Error inet_pton() %d %s",k,strerror(errno));		return(1);	}	serv_in_addr.sin_port = htons((uint16_t)(local_server_port + k));	if ( (bind(listenfd[k], (struct sockaddr *) &serv_in_addr, sizeof(serv_in_addr)) ) < 0)	{		syslog(LOG_CRIT,"Error Binding socket: %d %s",k,strerror(errno));		return(1);	}	if ( (listen(listenfd[k],LISTENQ)) <0 )	{		syslog(LOG_CRIT,"Error listenning %d %s",k,strerror(errno));		return(1);	}}/*** Code for common SLAVE ELEMENTS ***//**************************************/if ( (pid = fork()) < 0){	syslog(LOG_CRIT,"Error fork client activation: %s",strerror(errno));	return(1);}else if (pid==0){	for (k=0;(k < max_local) && (k < poblation); k++)	{		/*************** Client caller ****************/			/***************Re design pending *************/			if ((pid=fork()) < 0)		{			syslog(LOG_CRIT,"Error fork client: %d %s",k,strerror(errno));			return(1);		}		else if (pid==0)		{			setsid();			if ( !(char_vector = (char **)malloc(11*sizeof(char *)) ))			{				syslog(LOG_CRIT,"Error malloc char_vector");				return(1);			}			for (l=0; l< 11; l++)			{				if ( !(char_vector[l] = (char *)malloc(BUFFSIZE*sizeof(char)) ))				{					syslog(LOG_CRIT,"Error malloc char_vector[%d]",l);					return(1);				}			}			char_vector[10]=NULL;			sprintf(char_vector[0],"ga_client");			sprintf(char_vector[1],"%d",k);			sprintf(char_vector[2],"%d",ga_conf.max_num_layer);			sprintf(char_vector[3],"%d",ga_conf.max_num_neuron);			sprintf(char_vector[4],"%d",generations);			sprintf(char_vector[5],"127.0.0.1");			sprintf(char_vector[6],"%d",local_server_port+k);			sprintf(char_vector[7],"%d",agr);			sprintf(char_vector[8],"%s",ga_conf.init_preffix);			sprintf(char_vector[9],"%s",ga_conf.result_preffix);			execvp("ga_client",char_vector);		}	}	/*** Starting remote clients ***/		memcpy(&ga_conf_temp, &ga_conf, sizeof(struct ga_server_config));		for (k=1; k< (poblation_f / max_local_f); k++)	{		syslog(LOG_INFO,"Using remote server %d",k);		if ( (connfd_remote = socket(PF_INET, SOCK_STREAM, 0)) < 0)		{			syslog(LOG_CRIT,"Error creating socket: %d %s",k,strerror(errno));			return(1);		}					bzero(&serv_in_addr_remote, sizeof(serv_in_addr_remote));		serv_in_addr_remote.sin_family = PF_INET;		serv_in_addr_remote.sin_port = htons((uint16_t)remote_server_port); 				syslog(LOG_INFO,"remote host: %s",ga_conf.hosts[k-1]);				if (inet_pton(AF_INET,ga_conf.hosts[k-1],&serv_in_addr_remote.sin_addr) < 1)		{			syslog(LOG_CRIT,"Error inet_pton() %d %s",k,strerror(errno));			return(1);		}		if( (connect(connfd_remote, (struct sockaddr *) &serv_in_addr_remote, 								sizeof(serv_in_addr_remote))) <0)		{			syslog(LOG_CRIT,"Couldn't connect to remote server: %d %s",k,strerror(errno));			return(1);		}		sprintf(ga_conf_temp.message,"SPAWN");			ga_conf_temp.first_local = k*max_local;		ga_conf_temp.last_local = ((k+1)*max_local > poblation) ? 															(poblation - 1) : ((k+1)*max_local - 1);				write_ga_server_remote_config(&ga_conf_temp, connfd_remote);		close(connfd_remote);	}	/*** Start remote niches ***/		for (k=0; (k< num_niche) && (ga_conf.master > 0) ; k++)	{		syslog(LOG_INFO,"Init remote niche %d",k);		if ( (connfd_remote = socket(PF_INET, SOCK_STREAM, 0)) < 0)		{			syslog(LOG_CRIT,"Error creating socket: %d %s",k,strerror(errno));			return(1);		}					bzero(&serv_in_addr_remote, sizeof(serv_in_addr_remote));		serv_in_addr_remote.sin_family = PF_INET;		serv_in_addr_remote.sin_port = htons((uint16_t)remote_server_port); 				syslog(LOG_INFO,"remote niche: %s",ga_conf.niches[k]);				if (inet_pton(AF_INET,ga_conf.niches[k],&serv_in_addr_remote.sin_addr) < 1)		{			syslog(LOG_CRIT,"Error inet_pton() %d %s",k,strerror(errno));			return(1);		}		if( (connect(connfd_remote, (struct sockaddr *) &serv_in_addr_remote, 								sizeof(serv_in_addr_remote))) <0)		{			syslog(LOG_CRIT,"Couldn't connect to remote server: %d %s",k,strerror(errno));			return(1);		}		sprintf(ga_conf_temp.message,"NICHE");				write_ga_server_remote_config(&ga_conf_temp, connfd_remote);		close(connfd_remote);	}	exit(0);}/************* Code for MASTER SERVER BEGINS HERE **************//*** Local niche fifo ***/if (ga_conf.num_niche > 0){	if( (connfd_niche=open("niche_fifo",O_WRONLY, 0)) <0)	{		syslog(LOG_CRIT,"Error openning niche_fifo for writting: %s",strerror(errno));		return(1);	}}/*** Accepting clients connections ***/syslog(LOG_INFO,"Start waiting for client connections");l=0;while(1){	if (l==poblation)	{			break;	}		errno = 0;	for (k=0; (k< max_local) && (k< poblation); k++)	{		if (!( *(connected+k) ) )		{			clilen = sizeof(cli_un_addr);			if ( (connfd[k] = accept(listenfd[k], (struct sockaddr *) &cli_un_addr, &clilen)) <0 )			{				if (errno == EINTR)				{					continue;				}				else				{					syslog(LOG_CRIT,"Accept error (PF_LOCAL): %s",strerror(errno));					return(1);				}			}			else			{				*(connected+k)=1;				l++;				syslog(LOG_INFO,"Connected client: %d",k);			}		}	}	for (k=max_local; k<poblation; k++)	{		if (!( *(connected+k) ) )		{			clilen = sizeof(cli_in_addr);			if ( (connfd[k] = accept(listenfd[k], (struct sockaddr *) &cli_in_addr, &clilen)) <0 )			{				if (errno == EINTR)				{					continue;				}				else				{					syslog(LOG_CRIT,"Accept error: %s",strerror(errno));					return (1);				}			}			else			{				*(connected+k)=1;				l++;				syslog(LOG_INFO,"Connected client: %d",k);			}		}	}}if ( !(fitness = (float *)calloc(poblation,sizeof(float)) )){	syslog(LOG_CRIT,"Error calloc fitness: %s",strerror(errno));	return(1);}if ( !(error = (double *)calloc(poblation,sizeof(double)) )){	syslog(LOG_CRIT,"Error calloc error: %s",strerror(errno));	return(1);}if ( !(num_neuron = (int *)calloc(poblation,sizeof(float)) )){	syslog(LOG_CRIT,"Error calloc num_neuron: %s",strerror(errno));	return(1);}if ( !(new_num_neuron = (int *)calloc(poblation,sizeof(float)) )){	syslog(LOG_CRIT,"Error calloc new_num_neuron: %s",strerror(errno));	return(1);}if ( !(net_array = (struct individual **)calloc(poblation,sizeof(struct individual *)) )){	syslog(LOG_CRIT,"Error calloc net_array: %s",strerror(errno));	return(1);}if ( !(vertice = (float **)calloc(2,2*sizeof(float *)) )){	syslog(LOG_CRIT,"Error calloc vertice: %s",strerror(errno));	return(1);}for (k=0; k<2; k++){	if ( !(*(vertice+k) = (float *)calloc(2,sizeof(float)) ))	{		syslog(LOG_CRIT,"Error calloc vertice[%d]: %s",k,strerror(errno));		return(1);	}}if ( !(inner_elem1 = malloc(sizeof(int))) || !(inner_elem2 = malloc(sizeof(int))) ){	syslog(LOG_CRIT,"Error malloc inner_elem1 / 2");	return(1);}if ( !(parents = (int **)calloc(poblation,2*sizeof(int *)) )){	syslog(LOG_CRIT,"Error calloc parents: %s",strerror(errno));	return(1);}for(k=0; k< poblation; k++){	if( !(*(parents+k) = (int *)calloc(2, sizeof(int)) ))	{		syslog(LOG_CRIT,"Error calloc parents[%d]: %s",k,strerror(errno));		return(1);	}	if ( !(net_array[k] = (struct individual *)calloc(1,sizeof(struct individual)) ))	{		syslog(LOG_CRIT,"Error calloc net_array[%d] in MASTER: %s",k,strerror(errno));		return(1);	}}/****************** LOOP FOR GENERATIONS ****************//********************************************************/for (gen=0; gen< generations; gen ++){max_fd=0;FD_ZERO(&read_set);for (k=0; k<poblation; k++){	FD_SET(connfd[k], &read_set);	max_fd = (connfd[k] > max_fd) ? connfd[k] : max_fd;	connected[k]=1;}FD_ZERO(&write_set);FD_ZERO(&ex_set);max_fd += 1; //number of descriptors;syslog(LOG_INFO,"max_fd: %d",max_fd); //needed for bugl=0;counter=0;while(1){	if ( l < poblation )	{		FD_ZERO(&read_set);		for (k=0; k<poblation; k++)		{			if (*(connected+k))			{				FD_SET(connfd[k], &read_set);			}		}		if ( (ready_fd=pselect(max_fd, &read_set, &write_set, &ex_set, NULL, NULL)) <0 )		{			syslog(LOG_CRIT,"Error in pselect: %s",strerror(errno));			return(1);		}		for (k=0; k<poblation; k++)		{			if (FD_ISSET(connfd[k], &read_set) )			{				if( (readn(connfd[k],char_buffer,BUFFSIZE)) < 0)				{					syslog(LOG_CRIT,"Error closed connection %d",k);					return(1);				}				else				{					if ( !(strncmp("Error",char_buffer,5) ) )					{						error[k] = atof(char_buffer+6);					}					else if ( !(strncmp("neuron_array",char_buffer,12) ) )					{						if( readn(connfd[k],char_buffer,BUFFSIZE) < 0)						{							syslog(LOG_CRIT,"Error closed connection %d",k);							return(1);						}						num_neuron[k] = atoi(char_buffer+11);						syslog(LOG_INFO,"client=%d num_neuron=%d",k,num_neuron[k]);  //required for bug						counter += num_neuron[k];						if ( !(net_array[k]->neuron_array = (struct neuron **)calloc(																		num_neuron[k],sizeof(struct neuron *)) ))						{							syslog(LOG_CRIT,"Error calloc net_array[%d]->neuron_array: %s",k,											strerror(errno));							return(1);						}						for (m=0; m< num_neuron[k]; m++)						{							if ( !(net_array[k]->neuron_array[m] = (struct neuron *)calloc(														1,sizeof(struct neuron)) ))							{								syslog(LOG_CRIT,"Error calloc net_array[%d]->neuron_array[%d]: %s",k,l,														strerror(errno));								return(1);							}						}						read_neuron_array(num_neuron[k], net_array[k]->neuron_array, connfd[k]);					}										else if (!strncmp("All work done",char_buffer,13) )					{						l+=1;						connected[k]=0;					}				}			}		}	}	else	{		syslog(LOG_INFO,"All work done with clients");		break;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -