Use connected set cover for roboports

This commit is contained in:
hal8174 2025-03-21 00:11:14 +01:00
parent caea696dd7
commit a748708998
7 changed files with 204 additions and 4 deletions

View file

@ -1,12 +1,32 @@
use factorio_core::{misc::PositionMap, prelude::Position};
use factorio_graph::{
priority_queue::binary_heap::FastBinaryHeap, set_cover::greedy_set_cover_priority_queue,
graph::Graph,
priority_queue::binary_heap::FastBinaryHeap,
set_cover::{greedy_connected_set_cover_priority_queue, greedy_set_cover_priority_queue},
};
use crate::abstraction::Entity;
use super::Blueprint;
struct RoboportGraph<'a> {
roboports: &'a [Position],
}
impl Graph for RoboportGraph<'_> {
type Node = usize;
fn edge(&self, node: &Self::Node, num: usize) -> Option<Self::Node> {
let p = self.roboports[*node];
self.roboports
.iter()
.enumerate()
.filter(|(_, other)| p.x.abs_diff(other.x) <= 100 && p.y.abs_diff(other.y) <= 100)
.nth(num)
.map(|(i, _)| i)
}
}
impl Blueprint {
pub fn add_roboport_network(&mut self) {
let aabb = self.get_aabb().unwrap();
@ -41,7 +61,13 @@ impl Blueprint {
}
dbg!(universe, sets.len());
let res = greedy_set_cover_priority_queue::<_, FastBinaryHeap<_>>(universe, &sets);
let res = greedy_connected_set_cover_priority_queue::<_, _, FastBinaryHeap<_>>(
universe,
&sets,
RoboportGraph {
roboports: &roboports,
},
);
for r in res {
self.add_entity(Entity::new_roboport(roboports[r]));