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

📄 jerne.c

📁 网络免疫算法的实现。还算有点问题。整的。不骗你的。我是认证的
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#define MAX_TIME 9 //每个阶段最长处理时间
#define NET_SIZE 10 //免疫网络规模,抗体个数。
#define NET_SIZE    5+1//抗体种类个数
#define T_VALUE   0.50 //抗体密度的阈值
//循环队列
#define QS  NET_SIZE+1
struct q{
	double queue[QS];
	int tail,head,size;
};
void init_q(void)
{
	q.tail =0;
	q.head =0;
	q.size=0;
}
void push(double elem)
{
	if((q.tail+1)%QS<q.head)
	{
		q.queue[(q.tail)%QS]=elem;
		q.tail = (q.tail++)%QS;
		q.size++;
	}else{
		printf("队列已满\n");
		exit(1);
	}
}
double pop(void)
{
	if(q.tail !=q.head)
	{
		q.size--;
		return q.queue[q.head=(q.head++%QS)];
	}else{
		printf("队列已空\n");
		exit(1);
	}
}
struct antibody{
	int para;//抗体对位
	int epit;//抗体决定簇
}*ab;
struct antibody node_ab[NET_SIZE];
double node_density[2][NET_SIZE];//抗体t和(t+1)时刻的浓度
double net[NET_SIZE][NET_SIZE];//抗体间的亲和度
int m[NET_SIZE];//抗原对抗体i的刺激
double k[NET_SIZE];//抗体i的自然消亡系数
double A[NET_SIZE];//计算浓度的中间变量
//初始化网络状态,胡乱想的。
void initializtion(void)
{
	int i=0,j=0;
	for(;i<2;i++)
	{
		m[i]=k[i]=A[i] = 0;
		for(j=0;j<NET_SIZE;j++)
			node_density[i][j]=(random()%NET_SIZE)/NET_SIZE;
	}
	for(i=0;i<NET_SIZE;i++)
		for(j=0;j<NET_SIZE;j++)
			net[i][j]=(random()%NET_SIZE)/NET_SIZE;
	for(i=0;i<NET_SIZE;i++)
	{
		srandom(i);
		node_ab[i].para=random()%NET_SIZE;
		srandom(i+10)
		node_ab[i].epit=random()%NET_SIZE;		
	}
	return;
}
return delta_t(void)
{
	return random()%MAX_TIME;
}
void recognize(int antigen)
{
	int i=0;
	for(;i<NET_SIZE;i++)
		if(node_ab[i].para == antigen)
		{
			m[i]=1;
			A[i]=(m[i]-k[i])*node_density[0][i]*delta_t() +A[i]);
			node_density[0][i]=1/( 1+exp(0.5-(A[i]));
		}
}
action(){}
void main(void)
{
	initialization();
	int antigen,i,j;
	int nr_ab=NET_SIZE;
	double t1=t2=0.0;
	printf("请输入抗原(0 - %d)\n",nr_ab-1);
	scanf("%d",&antigen);
	getchar();
	while(antigen<0&&antigen>=NET_SIZE);//没有抗原入侵. 
	while(antigen>=0&&antigen<NET_SIZE || (为满足条件))
	//有抗原入侵 或 终结条件不满足
	{
		recognize(antigen);
		for(i=0;i<NET_SIZE;i++)
		{	
			for(j=0;j<NET_SIZE;j++)
			{
				t1=net[j][i]*node_density[0][j];
				t2=net[i][j]*node_density[0][j];
			}
			A[i] += (delta_t()*(t1-t2)*node_density[0][j]);
			node_density[1][i]=1/( 1+exp(0.5-A[i]));
			if(node_density[1][i]>T_VALUE)
			{
				init_q();
				push(node_density[1][i]);
			}	
		}
		 //轮盘赌
		 void action(){}
	}
}

⌨️ 快捷键说明

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