More tries at day 16
This commit is contained in:
@ -9,9 +9,9 @@ use std::{
|
||||
use aoc22::{day16, util};
|
||||
|
||||
pub fn main() {
|
||||
let valves = day16::parse_valves(&util::parse_input());
|
||||
let dists = day16::calc_dists(&valves);
|
||||
let state = day16::State::new(Arc::new(valves), Arc::new(dists));
|
||||
let valves = Arc::new(day16::parse_valves(&util::parse_input()));
|
||||
let dists = Arc::new(day16::calc_dists(&valves));
|
||||
let state = day16::State::new(&valves);
|
||||
|
||||
let possible_states = Arc::new(Mutex::new(Vec::new()));
|
||||
possible_states.lock().unwrap().push(state);
|
||||
@ -23,7 +23,9 @@ pub fn main() {
|
||||
for _ in 0..16 {
|
||||
let s = possible_states.clone();
|
||||
let l = lower_bound.clone();
|
||||
handles.push(thread::spawn(move || check_states(s, l)));
|
||||
let v = valves.clone();
|
||||
let d = dists.clone();
|
||||
handles.push(thread::spawn(move || check_states(s, l, v, d)));
|
||||
}
|
||||
|
||||
for handle in handles {
|
||||
@ -36,8 +38,15 @@ pub fn main() {
|
||||
);
|
||||
}
|
||||
|
||||
pub fn check_states(possible_states: Arc<Mutex<Vec<day16::State>>>, lower_bound: Arc<AtomicUsize>) {
|
||||
pub fn check_states(
|
||||
possible_states: Arc<Mutex<Vec<day16::State>>>,
|
||||
lower_bound: Arc<AtomicUsize>,
|
||||
valves: Arc<Vec<day16::Valve>>,
|
||||
dists: Arc<Vec<Vec<usize>>>,
|
||||
) {
|
||||
let mut i = 0;
|
||||
loop {
|
||||
i += 1;
|
||||
let state = { possible_states.lock().unwrap().pop() };
|
||||
if state.is_none() {
|
||||
break;
|
||||
@ -45,14 +54,20 @@ pub fn check_states(possible_states: Arc<Mutex<Vec<day16::State>>>, lower_bound:
|
||||
let state = state.unwrap();
|
||||
if state.finished() {
|
||||
let score = state.lower_bound();
|
||||
dbg!(score);
|
||||
lower_bound.fetch_max(score, Ordering::Relaxed);
|
||||
} else {
|
||||
let x = state.possible_actions();
|
||||
let x = day16::possible_actions(&state, &valves, &dists);
|
||||
// let x = state.possible_actions(&valves, &dists);
|
||||
// let state_upper = state.upper_bound(&valves, &dists);
|
||||
for action in x {
|
||||
if action.upper_bound() > lower_bound.load(Ordering::Relaxed) {
|
||||
let action_upper = action.upper_bound(&valves, &dists);
|
||||
// assert!(action_upper <= state_upper);
|
||||
if action_upper > lower_bound.load(Ordering::Relaxed) {
|
||||
possible_states.lock().unwrap().push(action);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
dbg!(i);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user