diff --git a/src/gausse/optim/objective.py b/src/gausse/optim/objective.py index 551614c..e59f6cf 100644 --- a/src/gausse/optim/objective.py +++ b/src/gausse/optim/objective.py @@ -127,6 +127,8 @@ def build_detail(config, coilgun_result: CoilgunResult, db: ComponentDatabase, i "coil_center_position_m": coil_centers_m[i], "gap_before_stage_m": (config.inter_stage_gaps_m[i - 1] if i > 0 else None), "sensor_to_coil_distance_m": stage.sensor_to_coil_distance_m, + # абсолютная позиция ЭТОГО датчика вдоль трубы (у каждой катушки свой) + "sensor_position_m": coil_centers_m[i] - stage.sensor_to_coil_distance_m, "components": { "wire": stage.wire.part_id, "wire_material": stage.wire.material, diff --git a/src/gausse/optim/search_space.py b/src/gausse/optim/search_space.py index 1d79c04..d7060fe 100644 --- a/src/gausse/optim/search_space.py +++ b/src/gausse/optim/search_space.py @@ -140,10 +140,13 @@ def sample_genome(db: ComponentDatabase, bounds: SearchBounds, rng: random.Rando for _ in range(n_stages - 1) ] projectile = ProjectileGene(material_idx=material_idx, diameter_m=diameter_m, length_m=length_m) - return Genome( + genome = Genome( tube_inner_d_m=tube_inner_d_m, tube_wall_m=tube_wall_m, stages=stages, inter_stage_gaps_m=gaps, projectile=projectile, ) + # прогоняем через repair, чтобы применились все физические ограничения + # (в т.ч. датчик каждой ступени должен стоять в зазоре перед своей катушкой) + return repair(genome, db, bounds) def repair(genome: Genome, db: ComponentDatabase, bounds: SearchBounds) -> Genome: @@ -188,6 +191,15 @@ def repair(genome: Genome, db: ComponentDatabase, bounds: SearchBounds) -> Genom genome.inter_stage_gaps_m.append( (bounds.inter_stage_gap_m_min + bounds.inter_stage_gap_m_max) / 2 ) + # Датчик ступени i>0 должен стоять В ЗАЗОРЕ перед своей катушкой, а не + # залезать на предыдущую: расстояние датчик→катушка < зазор до пред.катушки. + # (у первой катушки датчик перед ней в свободном пространстве — без ограничения.) + for i in range(1, len(genome.stages)): + gap = genome.inter_stage_gaps_m[i - 1] + max_s2c = max(gap * 0.9, bounds.sensor_to_coil_distance_m_min) + genome.stages[i].sensor_to_coil_distance_m = min( + genome.stages[i].sensor_to_coil_distance_m, max_s2c + ) return genome