Use connected set cover for roboports
This commit is contained in:
parent
caea696dd7
commit
a748708998
7 changed files with 204 additions and 4 deletions
|
|
@ -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]));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue