Added rng param to algo
This commit is contained in:
parent
d8b8ece8a7
commit
87cb8c3cf1
@ -8,14 +8,14 @@ pub(super) fn initializeBoard(b: &mut Board) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn random_range_with_hole(range: Range<usize>, hole: usize) -> usize {
|
fn random_range_with_hole(rng: &mut impl rand::Rng, range: Range<usize>, hole: usize) -> usize {
|
||||||
assert!(
|
assert!(
|
||||||
range.contains(&hole),
|
range.contains(&hole),
|
||||||
"Hole not in range: {hole} !in {}..{}",
|
"Hole not in range: {hole} !in {}..{}",
|
||||||
range.start,
|
range.start,
|
||||||
range.end
|
range.end
|
||||||
);
|
);
|
||||||
let shrunk = random_range(range.start..(range.end - 1));
|
let shrunk = rng.random_range(range.start..(range.end - 1));
|
||||||
if shrunk >= hole {
|
if shrunk >= hole {
|
||||||
return shrunk + 1;
|
return shrunk + 1;
|
||||||
} else {
|
} else {
|
||||||
@ -23,9 +23,9 @@ fn random_range_with_hole(range: Range<usize>, hole: usize) -> usize {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn swapRandomQueensOnce(b: &mut Board) {
|
pub(super) fn swapRandomQueensOnce(b: &mut Board, rng: &mut impl rand::Rng) {
|
||||||
let i1 = random_range(0..b.len());
|
let i1 = rng.random_range(0..b.len());
|
||||||
let i2 = random_range_with_hole(0..b.len(), i1);
|
let i2 = random_range_with_hole(rng, 0..b.len(), i1);
|
||||||
|
|
||||||
let tmp = b[i1];
|
let tmp = b[i1];
|
||||||
b[i1] = b[i2];
|
b[i1] = b[i2];
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
use eframe::emath::Numeric;
|
|
||||||
use rand::{random, random_range};
|
|
||||||
use crate::algo::Board;
|
|
||||||
use crate::algo::misc::{initializeBoard, isOnDiagonal, swapRandomQueensOnce};
|
use crate::algo::misc::{initializeBoard, isOnDiagonal, swapRandomQueensOnce};
|
||||||
|
use crate::algo::Board;
|
||||||
|
use eframe::emath::Numeric;
|
||||||
|
|
||||||
pub(super) fn calculateEnergy(b: &Board) -> f64 {
|
pub(super) fn calculateEnergy(b: &Board) -> f64 {
|
||||||
let mut conflictsCount = 0usize;
|
let mut conflictsCount = 0usize;
|
||||||
@ -29,7 +28,7 @@ pub struct AnnealingConfig {
|
|||||||
pub iterationsPerAge: usize
|
pub iterationsPerAge: usize
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn simulateAnnealing(len: usize, config: &AnnealingConfig) -> Board {
|
pub(crate) fn simulateAnnealing(len: usize, config: &AnnealingConfig, rng: &mut impl rand::Rng) -> Board {
|
||||||
assert!(config.targetTemperature < config.initialTemperature);
|
assert!(config.targetTemperature < config.initialTemperature);
|
||||||
assert!((0f64..1f64).contains(&config.cooldownCoefficient));
|
assert!((0f64..1f64).contains(&config.cooldownCoefficient));
|
||||||
|
|
||||||
@ -48,13 +47,13 @@ pub(crate) fn simulateAnnealing(len: usize, config: &AnnealingConfig) -> Board {
|
|||||||
|
|
||||||
for _ in 0..config.iterationsPerAge {
|
for _ in 0..config.iterationsPerAge {
|
||||||
let mut newState = currentState.clone();
|
let mut newState = currentState.clone();
|
||||||
swapRandomQueensOnce(&mut newState.board);
|
swapRandomQueensOnce(&mut newState.board, rng);
|
||||||
newState.energy = calculateEnergy(&newState.board);
|
newState.energy = calculateEnergy(&newState.board);
|
||||||
|
|
||||||
if newState.energy <= currentState.energy {
|
if newState.energy <= currentState.energy {
|
||||||
currentState = newState
|
currentState = newState
|
||||||
} else {
|
} else {
|
||||||
let test = random::<f64>();
|
let test = rng.random::<f64>();
|
||||||
let delta = newState.energy - currentState.energy;
|
let delta = newState.energy - currentState.energy;
|
||||||
let calc = (-delta/test).exp();
|
let calc = (-delta/test).exp();
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user