大家好我们都知道自然界大多数现象都属于正态分布,或者说是高斯分布;
人员的流动也是一样的,也满足高斯分布特征,我们将设计这样的一个程序模拟人员流动情况:
这是一个常量类:
publicclassConstants{/***初始感染数量*/publicstaticintORIGINAL_COUNT=50;/***传播率*/publicstaticfloatBROAD_RATE=0.8f;/***潜伏时间*/publicstaticfloatSHADOW_TIME=140;/***医院收治响应时间*/publicstaticintHOSPITAL_RECEIVE_TIME=100;/***医院床位*/publicstaticintBED_COUNT=250;/***流动意向平均值*/publicstaticfloatu=-0.99f;}这是程序的主入口:
publicclassMain{publicstaticvoidmain(String[]args){MyPanelp=newMyPanel();ThreadpanelThread=newThread(p);JFrameframe=newJFrame();(p);(1000,800);(null);(true);(_ON_CLOSE);();ListPersonpeople=().getPersonList();for(inti=0;_COUNT;i++){intindex=newRandom().nextInt(()-1);Personperson=(index);while(()){index=newRandom().nextInt(()-1);person=(index);}();}}}这是一个人员类:
publicclassPerson{privateCitycity;privateintx;privateinty;privateMoveTargetmoveTarget;intsig=1;doubletargetXU;doubletargetYU;doubletargetSig=50;publicPerson(Citycity,intx,inty){=city;=x;=y;targetXU=100*newRandom().nextGaussian()+x;targetYU=100*newRandom().nextGaussian()+y;}publicbooleanwantMove(){doublevalue=sig*newRandom().nextGaussian()+;returnvalue0;}privateintstate=;publicintgetState(){returnstate;}publicvoidsetState(intstate){=state;}publicintgetX(){returnx;}publicvoidsetX(intx){=x;}publicintgetY(){returny;}publicvoidsetY(inty){=y;}intinfectedTime=0;intconfirmedTime=0;publicbooleanisInfected(){returnstate=;}publicvoidbeInfected(){state=;infectedTime=;}publicdoubledistance(Personperson){(((),2)+((),2));}privatevoidfreezy(){state=;}privatevoidmoveTo(intx,inty){+=x;+=y;}privatevoidaction(){if(state==){return;}if(!wantMove()){return;}if(moveTarget==null||()){doubletargetX=targetSig*newRandom().nextGaussian()+targetXU;doubletargetY=targetSig*newRandom().nextGaussian()+targetYU;moveTarget=newMoveTarget((int)targetX,(int)targetY);}intdX=()-x;intdY=()-y;doublelength=((dX,2)+(dY,2));if(length1){(true);return;}intudX=(int)(dX/length);if(udX==0dX!=0){if(dX0){udX=1;}else{udX=-1;}}intudY=(int)(dY/length);if(udY==0udY!=0){if(dY0){udY=1;}else{udY=-1;}}if(x700){moveTarget=null;if(udX0){udX=-udX;}}moveTo(udX,udY);//if(wantMove()){//}}privatefloatSAFE_DIST=2f;publicvoidupdate(){if(state=){return;}if(state===_RECEIVE_TIME){Bedbed=().pickBed();if(bed==null){("设置的隔离区已经没有空床位");}else{state=;x=();y=();(false);}}if(_TIMEstate==){state=;confirmedTime=;}action();ListPersonpeople=().personList;if(state=){return;}for(Personperson:people){if(()==){continue;}floatrandom=newRandom().nextFloat();if(_RATEdistance(person)SAFE_DIST){();}}}}这是我们的人员的状态类:
publicinterfaceState{intNORMAL=0;//正常状态intSUSPECTED=NORMAL+1;//有嫌疑intSHADOW=SUSPECTED+1;//潜伏期intCONFIRMED=SHADOW+1;//被确诊intFREEZE=CONFIRMED+1;//严重状intCURED=FREEZE+1;//治愈出院}这是医院类:
publicclassHospital{privateintx=800;privateinty=110;privateintwidth;privateintheight=606;publicintgetWidth(){returnwidth;}publicintgetHeight(){returnheight;}publicintgetX(){returnx;}publicintgetY(){returny;}privatestaticHospitalhospital=newHospital();publicstaticHospitalgetInstance(){returnhospital;}privatePointpoint=newPoint(800,100);privateListBedbeds=newArrayList();privateHospital(){if(_COUNT==0){width=0;height=0;}intcolumn=_COUNT/100;width=column*6;for(inti=0;icolumn;i++){for(intj=10;j=610;j+=6){Bedbed=newBed(()+i*6,()+j);(bed);}}}publicBedpickBed(){for(Bedbed:beds){if(()){returnbed;}}returnnull;}}这是我们绘制的面板:
publicclassMyPanelextsJPanelimplementsRunnable{privateintpIndex=0;publicMyPanel(){(newColor(0x444444));}@Overridepublicvoidpaint(Graphicsarg0){(arg0);//(newColor(0x00ff00));//绘制一个医院的隔离区(().getX(),().getY(),().getWidth(),().getHeight());ListPersonpeople=().getPersonList();if(people==null){return;}(pIndex).update();for(Personperson:people){switch(()){:{(newColor(0xdddddd));}break;:{(newColor(0xffee00));}break;::{(newColor(0xff0000));}break;}();((),(),3,3);}pIndex++;if(pIndex=()){pIndex=0;}}publicstaticintworldTime=0;@Overridepublicvoidrun(){while(true){();try{(100);worldTime++;}catch(InterruptedExceptione){();}}}}代码地址:
版权所有 © Copyright © 2002-2030 龙辉游戏资讯网站地图