Added consideration of race position and gap to ahead cars
This commit is contained in:
@@ -17,15 +17,25 @@ def build_brainstorm_prompt_fast(
|
||||
latest = max(enriched_telemetry, key=lambda x: x.lap)
|
||||
pit_window = latest.optimal_pit_window
|
||||
|
||||
# Format position and competitive info
|
||||
position = race_context.driver_state.current_position
|
||||
gap_to_leader = race_context.driver_state.gap_to_leader
|
||||
gap_to_ahead = race_context.driver_state.gap_to_ahead
|
||||
comp_info = f"P{position}"
|
||||
if gap_to_ahead > 0:
|
||||
comp_info += f", {gap_to_ahead:.1f}s behind P{position-1}"
|
||||
if gap_to_leader > 0 and position > 1:
|
||||
comp_info += f", {gap_to_leader:.1f}s from leader"
|
||||
|
||||
if count == 1:
|
||||
# Ultra-fast mode: just generate 1 strategy
|
||||
return f"""Generate 1 F1 race strategy for {race_context.driver_state.driver_name} at {race_context.race_info.track_name}.
|
||||
|
||||
CURRENT: Lap {race_context.race_info.current_lap}/{race_context.race_info.total_laps}, P{race_context.driver_state.current_position}, {race_context.driver_state.current_tire_compound} tires ({race_context.driver_state.tire_age_laps} laps old)
|
||||
CURRENT: Lap {race_context.race_info.current_lap}/{race_context.race_info.total_laps}, {comp_info}, {race_context.driver_state.current_tire_compound} tires ({race_context.driver_state.tire_age_laps} laps old)
|
||||
|
||||
TELEMETRY: Tire deg rate {latest.tire_degradation_rate:.2f}, Cliff risk {latest.tire_cliff_risk:.2f}, Pace {latest.pace_trend}, Pit window laps {pit_window[0]}-{pit_window[1]}
|
||||
TELEMETRY: Tire deg {latest.tire_degradation_rate:.2f}, Cliff risk {latest.tire_cliff_risk:.2f}, Pace {latest.pace_trend}, Position trend {latest.position_trend}, Competitive pressure {latest.competitive_pressure:.2f}
|
||||
|
||||
Generate 1 optimal strategy. Min 2 tire compounds required.
|
||||
Generate 1 optimal strategy considering competitive position. Min 2 tire compounds required.
|
||||
|
||||
JSON: {{"strategies": [{{"strategy_id": 1, "strategy_name": "name", "stop_count": 1, "pit_laps": [32], "tire_sequence": ["medium", "hard"], "brief_description": "one sentence", "risk_level": "medium", "key_assumption": "main assumption"}}]}}"""
|
||||
|
||||
@@ -33,21 +43,25 @@ JSON: {{"strategies": [{{"strategy_id": 1, "strategy_name": "name", "stop_count"
|
||||
# Fast mode: 2-5 strategies with different approaches
|
||||
return f"""Generate {count} diverse F1 race strategies for {race_context.driver_state.driver_name} at {race_context.race_info.track_name}.
|
||||
|
||||
CURRENT: Lap {race_context.race_info.current_lap}/{race_context.race_info.total_laps}, P{race_context.driver_state.current_position}, {race_context.driver_state.current_tire_compound} tires ({race_context.driver_state.tire_age_laps} laps old)
|
||||
CURRENT: Lap {race_context.race_info.current_lap}/{race_context.race_info.total_laps}, {comp_info}, {race_context.driver_state.current_tire_compound} tires ({race_context.driver_state.tire_age_laps} laps old)
|
||||
|
||||
TELEMETRY: Tire deg {latest.tire_degradation_rate:.2f}, Cliff risk {latest.tire_cliff_risk:.2f}, Pace {latest.pace_trend}, Delta {latest.performance_delta:+.2f}s, Pit window {pit_window[0]}-{pit_window[1]}
|
||||
TELEMETRY: Tire deg {latest.tire_degradation_rate:.2f}, Cliff risk {latest.tire_cliff_risk:.2f}, Pace {latest.pace_trend}, Delta {latest.performance_delta:+.2f}s, Position trend {latest.position_trend}, Competitive pressure {latest.competitive_pressure:.2f}
|
||||
|
||||
Generate {count} strategies: conservative (1-stop), standard (1-2 stop), aggressive (undercut). Min 2 tire compounds each.
|
||||
COMPETITIVE SITUATION: Gap to ahead {gap_to_ahead:.1f}s ({"DRS RANGE - attack opportunity!" if gap_to_ahead < 1.0 else "close battle" if gap_to_ahead < 3.0 else "need to push"})
|
||||
|
||||
Generate {count} strategies balancing tire management with competitive pressure. Consider if aggressive undercut makes sense given gaps. Min 2 tire compounds each.
|
||||
|
||||
JSON: {{"strategies": [{{"strategy_id": 1, "strategy_name": "Conservative Stay Out", "stop_count": 1, "pit_laps": [35], "tire_sequence": ["medium", "hard"], "brief_description": "extend current stint then hard tires to end", "risk_level": "low", "key_assumption": "tire cliff risk stays below 0.7"}}]}}"""
|
||||
|
||||
return f"""Generate {count} F1 race strategies for {race_context.driver_state.driver_name} at {race_context.race_info.track_name}.
|
||||
|
||||
CURRENT: Lap {race_context.race_info.current_lap}/{race_context.race_info.total_laps}, P{race_context.driver_state.current_position}, {race_context.driver_state.current_tire_compound} tires ({race_context.driver_state.tire_age_laps} laps old)
|
||||
CURRENT: Lap {race_context.race_info.current_lap}/{race_context.race_info.total_laps}, {comp_info}, {race_context.driver_state.current_tire_compound} tires ({race_context.driver_state.tire_age_laps} laps old)
|
||||
|
||||
TELEMETRY: Tire deg rate {latest.tire_degradation_rate:.2f}, Cliff risk {latest.tire_cliff_risk:.2f}, Pace {latest.pace_trend}, Performance delta {latest.performance_delta:+.2f}s, Pit window laps {pit_window[0]}-{pit_window[1]}
|
||||
TELEMETRY: Tire deg {latest.tire_degradation_rate:.2f}, Cliff risk {latest.tire_cliff_risk:.2f}, Pace {latest.pace_trend}, Delta {latest.performance_delta:+.2f}s, Position trend {latest.position_trend}, Competitive pressure {latest.competitive_pressure:.2f}
|
||||
|
||||
Generate {count} diverse strategies. Min 2 compounds.
|
||||
COMPETITIVE: Gap ahead {gap_to_ahead:.1f}s, Position trending {latest.position_trend}
|
||||
|
||||
Generate {count} diverse strategies considering both tire management AND competitive positioning. Min 2 compounds.
|
||||
|
||||
JSON: {{"strategies": [{{"strategy_id": 1, "strategy_name": "name", "stop_count": 1, "pit_laps": [32], "tire_sequence": ["medium", "hard"], "brief_description": "one sentence", "risk_level": "low|medium|high|critical", "key_assumption": "main assumption"}}]}}"""
|
||||
|
||||
@@ -78,7 +92,9 @@ def build_brainstorm_prompt(
|
||||
"pace_trend": t.pace_trend,
|
||||
"tire_cliff_risk": round(t.tire_cliff_risk, 3),
|
||||
"optimal_pit_window": t.optimal_pit_window,
|
||||
"performance_delta": round(t.performance_delta, 2)
|
||||
"performance_delta": round(t.performance_delta, 2),
|
||||
"competitive_pressure": round(t.competitive_pressure, 3),
|
||||
"position_trend": t.position_trend
|
||||
})
|
||||
|
||||
# Format competitors
|
||||
@@ -92,12 +108,14 @@ def build_brainstorm_prompt(
|
||||
"gap_seconds": round(c.gap_seconds, 1)
|
||||
})
|
||||
|
||||
prompt = f"""You are an expert F1 strategist. Generate 20 diverse race strategies based on lap-level telemetry.
|
||||
prompt = f"""You are an expert F1 strategist. Generate 20 diverse race strategies based on lap-level telemetry AND competitive positioning.
|
||||
|
||||
LAP-LEVEL TELEMETRY METRICS:
|
||||
- tire_degradation_rate: 0-1 (higher = worse tire wear)
|
||||
- tire_cliff_risk: 0-1 (probability of hitting tire cliff)
|
||||
- pace_trend: "improving", "stable", or "declining"
|
||||
- position_trend: "gaining", "stable", or "losing" positions
|
||||
- competitive_pressure: 0-1 (combined metric from position and gaps)
|
||||
- optimal_pit_window: [start_lap, end_lap] recommended pit range
|
||||
- performance_delta: seconds vs baseline (negative = slower)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user