2017-07-28 44 views
-2

我想模擬一個城市的人口出生率,每年之後,T + 0到T + n,其中n是節點的數量。因此,每1年,可能有101%的人口,100%或99%的人口仍在城市。Excel-VBA,樹模擬2變量

爲了增加複雜性,城市中的人數必須隨時變動。因此,舉例來說,我們知道第五年的路徑,每年我們都有1%的人口。所以在第五年我們應該有(1.01)^ 5人。然而,由於這個城市充滿活力,可能會有人離開或進入城市,因此需要對城市人口進行手動調整。

E.G.在第五年,5000個城市離開了另一個地方。因此,電子表格必須足夠動態,以便將第5級節點從(1.01)^ 5調整到(1.01)^ 5 - 5000。並且第6個節點從此處繼續......再次分支。

不知道我是否足夠清楚地解釋了這一點。但是,這似乎很難用我的業餘vba技能進行編碼。這可能嗎?

我想過這個問題,面對下面的問題,想知道,這是有道理的,或者如果它甚至是可行的:

1)該行插入建立一個「樹」的計算成本高昂,沒有它周圍的方式。雖然這對少數節點來說很好,但更大的樹只需要幾個小時就可以點擊宏! (我打算使用這個多達11/12節點,這需要太長的時間!) - 是否有可能建立一個解決方案,宏計算一旦生成一次就使用相同的「樹」,而不是重新生成樹每點擊一次。即溢出進程,我會在開始時運行一個有12個節點的樹。之後,調整輸入值只需生成在樹中顯示自己的值,而不是清潔工作表並重新插入新行。

2)讓我以最好的方式說明這裏發生了什麼。 用於此測試的初始值100將由公式替換。我們稱這個公式爲:(A B Sqrt(C)+ 6/X),其中A,B是常數,X是樹分支所基於的表中的初始%移動輸入。 C是一個棘手的問題 - 假定手動干預之前這個數值是恆定的。

讓我們暫時假設一個簡單的樹模型,其中有5個節點 - 給出以下結構。 1,3,9,27,81,243 ... 3^n,其中n是節點的數量。 以2%的初始輸入運行此公式,其中X = 2%。 在這個時間點,我們得到一個很好的小樹。 我想在這裏構建一個更加動態的樹,從而我可以介入例如在節點3的第二個值上,調整C的輸入並查看依賴節點如何變化。所有這些都不會影響節點上先前假定的C值,也不會受到此特定值的正向路徑直接影響的節點。

因此,在下圖中,只有藍色路徑應該受到新的C值輸入的影響。這是可能的嗎?我很卡...

enter image description here

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 
+0

我試圖理解你的正在努力去做。有沒有最終的解決方案價值?這是一個樹木建築練習嗎? ...你可以使用單元格公式來完成整個事情。你的例子中每個填充的單元格都有一個公式。手動調整可以輸入到第三節點的C14或第四節點的C12,或者手動調整可以輸入到第一行(向下移動所有內容) – jsotola

+0

@jsotola感謝您的意見。 我想在這裏運行模擬,因此需要動態。即如果第5個節點的第2個值突然涌入5000人,或者疾病因子C變化了20%,那麼可能的結果是什麼?等等。爲了能夠看到樹的「右側」會發生什麼,並動態地調整任何進一步的輸入(可能會在治癒後等降低疾病因子),以查看第n個節點後的流行變化將如何。 總之,我想要的價值觀。但也應該通過顛覆公式來手動調整路徑和場景。 – james

+0

@jsotola在這種意義上使用手動調整會影響樹的結果嗎?即如果我調整第三個節點的第二個值,樹的其餘部分不應該改變,只有右側的依賴者纔會改變。 – james

回答

0

我有點明白你正在嘗試做的。目前還不清楚,你打算如何使用的最後一個節點的數據(你怎麼想象的結果)

也許你需要使用像這樣

   110 121 132 143 154  10% increase per year 
      100 100 100 100 100 100  these 3 rows are a reference dataset 
       90 81 73 66 59  10% decline per year  



       +10% +10% +10% +10% +10%  this can be manually adjusted 
upper bound  110 125 136 147 158 
      100 100 105 105 105 105  scenario 
lower bound  90 86 76 69 62 
       -10% -10% -10% -10% -10% 
manual adjust +5     


have multiple scenarios on worksheet 

could use VBA to fill in the percentage values and transfer the result into another worksheet