第五次作业病毒扩散模型NO.3

来源:互联网 发布:12306下载订票软件 编辑:程序博客网 时间:2024/05/21 14:04

现代计算机蠕虫病毒传播途径多样化,除了利用移动介质如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个数据也要换行。(补充:可能出现(te-ts)/dt不是整数的情形,要注意是否应该取最后那个点

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

样例输入:

2.65.52

080.1

样例输出:

0.0000.0000.0000.0000.0000.0000.0000.0000.0000.000

0.0000.0000.0000.0000.0000.0000.0000.0000.0000.000

0.0000.0000.0000.0000.0000.0000.0010.0010.0010.001

0.0010.0020.0020.0030.0040.0050.0070.0090.0110.015

0.0190.0240.0310.0400.0520.0660.0840.1060.1330.166

0.2060.2510.3030.3610.4230.4870.5520.6150.6740.729

0.7770.8190.8540.8840.9080.9270.9430.9560.9650.973

0.9790.9840.9870.9900.9930.9940.9960.9970.9970.998

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

import java.util.Scanner;  /* * 病毒扩散程序   * 参数K和T,以及用起始时刻ts ,终止时刻te 和 增量dt表示的一个时间区间[ts ,te )。包含ts ,但不含te  */public class Main {        public static void main(String[] args) {          Scanner scanner = new Scanner(System.in);          double K = scanner.nextDouble();          double T = scanner.nextDouble();          int ts = scanner.nextInt();          int te = scanner.nextInt();          double dt = scanner.nextDouble();          double a;          int len = 0;          for(int i=0;(ts+i*dt)<te;i++){              a = Math.exp(K*((ts+i*dt)-T))/(1+Math.exp(K*((ts+i*dt)-T)));              System.out.printf(" %4.3f",a);              len++;              if(len==10){                  System.out.println();                  len = 0;              }          }          if(len != 0){              System.out.println();          }      }  }


 

原创粉丝点击