How to resolve the algorithm Percolation/Mean run density step by step in the Java programming language
How to resolve the algorithm Percolation/Mean run density step by step in the Java programming language
Table of Contents
Problem Statement
Let
v
{\displaystyle v}
be a vector of
n
{\displaystyle n}
values of either 1 or 0 where the probability of any value being 1 is
p
{\displaystyle p}
; the probability of a value being 0 is therefore
1 − p
{\displaystyle 1-p}
. Define a run of 1s as being a group of consecutive 1s in the vector bounded either by the limits of the vector or by a 0. Let the number of such runs in a given vector of length
n
{\displaystyle n}
be
R
n
{\displaystyle R_{n}}
. For example, the following vector has
R
10
= 3
{\displaystyle R_{10}=3}
Percolation theory states that Any calculation of
R
n
/
n
{\displaystyle R_{n}/n}
for finite
n
{\displaystyle n}
is subject to randomness so should be computed as the average of
t
{\displaystyle t}
runs, where
t ≥ 100
{\displaystyle t\geq 100}
. For values of
p
{\displaystyle p}
of 0.1, 0.3, 0.5, 0.7, and 0.9, show the effect of varying
n
{\displaystyle n}
on the accuracy of simulated
K ( p )
{\displaystyle K(p)}
. Show your output here.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Percolation/Mean run density step by step in the Java programming language
The given Java code is intended to explore the behavior of a percolation model and compare the empirical results with the theoretical expectations. A percolation model simulates the spread of a fluid through a porous medium by randomly opening or closing connections between points in a grid.
Here's a detailed explanation of the code:
-
Main Method: The program starts by running a series of tests with varying parameters and displaying the results in a tabular format.
-
Run Length: For each test, it varies the run length (
length
) from 100 to 100,000 in powers of 10. -
Probability of Opening: The probability of opening a connection between two points (
probability
) is varied from 0.1 to 0.9 in increments of 0.2. -
Theoretical Expectation: For each combination of
probability
andlength
, the theoretical probability of having a continuous path from top to bottom in the grid is calculated using the formulatheory = probability * ( 1.0 - probability )
. -
Empirical Measurement: The
runTest
method is called to perform multiple runs of the percolation experiment for a givenprobability
andlength
. Each run simulates a series of connected or disconnected points in a grid. The result is the fraction of runs that have a continuous path from top to bottom.
In each run:
previousBit
andnextBit
represent the state of two consecutive points in the grid, initially set to 0.- The grid is traversed by generating a random number for each point. If the random number is less than
probability
, the point is opened (nextBit
set to 1), otherwise, it remains closed (nextBit
set to 0). - If the current point is opened and the previous point was closed, the counter
count
is incremented, indicating that a new continuous path has started. previousBit
is updated to the value ofnextBit
for the next iteration.
-
Results Display: The empirical result (
result
) is calculated ascount / aRunCount / aLength
. The results are printed in a table with columns forprobability
,length
,result
,theory
, and thedifference
betweenresult
andtheory
. -
Thread Local Random: The
random
variable usesThreadLocalRandom
for generating random numbers, which provides faster and more efficient random number generation than the traditionalRandom
class.
Overall, the code performs multiple simulations of a percolation model and compares the empirical measurements with theoretical expectations, showing how the probability of percolation changes with different parameters. The results are presented in a tabular format for easy comparison and analysis.
Source code in the java programming language
import java.util.concurrent.ThreadLocalRandom;
public final class PercolationMeanRun {
public static void main(String[] aArgs) {
System.out.println("Running 1000 tests each:" + System.lineSeparator());
System.out.println(" p\tlength\tresult\ttheory\t difference");
System.out.println("-".repeat(48));
for ( double probability = 0.1; probability <= 0.9; probability += 0.2 ) {
double theory = probability * ( 1.0 - probability );
int length = 100;
while ( length <= 100_000 ) {
double result = runTest(probability, length, 1_000);
System.out.println(String.format("%.1f\t%6d\t%.4f\t%.4f\t%+.4f (%+.2f%%)",
probability, length, result, theory, result - theory, ( result - theory ) / theory * 100));
length *= 10;
}
System.out.println();
}
}
private static double runTest(double aProbability, int aLength, int aRunCount) {
double count = 0.0;
for ( int run = 0; run < aRunCount; run++ ) {
int previousBit = 0;
int length = aLength;
while ( length-- > 0 ) {
int nextBit = ( random.nextDouble(1.0) < aProbability ) ? 1 : 0;
if ( previousBit < nextBit ) {
count += 1.0;
}
previousBit = nextBit;
}
}
return count / aRunCount / aLength;
}
private static ThreadLocalRandom random = ThreadLocalRandom.current();
}
You may also check:How to resolve the algorithm Number reversal game step by step in the Racket programming language
You may also check:How to resolve the algorithm Sieve of Eratosthenes step by step in the M2000 Interpreter programming language
You may also check:How to resolve the algorithm Executable library step by step in the Factor programming language
You may also check:How to resolve the algorithm Dutch national flag problem step by step in the zkl programming language
You may also check:How to resolve the algorithm Pierpont primes step by step in the D programming language