`

病毒扩散模型(Java)

    博客分类:
  • Java
阅读更多

病毒扩散模型

现代计算机蠕虫病毒传播途径多样化,除了利用移动介质如U盘等传播外,还可以 通过邮件、网页挂马、聊天工具、文件传输等多种方式传播,一些病毒甚至可以利用系统的某些漏洞自动进行传播。中毒的主机会自动搜索可以被感染的主机,并将 蠕虫病毒扩散开来。一台没有安装系统补丁、无安全防护软件的计算机连接到internet上,即使用户不做任何操作,只要网络是通的,在5分钟之内几乎必 定会感染上蠕虫病毒。下图是一个著名的病毒--红色代码在某天内传播感染计算机的情况。

CodeRed Spreads

红色代码病毒的传 播图

各种 各样的蠕虫病毒在Internet上进行传播,大量的主机被感染,新的病毒又在不断出现。这种现象与人类社会所面临的传染病流行的情形类似。它们都可以用 一个简单的数学模型来描述。

diff

式中N 是表示所有的可能被感染的群体数量,alpha 是已经被感染上病毒的个体所占的比 例,K 是一个常数,表示在一个时间段内某个病毒携带者(或感染病毒的计算机)能够传染其他的个体数 量。对于一个足够小的时间dt ,新增加的被感染个体数Nda 等于已经感染的数量Na 和可被感染的K(1-a) 的乘 积。这是一个微分公式。

 

我们往往关心的是被感染的主机比例\alpha 随着时间的增长变化的情况。对上面的 公式积分后得到如下的结果:

model

这个式子中的T 是一个积分常量,代表病毒的爆发期时刻。如下图的示例,传染能力(即在一段时 间内一台感染病毒的个体可以再感染的主机的多少)的度量值K=2.6。病毒的爆发期时间T=5.52。在5.52小时之前,病毒的传播速度还比较慢,接近 该时刻后,病毒感染了大量的主机,并且传播的速度也越来越快,最后几乎感染了所有的主机,再传播的速度也开始变慢了。前面红色代码病毒的传播图也表明了这 个特点。这个公式有一个著名的名称:罗杰斯特方程(logistic equation )。

spread

logistic equation

参考文献:

如何在你的空闲时间 占领整个互联网:How to 0wn the Internet in Your Spare Time

一些病毒传播的动画:http://www.caida.org/publications/animations/#security

=====

本题的目的要求你实现logistic方程,对不同的输入参数,计算某些特定时刻的函数值。

输入:

参数K和T,以及用起始时刻ts ,终止时刻te 和 增量dt表示的一个时间区间[ts ,te )。包含ts ,但不含te

输出:

对应各个时刻点的感染个体的比例,用空格进行分隔,每10个数据后换行。最后一行如果不够 10个数据也要换行。(补充:可能出现(t e -t s )/dt不是整 数的情形,要注意是否应该取最后那个点

输出数据请采用格式化字符串" %4.3f",即每个数据之前放置一个空格,数据保留小数点后三位有效数字。

 

样例输入:

2.6 5.52

0 8 0.1

样例输出:

0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000

0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000

0.000 0.000 0.000 0.000 0.000 0.000 0.001 0.001 0.001 0.001

0.001 0.002 0.002 0.003 0.004 0.005 0.007 0.009 0.011 0.015

0.019 0.024 0.031 0.040 0.052 0.066 0.084 0.106 0.133 0.166

0.206 0.251 0.303 0.361 0.423 0.487 0.552 0.615 0.674 0.729

0.777 0.819 0.854 0.884 0.908 0.927 0.943 0.956 0.965 0.973

0.979 0.984 0.987 0.990 0.993 0.994 0.996 0.997 0.997 0.998

 

注意:(循环变量应使用整数类型)

 

 

import java.util.Scanner;

public class logistic {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		double K = scanner.nextDouble();
		double T = scanner.nextDouble();
		int t1 = scanner.nextInt();
		int t2 = scanner.nextInt();
		double dt = scanner.nextDouble();
		double a;
		int len = 0;
		for(int i=0;(t1+i*dt)<t2;i++){
			a = Math.exp(K*((t1+i*dt)-T))/(1+Math.exp(K*((t1+i*dt)-T)));
			System.out.printf(" %4.3f",a);
			len++;
			if(len==10){
				System.out.println();
				len = 0;
			}
		}
		if(len != 0){
			System.out.println();
		}
	}
}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics