Add initial station generator
This commit is contained in:
parent
24b989b9f2
commit
c4a17d1792
9 changed files with 398 additions and 37 deletions
1
blueprints/electric_pole_connection.bp
Normal file
1
blueprints/electric_pole_connection.bp
Normal file
|
|
@ -0,0 +1 @@
|
|||
0eNqd0MEOgjAMANB/6bkQYU7dfoUQA9iYJmyQbaiE7N8dePCg8eClWbv1Le0CbT/R6NgG0AtwN1gPulrA89U2/VqzjSHQYOjCk8mopy447rJx6AkiAtsLPUAXsUYgGzgwvYQtmc92Mi259AB/Sgjj4FPzYNc/EyhyiTCDzopdkcsY8UMs/xVV+R0U/4KnwwqmBdzZbdNXBUosUdZYpYgindItBzIJf28c4UbOb6A8lGqvlJTidBRKxPgE1KeFBQ==
|
||||
|
|
@ -1,4 +1,6 @@
|
|||
use super::{common::PathField, Problem};
|
||||
use crate::blueprint::belt::{convert_to_blueprint, Beltspeed};
|
||||
use crate::blueprint::BlueprintEntity;
|
||||
use crate::{belt_finding::brute_force::BruteforceBuilder, misc::Map};
|
||||
use crate::{common::visualize::Visualize, prelude::*};
|
||||
use std::{
|
||||
|
|
@ -496,6 +498,15 @@ impl ConflictAvoidance {
|
|||
}
|
||||
true
|
||||
}
|
||||
|
||||
pub fn belt_blueprint(&self, speed: &Beltspeed, nextfree: &mut u32) -> Vec<BlueprintEntity> {
|
||||
let mut res = Vec::new();
|
||||
for path in &self.belts {
|
||||
res.extend(convert_to_blueprint(&path[1..], speed, nextfree));
|
||||
}
|
||||
|
||||
res
|
||||
}
|
||||
}
|
||||
|
||||
impl Visualize for ConflictAvoidance {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use clap::{Parser, Subcommand, ValueEnum};
|
||||
use factorio_blueprint::{
|
||||
belt_finding::{conflict_avoidance::ConflictAvoidance, problems, Problem},
|
||||
blueprint::{Blueprint, BlueprintString},
|
||||
common::visualize::Visualize,
|
||||
};
|
||||
use std::{io, path::PathBuf};
|
||||
|
|
@ -46,6 +47,26 @@ struct Args {
|
|||
problem: ProblemCase,
|
||||
}
|
||||
|
||||
fn output_blueprint(conflict: &ConflictAvoidance) {
|
||||
let mut offset = 0;
|
||||
let belts = conflict.belt_blueprint(
|
||||
&factorio_blueprint::blueprint::belt::Beltspeed::Normal,
|
||||
&mut offset,
|
||||
);
|
||||
|
||||
let bp = BlueprintString::Blueprint(
|
||||
Blueprint::builder()
|
||||
.entities(belts)
|
||||
.label(format!("test"))
|
||||
.build(),
|
||||
);
|
||||
|
||||
println!(
|
||||
"{}",
|
||||
factorio_blueprint::blueprint::encode(&serde_json::to_string(&bp).unwrap())
|
||||
);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args = Args::parse();
|
||||
|
||||
|
|
@ -67,6 +88,7 @@ fn main() {
|
|||
while c.remove_conflict(None) {
|
||||
c.print_visualization();
|
||||
}
|
||||
output_blueprint(&c);
|
||||
}
|
||||
Mode::ConflictStep => {
|
||||
p.print_visualization();
|
||||
|
|
@ -79,6 +101,7 @@ fn main() {
|
|||
let mut s = String::new();
|
||||
let _ = io::stdin().read_line(&mut s);
|
||||
}
|
||||
output_blueprint(&c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
12
src/bin/station.rs
Normal file
12
src/bin/station.rs
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
use factorio_blueprint::blueprint::{station::basic_unload_station, BlueprintString};
|
||||
|
||||
fn main() {
|
||||
let b = BlueprintString::Blueprint(basic_unload_station());
|
||||
|
||||
println!("{}", serde_json::to_string_pretty(&b).unwrap());
|
||||
|
||||
println!(
|
||||
"{}",
|
||||
factorio_blueprint::blueprint::encode(&serde_json::to_string(&b).unwrap())
|
||||
);
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ pub enum Beltspeed {
|
|||
}
|
||||
|
||||
impl Beltspeed {
|
||||
fn string(&self) -> String {
|
||||
pub fn string(&self) -> String {
|
||||
match self {
|
||||
Beltspeed::Normal => "transport-belt",
|
||||
Beltspeed::Fast => "fast-transport-belt",
|
||||
|
|
@ -20,7 +20,7 @@ impl Beltspeed {
|
|||
.to_owned()
|
||||
}
|
||||
|
||||
fn string_underground(&self) -> String {
|
||||
pub fn string_underground(&self) -> String {
|
||||
match self {
|
||||
Beltspeed::Normal => "underground-belt",
|
||||
Beltspeed::Fast => "fast-underground-belt",
|
||||
|
|
@ -29,6 +29,25 @@ impl Beltspeed {
|
|||
}
|
||||
.to_owned()
|
||||
}
|
||||
|
||||
pub fn string_splitter(&self) -> String {
|
||||
match self {
|
||||
Beltspeed::Normal => "splitter",
|
||||
Beltspeed::Fast => "fast-splitter",
|
||||
Beltspeed::Express => "express-splitter",
|
||||
Beltspeed::Turbo => "turbo-splitter",
|
||||
}
|
||||
.to_owned()
|
||||
}
|
||||
|
||||
pub fn halve(&self) -> Self {
|
||||
match self {
|
||||
Beltspeed::Normal => Beltspeed::Normal,
|
||||
Beltspeed::Fast => Beltspeed::Normal,
|
||||
Beltspeed::Express => Beltspeed::Fast,
|
||||
Beltspeed::Turbo => Beltspeed::Fast,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn convert_belt_to_blueprint(
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ pub use structs::*;
|
|||
|
||||
pub mod balancer;
|
||||
pub mod belt;
|
||||
pub mod station;
|
||||
pub mod train;
|
||||
|
||||
pub fn decode(s: &str) -> String {
|
||||
|
|
|
|||
290
src/blueprint/station.rs
Normal file
290
src/blueprint/station.rs
Normal file
|
|
@ -0,0 +1,290 @@
|
|||
use std::sync::Arc;
|
||||
|
||||
use super::{belt::Beltspeed, Blueprint, BlueprintEntity, BlueprintPosition};
|
||||
|
||||
pub fn station_unload(
|
||||
length: usize,
|
||||
locomotives: usize,
|
||||
unloader: &Vec<BlueprintEntity>,
|
||||
beltspeed: Beltspeed,
|
||||
double: bool,
|
||||
output_x: f64,
|
||||
output_y: f64,
|
||||
) -> Blueprint {
|
||||
assert!(length.is_power_of_two());
|
||||
|
||||
let mut e = Vec::new();
|
||||
|
||||
let global_x_offset = locomotives * 7;
|
||||
|
||||
for l in 1..=(length + locomotives) {
|
||||
e.push(
|
||||
BlueprintEntity::builder(
|
||||
"medium-electric-pole".to_owned(),
|
||||
l as u32 - 1,
|
||||
BlueprintPosition::new((7 * l) as f64 + 0.5, -1.5),
|
||||
)
|
||||
.build(),
|
||||
);
|
||||
}
|
||||
|
||||
let offset = e.len();
|
||||
for l in 0..length {
|
||||
e.extend(unloader.iter().cloned().map(|mut e| {
|
||||
e.position.x += (7 * l + global_x_offset) as f64;
|
||||
e.entity_number += (offset + unloader.len() * l) as u32;
|
||||
e
|
||||
}));
|
||||
}
|
||||
|
||||
let offset = e.len();
|
||||
e.push(
|
||||
BlueprintEntity::builder(
|
||||
"train-stop".to_owned(),
|
||||
offset as u32,
|
||||
BlueprintPosition::new(1.0, -1.0),
|
||||
)
|
||||
.direction(12)
|
||||
.build(),
|
||||
);
|
||||
|
||||
for l in 0..((length * 7 + global_x_offset + 1) / 2) {
|
||||
let offset = e.len() as u32;
|
||||
e.push(
|
||||
BlueprintEntity::builder(
|
||||
"straight-rail".to_owned(),
|
||||
offset,
|
||||
BlueprintPosition::new(2.0 * l as f64 + 1.0, 1.0),
|
||||
)
|
||||
.direction(4)
|
||||
.build(),
|
||||
);
|
||||
}
|
||||
|
||||
for i in 0..length {
|
||||
let depth = (i / 2).count_ones();
|
||||
|
||||
for j in 0..depth {
|
||||
let offset = e.len() as u32;
|
||||
e.push(
|
||||
BlueprintEntity::builder(
|
||||
beltspeed.string(),
|
||||
offset,
|
||||
BlueprintPosition::new(
|
||||
(7 * i + global_x_offset) as f64 + output_x,
|
||||
output_y - j as f64,
|
||||
),
|
||||
)
|
||||
.build(),
|
||||
);
|
||||
}
|
||||
|
||||
if i % 2 == 0 {
|
||||
let offset = e.len() as u32;
|
||||
e.push(
|
||||
BlueprintEntity::builder(
|
||||
beltspeed.string(),
|
||||
offset,
|
||||
BlueprintPosition::new(
|
||||
(7 * i + global_x_offset) as f64 + output_x,
|
||||
output_y - depth as f64,
|
||||
),
|
||||
)
|
||||
.direction(12)
|
||||
.build(),
|
||||
);
|
||||
let offset = e.len() as u32;
|
||||
e.push(
|
||||
BlueprintEntity::builder(
|
||||
beltspeed.string_splitter(),
|
||||
offset,
|
||||
BlueprintPosition::new(
|
||||
(7 * i + global_x_offset) as f64 + output_x - 1.0,
|
||||
output_y - depth as f64 - 0.5,
|
||||
),
|
||||
)
|
||||
.direction(12)
|
||||
.build(),
|
||||
);
|
||||
} else {
|
||||
let offset = e.len() as u32;
|
||||
e.extend((0..=7).map(|j| {
|
||||
BlueprintEntity::builder(
|
||||
beltspeed.string(),
|
||||
offset + j as u32,
|
||||
BlueprintPosition::new(
|
||||
(7 * i - j + global_x_offset) as f64 + output_x,
|
||||
output_y - depth as f64 - 1.0,
|
||||
),
|
||||
)
|
||||
.direction(12)
|
||||
.build()
|
||||
}));
|
||||
let offset = e.len() as u32;
|
||||
e.push(
|
||||
BlueprintEntity::builder(
|
||||
beltspeed.string(),
|
||||
offset,
|
||||
BlueprintPosition::new(
|
||||
(7 * i + global_x_offset) as f64 + output_x,
|
||||
output_y - depth as f64,
|
||||
),
|
||||
)
|
||||
.build(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
for i in 2..(length.ilog2() as usize + 1) {
|
||||
let p = 1 << i;
|
||||
for j in 0..(length / p) {
|
||||
let depth = j.count_ones();
|
||||
let offset = e.len() as u32;
|
||||
e.push(
|
||||
BlueprintEntity::builder(
|
||||
beltspeed.string_splitter(),
|
||||
offset,
|
||||
BlueprintPosition::new(
|
||||
(7 * j * p + global_x_offset) as f64 - i as f64 + output_x,
|
||||
output_y - i as f64 + 0.5 - depth as f64,
|
||||
),
|
||||
)
|
||||
.direction(12)
|
||||
.build(),
|
||||
);
|
||||
e.extend((0..(7 * p / 2)).map(|l| {
|
||||
BlueprintEntity::builder(
|
||||
beltspeed.string(),
|
||||
offset + l as u32,
|
||||
BlueprintPosition::new(
|
||||
(7 * j * p + global_x_offset) as f64 - i as f64 + output_x + l as f64 + 1.0,
|
||||
output_y - i as f64 - depth as f64,
|
||||
),
|
||||
)
|
||||
.direction(12)
|
||||
.build()
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
Blueprint::builder()
|
||||
.label("station".to_owned())
|
||||
.entities(e)
|
||||
.wires(
|
||||
(0..((length + locomotives - 1) as u32))
|
||||
.map(|i| [i, 5, i + 1, 5])
|
||||
.collect(),
|
||||
)
|
||||
.build()
|
||||
}
|
||||
|
||||
pub fn basic_unload_station() -> Blueprint {
|
||||
let top = vec![
|
||||
BlueprintEntity::builder(
|
||||
"steel-chest".to_owned(),
|
||||
0,
|
||||
BlueprintPosition::new(1.5, -1.5),
|
||||
)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"bulk-inserter".to_owned(),
|
||||
1,
|
||||
BlueprintPosition::new(1.5, -0.5),
|
||||
)
|
||||
.direction(8)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"fast-inserter".to_owned(),
|
||||
2,
|
||||
BlueprintPosition::new(2.5, -1.5),
|
||||
)
|
||||
.direction(12)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"fast-transport-belt".to_owned(),
|
||||
3,
|
||||
BlueprintPosition::new(3.5, -1.5),
|
||||
)
|
||||
.build(),
|
||||
];
|
||||
|
||||
let bottom = vec![
|
||||
BlueprintEntity::builder(
|
||||
"steel-chest".to_owned(),
|
||||
0,
|
||||
BlueprintPosition::new(1.5, -1.5),
|
||||
)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"bulk-inserter".to_owned(),
|
||||
1,
|
||||
BlueprintPosition::new(1.5, -0.5),
|
||||
)
|
||||
.direction(8)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"fast-inserter".to_owned(),
|
||||
2,
|
||||
BlueprintPosition::new(2.5, -1.5),
|
||||
)
|
||||
.direction(12)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"fast-transport-belt".to_owned(),
|
||||
3,
|
||||
BlueprintPosition::new(3.5, -1.5),
|
||||
)
|
||||
.build(),
|
||||
];
|
||||
|
||||
let full = vec![
|
||||
BlueprintEntity::builder(
|
||||
"steel-chest".to_owned(),
|
||||
0,
|
||||
BlueprintPosition::new(1.5, -1.5),
|
||||
)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"bulk-inserter".to_owned(),
|
||||
1,
|
||||
BlueprintPosition::new(1.5, -0.5),
|
||||
)
|
||||
.direction(8)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"fast-inserter".to_owned(),
|
||||
2,
|
||||
BlueprintPosition::new(2.5, -1.5),
|
||||
)
|
||||
.direction(12)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"steel-chest".to_owned(),
|
||||
0,
|
||||
BlueprintPosition::new(5.5, -1.5),
|
||||
)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"bulk-inserter".to_owned(),
|
||||
1,
|
||||
BlueprintPosition::new(5.5, -0.5),
|
||||
)
|
||||
.direction(8)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"fast-inserter".to_owned(),
|
||||
2,
|
||||
BlueprintPosition::new(4.5, -1.5),
|
||||
)
|
||||
.direction(4)
|
||||
.build(),
|
||||
BlueprintEntity::builder(
|
||||
"fast-transport-belt".to_owned(),
|
||||
3,
|
||||
BlueprintPosition::new(3.5, -1.5),
|
||||
)
|
||||
.build(),
|
||||
];
|
||||
|
||||
station_unload(64, 3, &full, Beltspeed::Normal, false, 3.5, -2.5)
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ const fn calculate_version(major: u16, minor: u16, patch: u16, dev: u16) -> u64
|
|||
((major as u64) << 48) | ((minor as u64) << 32) | ((patch as u64) << 16) | (dev as u64)
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub enum BlueprintString {
|
||||
#[serde(rename = "blueprint_book")]
|
||||
BlueprintBook(BlueprintBook),
|
||||
|
|
@ -18,7 +18,7 @@ pub enum BlueprintString {
|
|||
Blueprint(Blueprint),
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Builder)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Builder)]
|
||||
pub struct BlueprintBook {
|
||||
#[builder(skip = "blueprint-book".to_owned())]
|
||||
item: String,
|
||||
|
|
@ -32,7 +32,7 @@ pub struct BlueprintBook {
|
|||
version: u64,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintBookEntry {
|
||||
#[serde(flatten)]
|
||||
entry: BlueprintString,
|
||||
|
|
@ -45,7 +45,7 @@ impl BlueprintBookEntry {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Builder)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Builder)]
|
||||
pub struct Blueprint {
|
||||
#[builder(skip = "blueprint".to_owned())]
|
||||
item: String,
|
||||
|
|
@ -75,11 +75,14 @@ pub struct Blueprint {
|
|||
absolute_snapping: Option<bool>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
position_relative_to_grid: Option<BlueprintPosition>,
|
||||
#[serde(default, skip_serializing_if = "Vec::is_empty")]
|
||||
#[builder(default)]
|
||||
wires: Vec<[u32; 4]>,
|
||||
#[builder(skip = VERSION)]
|
||||
version: u64,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Builder)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Builder)]
|
||||
pub struct BlueprintStockConnection {
|
||||
#[builder(start_fn)]
|
||||
stock: u32,
|
||||
|
|
@ -89,14 +92,14 @@ pub struct BlueprintStockConnection {
|
|||
back: Option<u32>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Builder)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Builder)]
|
||||
pub struct BlueprintEntity {
|
||||
#[builder(start_fn)]
|
||||
name: String,
|
||||
#[builder(start_fn)]
|
||||
entity_number: u32,
|
||||
pub entity_number: u32,
|
||||
#[builder(start_fn)]
|
||||
position: BlueprintPosition,
|
||||
pub position: BlueprintPosition,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
direction: Option<u8>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
|
|
@ -159,7 +162,7 @@ pub struct BlueprintEntity {
|
|||
tags: Option<serde_json::Value>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintItemRequest {
|
||||
id: BlueprintItemID,
|
||||
items: BlueprintItem,
|
||||
|
|
@ -176,18 +179,18 @@ impl BlueprintItemRequest {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Builder)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Builder)]
|
||||
pub struct BlueprintItemID {
|
||||
#[builder(start_fn)]
|
||||
name: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintItem {
|
||||
in_inventory: Vec<BlueprintInventoryLocation>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintInventoryLocation {
|
||||
count: u32,
|
||||
inventory: u32,
|
||||
|
|
@ -204,13 +207,13 @@ impl BlueprintInventoryLocation {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintInventory {
|
||||
filters: Vec<BlueprintItemFilter>,
|
||||
bar: u16,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintConnection {
|
||||
#[serde(rename = "1")]
|
||||
first: Option<BlueprintConnectionPoint>,
|
||||
|
|
@ -218,7 +221,7 @@ pub struct BlueprintConnection {
|
|||
second: Option<BlueprintConnectionPoint>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintConnectionPoint {
|
||||
#[serde(default)]
|
||||
red: Vec<BlueprintConnectionData>,
|
||||
|
|
@ -226,33 +229,33 @@ pub struct BlueprintConnectionPoint {
|
|||
green: Vec<BlueprintConnectionData>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Copy)]
|
||||
pub struct BlueprintConnectionData {
|
||||
entity_id: u64,
|
||||
circuit_id: Option<u64>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintItemFilter {
|
||||
name: String,
|
||||
index: u32,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintLogisticFilter {
|
||||
name: String,
|
||||
index: u32,
|
||||
count: u32,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintSpeakerParameter {
|
||||
playback_volume: f64,
|
||||
playback_globally: bool,
|
||||
allow_polyphony: bool,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintSpeakerAlertParameter {
|
||||
show_alert: bool,
|
||||
show_on_map: bool,
|
||||
|
|
@ -260,17 +263,17 @@ pub struct BlueprintSpeakerAlertParameter {
|
|||
alert_message: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintSignalID {
|
||||
name: String,
|
||||
#[serde(rename = "type")]
|
||||
signal_type: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, Copy)]
|
||||
pub struct BlueprintPosition {
|
||||
x: f64,
|
||||
y: f64,
|
||||
pub x: f64,
|
||||
pub y: f64,
|
||||
}
|
||||
|
||||
impl BlueprintPosition {
|
||||
|
|
@ -279,19 +282,19 @@ impl BlueprintPosition {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintIcon {
|
||||
index: u32,
|
||||
signal: BlueprintSignalID,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintTile {
|
||||
name: String,
|
||||
position: BlueprintPosition,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct BlueprintColor {
|
||||
r: f32,
|
||||
g: f32,
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ pub fn genetic_algorithm2<'a, R: Rng + ?Sized>(
|
|||
problem: &'a Problem,
|
||||
new_layouts: usize,
|
||||
mutation_timeout: usize,
|
||||
max_mutations: usize,
|
||||
rng: &'_ mut R,
|
||||
) -> PathLayout<'a> {
|
||||
let mut m = (0..new_layouts)
|
||||
|
|
@ -119,19 +120,19 @@ pub fn genetic_algorithm2<'a, R: Rng + ?Sized>(
|
|||
.min_by_key(|p| p.score())
|
||||
.unwrap();
|
||||
|
||||
m.print_visualization();
|
||||
// m.print_visualization();
|
||||
|
||||
let mut last_improvement = 0;
|
||||
let mut count = 0;
|
||||
|
||||
while last_improvement < mutation_timeout {
|
||||
while last_improvement < mutation_timeout && count < max_mutations {
|
||||
last_improvement += 1;
|
||||
count += 1;
|
||||
if let Some(p) = PathLayout::new(m.layout.mutate(rng)) {
|
||||
if p.score() < m.score() {
|
||||
m = p;
|
||||
println!("Step: {count}");
|
||||
m.print_visualization();
|
||||
// println!("Step: {count}");
|
||||
// m.print_visualization();
|
||||
last_improvement = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -207,15 +208,15 @@ impl<'a> PathLayout<'a> {
|
|||
|
||||
if !c.remove_all_conflicts(Some(std::time::Duration::from_secs(2))) {
|
||||
if start.elapsed().as_secs_f32() > 0.5 {
|
||||
println!("Conflict avoidance: {:.2}", start.elapsed().as_secs_f32());
|
||||
c.print_visualization();
|
||||
// println!("Conflict avoidance: {:.2}", start.elapsed().as_secs_f32());
|
||||
// c.print_visualization();
|
||||
let file = std::fs::File::create(format!(
|
||||
"out/{}.json",
|
||||
OUTFILEINDEX.fetch_add(1, std::sync::atomic::Ordering::Relaxed)
|
||||
))
|
||||
.unwrap();
|
||||
serde_json::to_writer(file, &p).unwrap();
|
||||
println!("Saved slow solve.");
|
||||
// println!("Saved slow solve.");
|
||||
}
|
||||
return None;
|
||||
}
|
||||
|
|
@ -419,7 +420,7 @@ impl Layout<'_> {
|
|||
loop {
|
||||
let p = r.choose_weighted(rng, |i| i.1).unwrap();
|
||||
|
||||
if p.0(&mut s, rng) && rng.gen_bool(0.2) {
|
||||
if p.0(&mut s, rng) && rng.gen_bool(0.5) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue