|
|
(14 intermediate revisions by 2 users not shown) |
Line 4: |
Line 4: |
|
| |
|
| == Initiating the [[Kovarex enrichment process]] == | | == Initiating the [[Kovarex enrichment process]] == |
| Unlike all other crafting processes in the game, uranium processing creates U-235 and U-238 based on probability, rather than in guaranteed deterministic amounts. Additionally, the Kovarex process requires a bulk stockpile of 40 units of the rare uranium-235 isotope to initiate in a single centrifuge. Therefore, planning uranium mining and processing for the Kovarex process takes certain considerations not encountered elsewhere in the game. | | Unlike most other crafting processes, uranium processing creates U-235 and U-238 based on probability, rather than in guaranteed deterministic amounts. Additionally, the Kovarex process requires a bulk stockpile of 40 units of the rare uranium-235 isotope to initiate in a single centrifuge. Therefore, planning uranium mining and processing for the Kovarex process takes certain considerations not encountered elsewhere in the game. |
|
| |
|
| === Expected value === | | === Expected value === |
Line 37: |
Line 37: |
| |} | | |} |
|
| |
|
| == Precise Mathematical Analysis == | | == Trivia == |
| In some cases you will need to know how many [[centrifuge]]s will you need exactly for each [[reactor]] stability without [[Kovarex enrichment process]]. For this purpose man can derive some formulas for estimation: probability of obtaining the required amount of [[uranium-235]] or even number of needed [[centrifuge]]s.
| | * Excluding Space Age-exclusive recipes, this is the only recipe in the base game to have random products. |
| | |
| The main goal of these calculus is to derive formula that can be easily applied and sustainable for predictions despite advancement along [[technologies]], game version updates, or ingame development and modifications.
| |
| | |
| === Variables ===
| |
| Let's introduce some variables that we'll need in further calculations
| |
| | |
| * ''<code>T</code> - overall time of a [[reactor]] working (in seconds*)'' | |
| * ''<code>t</code> - time of a [[reactor]] cycle (in seconds*)''
| |
| * ''<code>c</code> - consumption of [[uranium-235]] per reactor cycle''
| |
| * ''<code>k</code> - [[centrifuge]]s number (our target value for calculations)''
| |
| * ''<code>p</code> - probability of [[uranium-235]] production per centrifuge cycle''
| |
| * ''<code>n</code> - overall number of [[centrifuge]] cycles''
| |
| * ''<code>τ</code> - [[centrifuge]] time per cycle''
| |
| * ''<code>α</code> - desired probability of having success number [[uranium-235]] to sustain all <code>T</code> time of [[reactor]] stable work**''
| |
| | |
| <nowiki>*</nowiki> In seconds or you can measure in in-game [[tick]]s, it does not detracts from the generality of reasoning
| |
| | |
| <nowiki>**</nowiki> Known as [[https://en.wikipedia.org/wiki/Confidence_interval confidence level]]. Due to probability nature this variable can be only in <code>(0; 1)</code> interval. To preserve scientific papers treatment of significance we will use: 0,9; 0,95; 0,99 values. This value is opposite to [[https://en.wikipedia.org/wiki/Statistical_significance significance level]] for convinience and ease of interpretation.
| |
| === Assumptions ===
| |
| ;Assumption 1
| |
| : All <code>k</code> centrifuges are working without stop and simultaneously during each <code>n</code> cycles and have the same <code>τ</code>
| |
| ;Assumption 2
| |
| : There are always enough resources for transforming [[uranium-235]] in reactor fuel *
| |
| ;Assumption 3
| |
| : Transformation of [[uranium-235]] in fuel for reactors can be negleted **
| |
| ;Assumption 4 (for longrun play)
| |
| : Game can be played infinitely (this is technical assumption, for practical usage it's enough average playtime)
| |
| | |
| <nowiki>*</nowiki> For instance, base game [[uranium-238]] has very high probability (<code>0.993</code>) so there are always enough of it for [[uranium fuel cell]]
| |
| | |
| <nowiki>**</nowiki> For instance, base game [[uranium-235]] is transforming into 10 [[uranium fuel cell]]s for <code>12 sec</code>, but [[reactor]] cycle is <code>200 sec</code> - that's insignificant and you can always build more [[assembler]]s to sustain production throughput time.
| |
| | |
| === Exact approach ===
| |
| The main question we're going to answer:
| |
| | |
| <blockquote>
| |
| How many <code>k</code> [[centrifuge]]s do we need during <code>n</code> cycles of [[centrifuge]] production to sustain [[reactor]] working continuously for <code>T</code> time with probability <code>α</code>
| |
| </blockquote>
| |
| | |
| Assume, that each [[centrifuge]] in each production cycle is represented by '''''X<sub>ij</sub>''''' [[https://en.wikipedia.org/wiki/Random_variable#:~:text=%5Bedit%5D-,Discrete%20random%20variable,-%5Bedit%5D discrete random variable]], where '''''i''''' is number of [[centrifuge]] and '''''j''''' is number of production cycle.
| |
| We say, that if '''''X<sub>ij</sub>''''' has produced [[uranium-235]], then it's value <code>X<sub>ij</sub>=1</code>, if '''''X<sub>ij</sub>''''' hasn't, it's value <code>X<sub>ij</sub>=0</code>. That's why, <code> P(X<sub>ij</sub> = m) = 0.007, if m=1</code> and <code> P(X<sub>ij</sub> = m) = 0.993, if m=0</code> (This is so called [[https://en.wikipedia.org/wiki/Bernoulli_distribution Bernoulli distribution]]).
| |
| | |
| Let's find out how many time [[centrifuge]]s should produce [[uranium-235]] in all cycles to sustain a [[reactor]]:
| |
| <br>
| |
| From one side, there are <code>T/t</code> of [[reactor]] working cycles and as a result <code>T*c/t</code> overall [[uranium-235]] quantity need for working continuously all '''''T''''' time. Let's denote this value as '''''u''''', so <code>u=T*c/t</code>.
| |
| <br>
| |
| From other side, our [[centrifuge]]s during '''''T''''' time will work without stop and simultaneously for '''''n''''' cycles, that means that <code>T = n*τ</code>
| |
| | |
| Wrapping all up, we get that our needed quantity of '''''u''''' is <code>u=n*τ*c/t</code> for all '''''T''''' time [[reactor]] works.
| |
| | |
| 1) Let's consider simple case when we need only for '''''n''''' cycles and '''''k''''' [[centrifuge]]s to produce exactly '''''u''''' amount of [[uranium-235]] (technically, you need ceil <code>⌈u⌉</code>, but we will omit this for simplicity of calculations). As we figured out earlie each '''''X<sub>ij</sub>''''' has Bernoulli distribution, but for all '''''T''''' we produce <code>X<sub>all</sub> = ∑<sub>i</sub><sup>n</sup>∑<sub>j</sub><sup>k</sup>X<sub>ij</sub></code> quantity of [[uranium-235]] (this is sum for '''''n''''' cycles and '''''k''''' [[centrifuge]]s). But as all '''''X<sub>ij</sub>''''' are independent Bernoulli trials, so <code>X<sub>all</sub></code> is distributed by definition by [[https://en.wikipedia.org/wiki/Binomial_distribution binomial distribution]] <code>X<sub>all</sub> ~ B(nk, p)</code>. This leads us to probability of producing exactly '''''u''''' [[uranium-235]] for '''''n''''' cycles with '''''k''''' [[centrifuge]]s <code>P(X<sub>all</sub>=u) = C<sub>nk</sub><sup>u</sup> * p<sup>u</sup> * (1-p)<sup>nk-u</sup></code>, where <code>C<sub>nk</sub><sup>u</sup></code> is [[https://en.wikipedia.org/wiki/Binomial_coefficient binomial coefficient]]. As long as we know <code>u=n*τ*c/t</code> we can get full probability value of getting exact amount [[uranium-235]] for sustaining [[reactor]]:
| |
| | |
| <blockquote>
| |
| <code>P(X<sub>all</sub>=n*τ*c/t) = C<sub>nk</sub><sup>n*τ*c/t</sup> * p<sup>n*τ*c/t</sup> * (1-p)<sup>nk-n*τ*c/t</sup></code>
| |
| </blockquote>
| |
| | |
| 2) However, practically there is a probability to get more than '''u''' amount of [[uranium-235]], this corresponds to our purpose of sustaining [[reactor]] working continuously too. The main goal of [[centrifuge]]s production is not producing less than <code>u=n*τ*c/t</code>. That's why we need to calculate the probability of such event won't never occur in future, in other words our probability of always being success: <code>P(X<sub>all</sub> ≥ u)</code>. On the other side, <code>P(X<sub>all</sub> ≥ u) = 1 - P(X<sub>all</sub> < u)</code>, but <code>P(X<sub>all</sub> < u)</code> is [[https://en.wikipedia.org/wiki/Binomial_distribution#:~:text=0.059535.-,Cumulative%20distribution%20function,-%5Bedit%5D Cumulative distribution function]] and has exact formula for computation -- as sum of all probabilities for each <code>m < u</code> or <code>P(Xall < u) = ∑<sub>i</sub><sup>u-1</sup>P(X<sub>all</sub>=m)</code>, '''m''' is integer. The most important part is that we would like the probability <code>P(X<sub>all</sub> ≥ u)</code> to be high enough, that's why we need to set '''''α''''' variable (as for nature of probability it's impossible for <code>P(X<sub>all</sub> ≥ u)</code> to equal exactly '''''1'''''). That's how we can derive equation for variables selection:
| |
| | |
| <blockquote>
| |
| <code>P(X<sub>all</sub>≥u) ≥ α</code> ⇒ <code>1 - ∑<sub>m</sub><sup>u-1</sup>P(X<sub>all</sub>=m) ≥ α</code> ⇒ {using results of previous paragraph 1} ⇒ <code>∑<sub>m</sub><sup>n*τ*c/t-1</sup>C<sub>nk</sub><sup>m</sup> * p<sup>m</sup> * (1-p)<sup>nk-m</sup> ≤ 1 - α</code>
| |
| </blockquote>
| |
| | |
| So now we have formula (technically speaking, hypothesis test verification) to figure out how many '''''k''''' [[centrifuge]]s we need to sustain [[reactor]] with consumption '''''c''''' during '''''n''''' cycles of [[centrifuge]]s production.
| |
| This is the most general formula and not very comfort to use. There is no pure analitics form of sum, that's why we need to calculate each probability in some separetly. Moreover, the main disadvantage is in using high value of '''''n''''' and '''''u'''''. It is impossible due to binomial coefficiant will become an enormous number! So it can not be used to predict figures for longrun playtime. We will consider this in future calculations. However, this formula will be extremely useful if you are considering playing game speedrunning and prepare some blueprints.
| |
| | |
| ==== Example base game shortrun ====
| |
| Assume, you would like to find out how many [[centrifuge]]s you need to fully work to sustain 1 [[reactor]] with 0.99 confidence without any modules. Many are mistaken in confusing that 0.007 is speed of production, but that's untrue, as there is always a probability that even during whole game [[centrifuge]] won't produce any [[uranium-235]] (this probability is of course drastically small). Let's find out, for example, that we would like keep working reactor for 2000 [[centrifuge]]'s production cycles (neary ''2000*12/3600 = 6.7'' hours of [[reactor]] working) if we set 1 [[centrifuge]]:
| |
| | |
| | |
| {| class="wikitable"
| |
| ! n !! tau !! c !! t !! m !! p !! u !! ceil(u-1) !! alpha !! 1-alpha !! !! k !! C(nk, m) !! P(m) !! ∑<sub>m</sub>P
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 0 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 1 || 7,92E-07 || 7,92E-07
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 1 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 2000 || 1,12E-05 || 1,20E-05
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 2 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 2,0E+06 || 7,86E-05 || 9,06E-05
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 3 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 1,3E+09 || 0,0004 || 0,0005
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 4 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 6,6E+11 || 0,0013 || 0,0018
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 5 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 2,7E+14 || 0,0037 || 0,0054
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 6 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 8,8E+16 || 0,0086 || 0,0140
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 7 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 2,5E+19 || 0,0172 || 0,0312
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 8 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 6,3E+21 || 0,0302 || 0,0302
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 9 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 1,4E+24 || 0,0472 || 0,0472
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 10 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 2,8E+26 || 0,0662 || 0,1133
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 11 || 0,007 || 12 || 11 || 0,99 || <span style="color: red">0,01</span> || || 1 || 5,0E+28 || 0,0844 || <span style="color: red">0,1977</span>
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 12 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 8,3E+30 || 0,0986 ||
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 13 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 1 || 1,3E+33 || 0,1063 ||
| |
| |}
| |
| | |
| As you can see we need to produce 12 '''''u''''' for 2000 cycles. So due to our formula we need sum up all probabilities of production less than 12 [[uranium-235]] and compare with our desired confidence level:
| |
|
| |
| <code>∑<sub>m</sub><sup>2000*12*0.1/200-1</sup>C<sub>2000*1</sub><sup>m</sup> * 0.007<sup>m</sup> * (1-0.007)<sup>2000*1-m</sup> = 7,92E-07 + 1,12E-05 + 7,86E-05 + 0,0004 + 0,0013 + 0,0037 + 0,0086 + 0,0172 + 0,0302 + 0,0472 + 0,0662 + 0,0844 = 0,1977</code>
| |
| | |
| We can interpret this value as "Probability to produce less than needed [[uranium-235]] for 2000 [[centrifuge]]s cycles". And we know that this probability should be less than <code>1-α = 0.01</code>. However, this is wrong, so we can not be sure that 1 [[centrifuge]] will produce enough [[uranium-235]] to sustain [[reactor]] work during 2000 cycles. That's why we need to increase [[centrifuge]] quantity:
| |
| | |
| {| class="wikitable"
| |
| ! n !! tau !! c !! t !! m !! p !! u !! ceil(u-1) !! alpha !! 1-alpha !! !! k !! C(nk, m) !! P(x=m) !! sum(P(m<=ceil(u-1)))
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 0 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 1 || 6,3E-13 || 6,27E-13
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 1 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 4000 || 1,8E-11 || 1,83E-11
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 2 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 8,0E+06 || 2,5E-10 || 2,67E-10
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 3 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 1,1E+10 || 2,3E-09 || 2,61E-09
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 4 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 1,1E+13 || 1,6E-08 || 1,91E-08
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 5 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 8,5E+15 || 9,3E-08 || 1,12E-07
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 6 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 5,7E+18 || 4,4E-07 || 5,48E-07
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 7 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 3,2E+21 || 1,8E-06 || 2,30E-06
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 8 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 1,6E+24 || 6,2E-06 || 6,17E-06
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 9 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 7,2E+26 || 1,9E-05 || 1,93E-05
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 10 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 2,9E+29 || 0,0001 || 0,0001
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 11 || 0,007 || 12 || 11 || 0,99 || <span style="color: red">0,01</span> || || 2 || 1,0E+32 || 0,0001 || <span style="color: red">0,0002</span>
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 12 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 3,4E+34 || 0,0003 ||
| |
| |-
| |
| | 2000 || 12 || 0,1 || 200 || 13 || 0,007 || 12 || 11 || 0,99 || 0,01 || || 2 || 1,1E+37 || 0,0007 ||
| |
| |}
| |
| | |
| And now you can see that our condition is fulfilled. So now we can say, that without any [[module]]s, [[kovarex enrichment process]] we can achieve stability of 1 [[reactor]] during 2000 [[centrifuge]]s cycles using at least 2 [[centrifuge]]s! However, does this mean that we need 4 [[centrifuge]]s for 2 [[reactor]]s, 6 [[centrifuge]]s for 3 [[reactor]]s and etc? I suggest you think about this question yourself, I'm sure you will be very surprised by results, applying the approach outlined above.
| |
| | |
| === Distribution approximation ===
| |
| If you are going to play long enough while your [[reactor]]s setup is working, this will mean that we can pretend as <code>n→∞</code>. In this case as long as we know that our [[centrifuge]]s overall production <code>X<sub>all</sub> ~ B(nk, p)</code>, we can use [[https://en.wikipedia.org/wiki/De_Moivre%E2%80%93Laplace_theorem De Moiver-Laplace theorem]]. In short, it says that if our random variable has binomial distribution and we have large trials, then <code>(X<sub>all</sub>-nkp)/(sqrt(nkp(1-p)) ~ N(0, 1)</code>. That's why if we would like to estimate <code>P(X<sub>all</sub> ≥ u)</code> we should reduce it to this expression:
| |
| | |
| <code>P((X<sub>all</sub>-nkp)/(sqrt(nkp(1-p)))) ≥ (u-nkp)/(sqrt(nkp(1-p))) ≥ α</code> ⇒ <code>{1-P<sub>dist</sub> ≥ α}</code> ⇒ <code>(nkp - u)/(sqrt(nkp(1-p)) ≥ ɸ<sup>-1</sup>(1-α)</code>, where ɸ<sup>-1</sup> is inverse standart distribution and can be find by [[https://en.wikipedia.org/wiki/Standard_normal_table standart normal table]]
| |
| | |
| Let's denote <code>ɸ<sup>-1</sup>(α)</code> as λ. For each confidencle level α we can calculate it from standart normal table:
| |
| <code>λ<sub>0.99</sub>=2.3263</code>, <code>λ<sub>0.95</sub>=1.6449</code>, <code>λ<sub>0.9</sub>=1.2816</code>
| |
| | |
| Now we need to solve the equation above on a variable '''''k''''':
| |
| | |
| <code>(nkp-u)/(sqrt(nkp(1-p)) ≥ λ</code> ⇒ <code>(nkp-nτc/t)/(sqrt(nkp(1-p)) ≥ λ</code>
| |
| | |
| After some basic arithmetic operations and solution to quadratic equation you can get '''''k''''' value:
| |
| | |
| <blockquote>
| |
| <code>k ≥ (χ<sub>1</sub> + sqrt(χ<sub>1</sub><sup>2</sup> + 4χ<sub>0</sub>χ<sub>2</sub>))/(2*χ<sub>0</sub>)</code>
| |
| where
| |
| <code>χ<sub>0</sub> = np</code>,
| |
| <code>χ<sub>1</sub> = λ*sqrt(np(1-p))</code>,
| |
| <code>χ<sub>2</sub> = nτc/t</code>,
| |
| <code>λ</code> is inverse standart normal distribution (popular values: 2.3263; 1.6449; 1.2816 for corresponding *alpha;: 0.99; 0.95; 0.9)
| |
| </blockquote>
| |
|
| |
|
| == History == | | == History == |