【发布时间】:2017-07-28 04:54:20
【问题描述】:
我试图模拟一个城市的人口出生率,每年之后,T+0 到 T+n,其中 n 是节点数。因此,每 +1 年,可能会有 101% 的人口、100% 或 99% 的人口留在城市。
为了增加复杂性,城市中的人数必须随时变化。因此,例如,我们知道在第 5 年我们每年获得 +1% 人口的路径。所以在第 5 年,我们应该有 (1.01)^5 人。但是,由于这座城市是动态的,可能会有人离开或进入城市,因此必须手动调整城市人口。
例如第 5 年,有 5000 人离开这座城市到另一个地方。所以电子表格必须足够动态,以将第 5 级节点从 (1.01)^5 调整为 (1.01)^5 - 5000。第 6 级节点从那里继续......再次分支。
不确定我是否解释得足够清楚。但这似乎很难用我的业余 vba 技能进行编码。这可能吗?
我想了想,遇到了以下问题,想知道这是否有意义或是否可行:
1) 构建“树”的行插入计算量很大,无法绕过它。虽然这对于少量节点来说很好,但更大的树只需点击一下宏就需要几个小时! (我打算最多使用 11/12 个节点,这需要的时间太长了!) - 是否可以构建一个解决方案,其中宏计算一旦生成一次就使用相同的“树”,而不是每次单击都重新生成树。即溢出进程,我会在开始时运行一棵有 12 个节点的树。之后,输入值的调整只会生成显示在树中的值,而不是清理工作表并再次插入新行。
2) 让我以最好的方式说明这里发生了什么。 用于此测试的初始值 100 将替换为公式。让我们称这个公式为 (ABSqrt(C) + 6/X),其中 A、B 是常数,X 是工作表中的初始移动百分比输入,树枝基于. C 是棘手的部分 - 在手动干预到来之前,这被认为是恒定的。
让我们暂时假设一个简单的树模型,有 5 个节点 - 给出以下结构。 1, 3, 9, 27, 81 ,243 ... 3^n,其中 n 是节点数。 以 2% 的初始输入运行此公式,其中 X = 2%。 在这个时间点,我们得到了一棵带有值的漂亮小树。 我正在尝试在这里建立一个更具动态性的树,从而我可以介入例如在节点 3 的第二个值上,调整 C 的输入并查看依赖节点如何变化。所有这些都不会影响节点 1 和 2 上先前假设的 C 值,并且节点不会直接受此特定值的前向路径影响。
所以在下图中,只有蓝色的路径应该受到新的 C 值输入的影响。这有可能吗?我被困住了......
Option Explicit
Public Sub test()
Dim startvalue As Double, levels As Integer, levelchange As Double
Dim counterforlevel As Double, j As Long, i As Long, k As Long
Application.ScreenUpdating = False
startvalue = Sheets("Sheet1").Range("A2")
levels = Sheets("Sheet1").Range("B2")
levelchange = Sheets("Sheet1").Range("c2")
Sheets("Sheet2").Activate
Cells.ClearContents
Range("A1") = startvalue
For j = 2 To levels
counterforlevel = 3 ^ (j - 2)
For k = Cells(Rows.Count, j - 1).End(xlUp).Row To 1 Step -1
If k Mod 10 = 0 Then Application.StatusBar = "Level: " & j & Space(5) & "Processing " & Format(1 - k / counterforlevel, "#0.0%")
If Cells(k, j - 1) <> "" Then
Rows(k + 1).Insert shift:=xlDown
Cells(k + 1, j).Formula = "=" & Cells(k, j - 1).Address(False, False) & "*" & Format(1 - levelchange, "0%")
Cells(k, j).Formula = "=" & Cells(k, j - 1).Address(False, False)
Rows(k).Insert shift:=xlDown
Cells(k, j).Formula = "=" & Cells(k + 1, j - 1).Address(False, False) & "*" & Format(1 + levelchange, "0%")
End If
DoEvents
Next k
Next j
Application.StatusBar = False
End Sub
【问题讨论】:
-
我想了解您要做什么。有最终解决方案的价值吗?这是一个树木建设练习吗? ...您可以对整个事情使用单元格公式。您示例中的每个填充单元格都有一个公式。可以将手动调整输入到单元格中,例如第三个节点的 C14 或第四个节点的 C12,或者可以在第一行输入手动调整(将所有内容向下移动)
-
@jsotola 感谢您的 cmets。我正在尝试在这里运行模拟,因此需要动态。 IE。如果第 5 个节点的第 2 个值突然有 5000 人涌入,或者如果疾病因素,C 变化 20%,可能的结果是什么。等等。为了能够看到树的“右侧”发生了什么,并动态调整任何进一步的输入(可能在其治愈后减少疾病因素等),看看在第 n 个节点之后 pop 的变化会如何。简而言之,我想要价值观。还有应该通过调整公式手动调整的路径和场景。
-
@jsotola 在这个意义上使用手动调整不会影响树的结果吗?即如果我调整第三个节点的第二个值,树的其余部分不应该改变,只有它右侧的依赖项。
-
您希望 C15 仅影响 D15、E14、E15、E16(及其子节点)?
-
为什么树的其余部分应该保持不变?为什么 +- 1% 不受任何手动调整的影响?如果在 C15,核爆炸会杀死所有人。为什么还要 D12 和 D18 中的值?
标签: vba excel tree simulation