sir模型初始值 傳播模型(SIR)

2021-10-18 17:20:23 字數 3647 閱讀 6224

#include#include#include#include#include#include

#define maxvertexnum 90000

#define rand_max 0x7fff

//邊表節點

typedef structnode

edgenode;//頂點表節點

typedef structvnode

vertexnode;

typedef vertexnode adjlist[maxvertexnum];//圖的結構

typedef structalgraph;//返回檔案行數(網路邊數),有換行符"\n"就為一行

int lines(char*str)

returnlines;

}//返回檔案最大數(網路節點數)

int max(char*str)

file*fp;char*p;int line=lines(str);int i=0;int a=0;int b=0;

fp=fopen(str,"r");char buf[256];if((fp=fopen(str,"r"))==null)

perror("fail to read");

exit(1);

}//把檔案的內容給buf

while(fgets(buf,line,fp)!=null)

returni;

}//建立圖

void createalgraph(algraph* g,char*str)

file*fp;int line=lines(str);int node=max(str);//其中最大數

g->vexnum=node+1;//因為是從0開始,所以+1,多了乙個0

g->arcnum=line;

fp=fopen(str,"r");char buf[1024];intlen;intm;intn;

edgenode*s;char*p;int a=0;int b=0;int i=0;char strline[1024];//每個節點的頂點表(vn1(i),vn2(i))

int vn1[line];//這裡本來要用vn[line],如果是vc++就不能通過編譯,有多少行就有多少(i,j)

intvn2[line];//頂點錄入

for(int j=0;jvexnum;j++)

g->adjlist[j].vertex=j;

g->adjlist[j].firstedge=null;

g->adjlist[j].nodestate=1;

}if((fp=fopen(str,"r"))==null)

perror("faile to read");

exit(1);

}while(!feof(fp))//因為行數等於邊數,則讀取行數個就可以把其他的節點的連線讀完

fgets(strline,1024,fp);

sscanf(strline,"%d%d",&a,&b);

vn1[i]=a;

vn2[i]=b;

i++;

}//邊節點放入鍊錶//一行就是乙個座標,有多少行就有多少座標

for(int k=0;k

m=vn1[k],n=vn2[k];int ii=0;

edgenode*p;

p=g->adjlist[m].firstedge;while(p!=null)

if(ii!=1)

s=(edgenode*)malloc(sizeof(edgenode));

s->adjvex=n;//相連線的頂點

s->next=null;

s->next=g->adjlist[m].firstedge;//類似於自己寫的鍊錶

g->adjlist[m].firstedge=s;//無向圖 有來回

s=(edgenode*)malloc(sizeof(edgenode));

s->adjvex=m;

s->next=null;

s->next=g->adjlist[n].firstedge;

g->adjlist[n].firstedge=s;

}//深度為每個節點後面連線的鏈長度

edgenode*q;for( i=0;ivexnum;i++)

//列印鄰接表

void printgraph(algraph*g)

edgenode*s;for(int i=0;ivexnum;i++)

s=g->adjlist[i].firstedge;//s為乙個帶adjvex,next指標的邊表節點

while(s)

printf("(%d,%d)",g->adjlist[i].vertex,s->adjvex);

s=s->next;

printf("\n");

}//所屬層插入

void insertlayer(algraph* g,intlayer)

//打印度中心性

void printdegreecentrality(algraph*g)

//計算特徵向量中心性

void eigenvector_centrality(algraph *g)

if(e1[i]>max)

max=e1[i];//記錄本次的最大指標

}for(int i=0; ivexnum; i++)

if((1.0/max1-1.0/max)<0.01&&(1.0/max1-1.0/max)>-0.01)

flag=1;//當差值較小時也可結束迴圈//保留這次的結果到e中,並且將ei重置為0,方便下次計算

for(int i=0; ivexnum; i++)

e[i]=e1[i];

e1[i]=0;

}for(int i=0; ivexnum; i++)

e[i]=e[i]/max;

g->adjlist[i].ec=e[i];

}/*1.sir傳播模型,改變node.state(0為感染,1為易感染,2為恢復。所有節點初始化為1)

2.sir函式主要操作感染點,感染點會做兩件事:①感染易感節點;②感染節點恢復

3.傳播完成的標誌為不能再感染新的節點,並返回處於恢復節點的個數*/

int sir(algraph* g,int a,int arraylength,double inf,doublerec)//傳入的分別為網路,感染節點陣列,陣列長度,感染率,恢復率

for(i=0;i

newinf[i]=0;

}double infection=inf;//感染概率

int count=inftatal;//當前網路中的感染個數

srand((unsigned)time(null)); //設定種子,用於隨機數產生

while(count>0)//還能繼續感染

//感染節點恢復(不包括上一步新感染的)

for(i=0;i

elseint recnum=0;//統計傳播結束後,處於恢復狀態的節點個數

for(i=0;ivexnum;i++)

returnrecnum;

}intmain()

;int arraylenth=sizeof(a)/sizeof(int);//sir

printf("recnum=%d",sir(g1,a,arraylenth,0.6,0.2));return 0;

EM演算法初始值設定的影響 三硬幣模型

先自定義pi,p,q的值,隨機生成實驗結果,真實 pi 0.3500.p 0.6600.q 0.3300 產生的實驗資料 pi 0.3522.p 0.6729.q 0.3341 將實驗結果帶入em演算法估計pi,p,q的值 第一次theta的初始值設定的裡真實值比較遠,初值設定為 pi 0.5000...

DateTime 賦初始值

今天在將資料庫裡的datetime型別資料賦給c 裡datetime型別變數的時候遇到乙個問題,那就是資料庫裡面的datetime資料存在null值。c 預設不能將null賦給datetime變數,但是可以使用nullable型別的datetime,只需在宣告變數的時候在datetime後加乙個?號...

討論 C Calendar賦初始值

q 我在page load的時候給calendar賦初始值,但是page顯示之後,calendar顯示是當天 比如今天顯示7月12號 我想讓它預設顯示出我給賦的時間 8 30 2006 我該怎麼去設定呢?a calendar1.selecteddate new datetime datetime.n...