思路:
- 随机挑选一个或多个初始感染点,将它们置为I态;
- 开始一轮感染;
- 遍历每一个I态节点的S态邻居(每个节点没轮只访问一次);
- 遍历上述邻居的每个I态邻居,统计其个数(若为k个),这个节点的感染概率为1-(1-beta)^k,其中beta为感染概率;
- 统计上一轮感染结束后网络中存在的感染点,按照恢复概率将它们恢复为S态;
- 感染结束,返回2。
C语言实现
# include <stdio.h>
# include <stdlib.h>
# include <math.h>
# include <time.h>
# define SUM_OF_VERTEX 1000
# define RATE_OF_INFECTION 1
# define RATE_OF_RECOVER 1
# define STEP 30
# define FILENAME_IN "WS_1000.txt"
# define FILENAME_OUT "data_1.0.txt"
struct Node
{
int is_infected;
}vertex[SUM_OF_VERTEX + 1];
struct LNode
{
int index;
struct LNode *next;
};
void Initial_AdjacencyMatrix();
void Free_AdjacencyMatrix();
void Read_File();
void Output_To_File();
void SIS_Diffusion();
int **AdjacencyMatrix;
int sum_data_to_file[STEP + 1] = {
0};
int main()
{
srand( ( unsigned )time( NULL ) );
Initial_AdjacencyMatrix();
Read_File();
SIS_Diffusion();
Output_To_File();
Free_AdjacencyMatrix();
}
void Initial_AdjacencyMatrix()
{
if( !( AdjacencyMatrix = ( int ** )malloc( sizeof( int * ) * ( SUM_OF_VERTEX + 1 ) ) ) )