马尔可夫链蒙特卡洛方法模拟和预测火灾





5.00/5 (11投票s)
通过马尔可夫链蒙特卡洛方法进行现象预测和模拟
引言
在任何区域都存在一些具有特定传播行为的事件,例如火灾、感染病毒或计算机病毒。上述所有示例都存在共同的模式,例如,它们在预测下一部分时很复杂,并且需要大量的数学计算才能预测传播的下一个点。在这篇文章中,我专注于火灾蔓延。
火灾在生活中的各个方面都造成了巨大的损失,包括人员伤亡和经济损失,这些损失不容忽视。当火势蔓延开来时,情况会变得更糟。因此,预测火势蔓延非常重要。显然,对如何避免火灾发生在新的位置有全面的了解,可以预防其后果。事实上,当火焰接触到潜在的燃料时,就会发生燃烧,火势就会蔓延到新的位置。
燃料类型和负荷、风速、湿度和坡度等因素在火势蔓延中起着重要作用,我们可以从火灾行为中找出模式并近似下一个点,以便在新点扑灭火灾。在某些区域,例如船上,可用的工具有限,而且我们没有完整专业的消防队伍。
使用马尔可夫链蒙特卡罗进行火灾模拟是一种快速且合适的方法,因为它没有记忆,而信息量少、对下一点了解不足的数学公式会耗费大量时间。在这种方法中,有一个函数用于生成零到一之间的随机数,这是火焰蔓延的概率。如果根据火灾影响计算出的船舱的概率大于此数字,则火势会蔓延,否则火势会熄灭。
建模与仿真
对任何现象进行建模和仿真都需要进行分析,其中涉及参数及其相互关系。这些参数可以被视为系统组件,通过使用具有随机事件的数学方程,我们可以构建一个具体而准确的模型,该模型可以可视化系统行为(火势蔓延),并显示预测下一个动作的最佳结果。总的来说,我们可以组合所有标准,然后说明这些条件集的结果。
仿真方法在工程科学领域得到了革命性的发展。我们应该通过建模来抽象现实,并通过仿真随时间推移来实现建模。当时间过去时,我们必须观察仿真是否以最佳质量实现了建模。这几乎取决于对所需主题的概念、假设和约束的良好理解。
仿真步骤
- 获取相关参数
- 在虚拟世界中构建环境
- 使用滑块等实现的工具更改和控制参数,这些滑块可以分配在区间内的不同值,或使用带有开启/关闭选项的按钮。
- 根据参数的特定值显示虚拟环境并开始操作,简单来说,这应该像一个动画,其中一些演员手拉手扮演他们的角色,并用他们的属性和角色影响整个故事,并向我们展示一个事实,以得出结论。
为何要进行仿真
- 便宜:在现实世界中测试不同的情况显然非常昂贵,例如模拟地震或飓风。
- 安全:如上所述,自然灾害的模拟具有极大的危险性,会破坏环境。
- 比实时快:借助“如果-则-否则”语句,我们可以分析不同工具(如滑块或按钮)改变参数后的不同值,并且程序环境会根据这些值进行更改,这不会花费很长时间。
- 比传统实验更逼真:我们可以设置任意参数值,并获得更精确的结果。
- 环境参数的配置很容易。
- 按需测试:可以进行无数次测试,而无需担心费用和任何破坏。
- 以直观的方式进行培训:在构建仿真后,对于参与或与仿真主题相关的人员(例如消防或救援部队)进行培训非常有用。
随机事件的仿真
火势蔓延是随机事件,没有精确的数学处理方法,或者即使有一些根据 Rothermal 方程的方程,我们也需要花费大量的时间和金钱来分析,因此最好的方法是近似结果并将其汇总到表格中进行比较和讨论。
马尔可夫链
马尔可夫链是一个数学系统,它有可数的个状态,并且从一个状态转移到另一个状态的概率为 P。最基本的马尔可夫链属性是无记忆性。简单来说,这个随机过程是没有记忆的;这意味着下一个状态仅取决于当前状态,而不是过去事件;它也称为马尔可夫属性。马尔可夫链对于模拟现实世界非常有用且适用。
更准确地说,马尔可夫链是随时间变化的离散随机过程,具有马尔可夫属性,在每个阶段处于特定状态;阶段通常在相同的离散时间间隔内。系统是随机变化的;因此,不可能在未来的特定点预测马尔可夫链的状态,尽管某些统计属性是可预测的。状态之间的转移称为转移,此变化的概率称为转移概率,这些状态及其转移概率构成马尔可夫链。
马尔可夫链将统计概念转化为简单的数学语言。它包含一系列随机变量(X0, X1, X2, ...),每个状态都是一个随机变量,正如您在下面的图中所见,每个状态有三种选项可以转移到另一个位置。例如,状态 0 有 25% 的概率转移到状态 1,15% 的概率转移到状态 2,60% 的概率保持在当前位置不移动。所有这些转移都可以收集到一个矩阵中,如右侧图片所示,因此我们将马尔可夫链之间转移的概率转换为数学矩阵。
形式定义
转移的条件概率
在 *1* 次移动中,从第 ith 状态转移到第 jth 状态的转移概率
在 *n* 次移动中,从第 ith 状态转移到第 jth 状态的转移概率
随机游走
马尔可夫链的一个著名例子是“随机游走”;位置将在每个步骤以概率 P 改变。有两种可能的转移,一种是 (+1) 整数,另一种是 (-1) 整数。随机游走是研究包含随机和连续步骤的路径,例如气体或液体中分子的行进路径、赌徒的财务状况和股票价格波动。这些步骤发生在离散时间,并用自然数(X1, X2, ....)索引。总的来说,随机游走是马尔可夫过程主题的基本课题,并且与火势蔓延等传播模型密切相关。
随机游走可能发生在图、直线或平面上。想象一下,一个运动体在一个平面和网格页面上移动,它从一个节点 开始,然后以特定概率 P 移动到另一个节点,最终我们可以定义一个序列
在
在 n 步之后,它在哪里移动仍然是一个棘手的问题。显然,我们无法计算和确定随机位置的移动,但我们可以讨论其概率分布如下:
期望值:
另外,利用步长是相互独立的这一事实,我们可以推断出位置变化的平均值是 的程度。
蒙特卡罗方法
蒙特卡罗方法或蒙特卡罗实验是一组基于重复随机变量的计算算法。当无法用确定性算法计算精确结果时,它就适用和合适。因此,它对于模拟某些自然灾害(如流体和火灾)非常有用,因为这些现象在输入值方面存在显著的不确定性。这个名字来源于蒙特卡罗的一个著名赌场,那里的物理学家叔叔在那里赌博。
蒙特卡罗模式
- 定义输入的特定域,在这里,它是零到一之间的数字范围。
- 生成随机数
- 特定计算,在这里,随机数是否小于 0.8?
- 合并结果并前进,在这里,如果上述问题的答案为“是”,则转到下一个状态。
马尔可夫链蒙特卡罗,包括蒙特卡罗随机游走,它是一组基于马尔可夫链的用于从概率分布采样(抽样)的算法。链从可选节点开始,然后过程重复多次,通常一段时间后会达到一个恒定的分布。如果这个时间尽可能短,那么该链就是期望的。这种方法对于我们进行复杂的计算操作,耗时过长或需要花费大量成本才能获得良好合理结果的情况非常有用。
要求
模拟火灾的主要要求是收集船上房间环境的数据,并通过传感器进行处理,并对火势蔓延相关的参数进行一些计算,然后我需要一个程序来记录和计算时间,因为火灾模拟是一个随时间变化的现象。
本项目需要具备以下先决条件
- MS SQL Server 2008
- Visual Studio 2008 版本 9 (.NET 3.5)
首次运行应用程序并遵循以下步骤
- 从组合框中选择一个房间。
- 然后更改湿度、燃料等属性。
- 单击“应用”按钮以保存您的新配置值。
- 单击“设置配置”按钮以设置您为四个房间指定的特定值。
- 单击“排序”按钮以排序房间并显示其设置火灾的优先顺序箭头。
- 最后;单击“开始”以查看模拟。
使用代码
创建数据库
USE [Fire] GO /****** Object: Table [dbo].[tblFire] Script Date: 06/01/2012 06:07:42 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[tblFire]( [Room] [int] NULL, [FuelType] [int] NULL, [FuelLoad] [int] NULL, [Wind] [int] NULL, [Humidity] [int] NULL, [Slope] [int] NULL, [SolarAspect] [int] NULL, [Prob] [float] NULL ) ON [PRIMARY] GO
计算平均强度并制作每个房间的概率
Dim intAve As Double
intSum = ((10 - CInt(Me.Humidity.Value)) + CInt(Me.FuelType.Value) +
CInt(Me.FuelLoad.Value) + CInt(Me.WindVelocity.Value) + CInt(Me.Slope.Value) +
CInt(Me.Temperature.Value))
intAve = intSum / 6
'Calculate Prob
intAve = intAve / 10
intAve = Math.Round(intAve, 1)
设置火灾(转到下一个状态)
Private Sub SetFire4_1() If token4 = 1 Then Me.btnFire4_1.Visible = True End If End Sub
扑灭火灾(返回到上一个状态)
Private Sub StifleFire4_1() If token4 = -1 Or token4 = 0 Then Me.btnFire4_1.Visible = False End If End Sub
应用更改设置
Try 'strsql = "update tblFire set FuelType FuelLoad Wind Humidity Slope SolarAspect Prob where Room=" + Me.comboRoom.SelectedText.ToString() strsql = "update tblFire set FuelType=" + Me.FuelType.Value.ToString() & _ ", FuelLoad= " + Me.FuelLoad.Value.ToString() & _ ", Wind= " + Me.WindVelocity.Value.ToString() & _ ", Humidity= " + Me.Humidity.Value.ToString() & _ ", Slope= " + Me.Slope.Value.ToString() & _ ", SolarAspect= " + Me.Temperature.Value.ToString() & _ ", Prob= " + intAve.ToString() & _ " where Room=" + Me.comboRoom.Text Dim objcommand As New SqlCommand(strsql, cn) cn.Open() objcommand.ExecuteNonQuery() Catch ex As Exception Finally cn.Close() End Try
获取数据以设置配置
Try 'strsql = "update tblFire set FuelType FuelLoad Wind Humidity Slope SolarAspect Prob where Room=" + Me.comboRoom.SelectedText.ToString() strsql = "update tblFire set FuelType=" + Me.FuelType.Value.ToString() & _ ", FuelLoad= " + Me.FuelLoad.Value.ToString() & _ ", Wind= " + Me.WindVelocity.Value.ToString() & _ ", Humidity= " + Me.Humidity.Value.ToString() & _ ", Slope= " + Me.Slope.Value.ToString() & _ ", SolarAspect= " + Me.Temperature.Value.ToString() & _ ", Prob= " + intAve.ToString() & _ " where Room=" + Me.comboRoom.Text Dim objcommand As New SqlCommand(strsql, cn) cn.Open() objcommand.ExecuteNonQuery() Catch ex As Exception Finally cn.Close() End Try
开始设置随时间变化的火势
If Me.sortlistbox.Items(3).ToString() = Me.btnProb1.Text Then AddHandler Count1.Tick, AddressOf Count_Tick1 Me.a.Text = "1" ElseIf Me.sortlistbox.Items(3).ToString() = Me.btnProb2.Text Then AddHandler Count1.Tick, AddressOf Count_Tick2 Me.a.Text = "2" ElseIf Me.sortlistbox.Items(3).ToString() = Me.btnProb3.Text Then AddHandler Count1.Tick, AddressOf Count_Tick3 Me.a.Text = "3" ElseIf Me.sortlistbox.Items(3).ToString() = Me.btnProb4.Text Then AddHandler Count1.Tick, AddressOf Count_Tick4 Me.a.Text = "4" End If
火势蔓延
如果整个房间都着火了,则以高概率转到下一个房间
Private Sub Count_Tick1(ByVal sender As System.Object, ByVal e As System.EventArgs) 'since we added the handler, this code will occur once each second 'Dim path As String = "c:\Documents and Settings\Albert Cisco\Desktop\fire\Timer\time\time\fire" Me.btnProb_1.Visible = True Me.btnTime_1.Visible = True Me.p1.Visible = True Me.t1.Visible = True Dim bytes1(99) As Byte Dim rnd1 As New Random() Dim num As Double num = rnd1.NextDouble 'get the time Me.Text = sender.Days & " days, " & sender.Hours & " hours, " & sender.Minutes & " minutes and " & sender.Seconds & " seconds left." 'Count Up Dim iMin As Integer iMin = (CInt(sender.Minutes)) * 60 iMin = iMin + sender.Seconds Me.btnTime_1.Text = 239 - iMin If token < 0 Then token = 0 End If If token > 4 Then token = 4 End If Me.btnProb_1.Text = num If num < Me.btnProb1.Text Then token = token + 1 SetFire1_1() SetFire1_2() SetFire1_3() SetFire1_4() Else token = token - 1 StifleFire1_1() StifleFire1_2() StifleFire1_3() StifleFire1_4() End If If Me.btnFire1_4.Visible = True And Me.dd.Text = "NO" Then Me.dd.Text = "YES" 'Declares a variable for our countdown timer. Dim Count1 As CountDown 'Set the time to 3 minutes, this can be done in two ways '----way ---- Count1 = New CountDown(0, 4) '-------- 'starts the timer Count1.Start() If Me.a.Text = "1" Then If Me.b.Text = "4" Then AddHandler Count1.Tick, AddressOf Count_Tick4 ElseIf Me.b.Text = "3" Then AddHandler Count1.Tick, AddressOf Count_Tick3 ElseIf Me.b.Text = "2" Then AddHandler Count1.Tick, AddressOf Count_Tick2 End If End If If Me.b.Text = "1" Then If Me.c.Text = "4" Then AddHandler Count1.Tick, AddressOf Count_Tick4 ElseIf Me.c.Text = "3" Then AddHandler Count1.Tick, AddressOf Count_Tick3 ElseIf Me.c.Text = "2" Then AddHandler Count1.Tick, AddressOf Count_Tick2 End If End If If Me.c.Text = "1" Then If Me.d.Text = "4" Then AddHandler Count1.Tick, AddressOf Count_Tick4 ElseIf Me.d.Text = "3" Then AddHandler Count1.Tick, AddressOf Count_Tick3 ElseIf Me.d.Text = "2" Then AddHandler Count1.Tick, AddressOf Count_Tick2 End If End If If Me.d.Text = "1" Then Me.PictureBox1.BackgroundImage = Image.FromFile(path & "\Fire.jpg") End If End If End Sub
反馈
欢迎您随时对本文发表任何反馈;很高兴看到您的意见和对本代码的投票。如果您有任何问题,请随时在此处向我提问。