综合python案例,空中对抗优势在哪队?

wen python案例 2

本文目录导读:

综合python案例,空中对抗优势在哪队?

  1. 空中对抗模拟系统
  2. 运行效果示例
  3. 项目特点

我来设计一个综合的Python案例,模拟空中对抗(比如空战)的结果预测,这个案例将包含多个模块,展示Python的综合应用能力。

空中对抗模拟系统

"""
空中对抗模拟系统
功能:
1. 战机数据管理
2. 战术策略选择
3. 空战模拟引擎
4. 胜率预测与可视化
"""
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from dataclasses import dataclass
from typing import List, Dict, Tuple
import seaborn as sns
# ==================== 数据定义 ====================
@dataclass
class Fighter:
    """战机类"""
    name: str
    country: str
    max_speed_kmh: float      # 最大速度(km/h)
    climb_rate: float         # 爬升率(m/s)
    maneuverability: int      # 机动性(1-10)
    radar_range_km: float     # 雷达范围(km)
    missile_range_km: float   # 导弹射程(km)
    stealth_level: int        # 隐身能力(1-10)
    electronic_warfare: int   # 电子战能力(1-10)
    weapon_load: int          # 武器载荷(kg)
    def calculate_combat_score(self) -> float:
        """计算综合战斗力评分"""
        score = (
            self.max_speed_kmh / 2000 * 10 +
            self.climb_rate / 300 * 10 +
            self.maneuverability * 2 +
            self.radar_range_km / 200 * 10 +
            self.missile_range_km / 100 * 10 +
            self.stealth_level * 2 +
            self.electronic_warfare * 1.5 +
            self.weapon_load / 1000 * 5
        ) / 8  # 标准化
        return score
@dataclass
class Squadron:
    """空军中队类"""
    name: str
    country: str
    fighters: List[Fighter]
    tactical_doctrine: str  # 战术理念
    def get_average_score(self) -> float:
        """计算中队平均战斗力"""
        if not self.fighters:
            return 0
        return np.mean([f.calculate_combat_score() for f in self.fighters])
    def get_fleet_summary(self) -> Dict:
        """获取舰队概况"""
        return {
            'total_fighters': len(self.fighters),
            'avg_speed': np.mean([f.max_speed_kmh for f in self.fighters]),
            'avg_maneuver': np.mean([f.maneuverability for f in self.fighters]),
            'avg_stealth': np.mean([f.stealth_level for f in self.fighters]),
            'total_weapon_load': sum([f.weapon_load for f in self.fighters])
        }
# ==================== 战术模块 ====================
class TacticalStrategy:
    """战术策略类"""
    @staticmethod
    def offensive_advantage(squadron: Squadron) -> float:
        """进攻型优势加成"""
        summary = squadron.get_fleet_summary()
        offense = (
            summary['total_weapon_load'] / 1000 * 0.3 +
            summary['avg_maneuver'] * 0.2 +
            summary['avg_speed'] / 500
        )
        return offense
    @staticmethod
    def defensive_advantage(squadron: Squadron) -> float:
        """防守型优势加成"""
        summary = squadron.get_fleet_summary()
        defense = (
            summary['avg_stealth'] * 0.4 +
            summary['total_fighters'] * 0.2
        )
        return defense
    @staticmethod
    def balanced_advantage(squadron: Squadron) -> float:
        """平衡型优势加成"""
        summary = squadron.get_fleet_summary()
        balance = (
            summary['avg_maneuver'] * 0.15 +
            summary['avg_stealth'] * 0.15 +
            summary['total_fighters'] * 0.1 +
            summary['avg_speed'] / 1000
        )
        return balance
# ==================== 模拟引擎 ====================
class AirCombatSimulator:
    """空战模拟引擎"""
    def __init__(self, red_squadron: Squadron, blue_squadron: Squadron):
        self.red = red_squadron
        self.blue = blue_squadron
    def simulate_battle(self, num_runs: int = 1000) -> Dict:
        """模拟多场空战"""
        results = []
        for _ in range(num_runs):
            red_score = self.calculate_side_advantage(self.red)
            blue_score = self.calculate_side_advantage(self.blue)
            # 加入随机因素
            red_actual = red_score * np.random.normal(1, 0.15)
            blue_actual = blue_score * np.random.normal(1, 0.15)
            if red_actual > blue_actual:
                results.append('red')
            elif blue_actual > red_actual:
                results.append('blue')
            else:
                results.append('draw')
        # 统计结果
        red_wins = results.count('red')
        blue_wins = results.count('blue')
        draws = results.count('draw')
        return {
            'red_wins': red_wins,
            'blue_wins': blue_wins,
            'draws': draws,
            'red_win_rate': red_wins / num_runs * 100,
            'blue_win_rate': blue_wins / num_runs * 100
        }
    def calculate_side_advantage(self, squadron: Squadron) -> float:
        """计算单方优势"""
        base_score = squadron.get_average_score()
        # 根据战术选择加成
        doctrine_bonus = {
            'offensive': TacticalStrategy.offensive_advantage(squadron),
            'defensive': TacticalStrategy.defensive_advantage(squadron),
            'balanced': TacticalStrategy.balanced_advantage(squadron)
        }.get(squadron.tactical_doctrine, 0)
        return base_score + doctrine_bonus
    def monte_carlo_analysis(self, num_runs: int = 10000) -> pd.DataFrame:
        """蒙特卡洛模拟分析"""
        results = []
        for run in range(num_runs):
            red_score = self.calculate_side_advantage(self.red)
            blue_score = self.calculate_side_advantage(self.blue)
            # 加入更多随机变数
            red_actual = red_score * np.random.normal(1, 0.1)
            blue_actual = blue_score * np.random.normal(1, 0.1)
            difference = red_actual - blue_actual
            results.append({
                'run': run,
                'red_score': red_actual,
                'blue_score': blue_actual,
                'difference': difference
            })
        return pd.DataFrame(results)
    def optimize_strategy(self) -> Dict[str, str]:
        """寻找最优战术"""
        strategies = ['offensive', 'defensive', 'balanced']
        best_red = None
        best_blue = None
        best_diff = -np.inf
        for red_strat in strategies:
            for blue_strat in strategies:
                self.red.tactical_doctrine = red_strat
                self.blue.tactical_doctrine = blue_strat
                results = self.simulate_battle(1000)
                diff = results['red_win_rate'] - results['blue_win_rate']
                if diff > best_diff:
                    best_diff = diff
                    best_red = red_strat
                    best_blue = blue_strat
        return {
            'best_red_strategy': best_red,
            'best_blue_strategy': best_blue,
            'max_advantage': best_diff
        }
# ==================== 可视化模块 ====================
class Visualizer:
    """可视化类"""
    @staticmethod
    def plot_combat_results(results: Dict):
        """绘制战斗结果柱状图"""
        fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
        # 左图:获胜次数
        bars = ax1.bar(['红方', '蓝方', '平局'], 
                      [results['red_wins'], results['blue_wins'], results['draws']],
                      color=['red', 'blue', 'gray'])
        ax1.set_title('1000场空战模拟结果')
        ax1.set_ylabel('获胜次数')
        # 添加数值标签
        for bar in bars:
            height = bar.get_height()
            ax1.text(bar.get_x() + bar.get_width()/2., height,
                    f'{int(height)}', ha='center', va='bottom')
        # 右图:获胜概率
        labels = ['红方', '蓝方']
        sizes = [results['red_win_rate'], results['blue_win_rate']]
        colors = ['lightcoral', 'lightskyblue']
        ax2.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%',
                startangle=90, explode=(0.05, 0))
        ax2.set_title('获胜概率分布')
        plt.tight_layout()
        plt.show()
    @staticmethod
    def plot_monte_carlo(df: pd.DataFrame):
        """绘制蒙特卡洛模拟分布"""
        fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
        # 左图:得分分布
        ax1.hist(df['red_score'], alpha=0.5, label='红方', color='red', bins=50)
        ax1.hist(df['blue_score'], alpha=0.5, label='蓝方', color='blue', bins=50)
        ax1.set_title('双方战斗力得分分布')
        ax1.set_xlabel('战斗力得分')
        ax1.set_ylabel('频次')
        ax1.legend()
        # 右图:优势差值分布
        ax2.hist(df['difference'], bins=50, color='green', alpha=0.7)
        ax2.axvline(x=0, color='black', linestyle='--', label='均势线')
        ax2.set_title('红方相对优势分布')
        ax2.set_xlabel('优势值(红-蓝)')
        ax2.set_ylabel('频次')
        ax2.legend()
        plt.tight_layout()
        plt.show()
    @staticmethod
    def plot_squadron_comparison(squadrons: List[Squadron]):
        """绘制编队对比雷达图"""
        fig, ax = plt.subplots(figsize=(8, 8))
        categories = ['速度', '爬升率', '机动性', '雷达', '导弹', '隐身', '电子战', '载荷']
        N = len(categories)
        angles = [n / float(N) * 2 * np.pi for n in range(N)]
        angles += angles[:1]
        ax = plt.subplot(111, polar=True)
        for squadron in squadrons:
            summary = squadron.get_fleet_summary()
            # 归一化数据
            values = [
                summary['avg_speed'] / 2000,
                np.mean([f.climb_rate for f in squadron.fighters]) / 300,
                summary['avg_maneuver'] / 10,
                np.mean([f.radar_range_km for f in squadron.fighters]) / 200,
                np.mean([f.missile_range_km for f in squadron.fighters]) / 100,
                summary['avg_stealth'] / 10,
                np.mean([f.electronic_warfare for f in squadron.fighters]) / 10,
                summary['total_weapon_load'] / 10000
            ]
            values += values[:1]
            ax.plot(angles, values, linewidth=2, linestyle='solid', label=squadron.name)
            ax.fill(angles, values, alpha=0.3)
        ax.set_xticks(angles[:-1])
        ax.set_xticklabels(categories)
        ax.legend(loc='upper right', bbox_to_anchor=(1.1, 1.1))
        ax.set_title('编队能力对比', size=14)
        plt.show()
# ==================== 主程序 ====================
def main():
    """主函数"""
    print("=" * 60)
    print("空中对抗优势分析系统")
    print("=" * 60)
    # 创建红方战机(假设为某国)
    red_fighters = [
        Fighter("J-20A", "China", 2100, 280, 9, 180, 120, 9, 9, 1500),
        Fighter("J-16", "China", 1850, 250, 8, 160, 100, 7, 8, 1000),
        Fighter("J-10C", "China", 1700, 230, 8, 140, 80, 6, 7, 800),
        Fighter("J-15", "China", 1750, 220, 7, 150, 90, 6, 7, 900),
        Fighter("Su-35", "China", 2000, 260, 8, 170, 110, 6, 8, 1200),
    ]
    red_squadron = Squadron(
        name="红方联合空军",
        country="中国",
        fighters=red_fighters,
        tactical_doctrine="balanced"
    )
    # 创建蓝方战机(假设为对手)
    blue_fighters = [
        Fighter("F-22", "USA", 2400, 300, 9, 200, 150, 10, 9, 1200),
        Fighter("F-35", "USA", 1900, 240, 8, 170, 130, 10, 9, 1000),
        Fighter("F-15EX", "USA", 1900, 260, 7, 180, 120, 6, 8, 1300),
        Fighter("F/A-18E", "USA", 1800, 230, 8, 150, 100, 6, 7, 900),
        Fighter("Rafale", "France", 1800, 240, 8, 160, 110, 7, 8, 950),
    ]
    blue_squadron = Squadron(
        name="蓝方联合空军",
        country="美国",
        fighters=blue_fighters,
        tactical_doctrine="defensive"
    )
    # 打印编队信息
    for squadron in [red_squadron, blue_squadron]:
        print(f"\n{squadron.name} ({squadron.country})")
        print(f"- 战机数量: {len(squadron.fighters)}")
        print(f"- 平均战斗评分: {squadron.get_average_score():.2f}")
        print(f"- 战术理念: {squadron.tactical_doctrine}")
        summary = squadron.get_fleet_summary()
        print(f"- 平均速度: {summary['avg_speed']:.0f} km/h")
        print(f"- 总武器载荷: {summary['total_weapon_load']:.0f} kg")
        # 列出主要装备
        print(f"- 主要装备:")
        for fighter in squadron.fighters:
            print(f"  ◦ {fighter.name} (评分: {fighter.calculate_combat_score():.1f})")
    # 创建模拟器
    simulator = AirCombatSimulator(red_squadron, blue_squadron)
    # 进行基本模拟
    print("\n" + "=" * 60)
    print("开始1000场空战模拟...")
    results = simulator.simulate_battle(1000)
    print(f"红方获胜: {results['red_wins']} 场 ({results['red_win_rate']:.1f}%)")
    print(f"蓝方获胜: {results['blue_wins']} 场 ({results['blue_win_rate']:.1f}%)")
    print(f"平局: {results['draws']} 场")
    # 蒙特卡洛分析
    print("\n执行蒙特卡洛分析...")
    mc_df = simulator.monte_carlo_analysis(10000)
    # 战术优化
    print("\n寻找最优战术...")
    optimal = simulator.optimize_strategy()
    print(f"最优红方战术: {optimal['best_red_strategy']}")
    print(f"最优蓝方战术: {optimal['best_blue_strategy']}")
    print(f"最大优势: {optimal['max_advantage']:.2f}%")
    # 可视化
    visualizer = Visualizer()
    visualizer.plot_combat_results(results)
    visualizer.plot_monte_carlo(mc_df)
    visualizer.plot_squadron_comparison([red_squadron, blue_squadron])
    # 最终分析报告
    print("\n" + "=" * 60)
    print("分析结论")
    print("=" * 60)
    if results['red_win_rate'] > results['blue_win_rate']:
        print(f"经过分析,红方在模拟中更有优势,胜率高出 {results['red_win_rate'] - results['blue_win_rate']:.1f}%")
        print("建议:红方应继续保持当前战术,并考虑提升进攻性。")
    elif results['blue_win_rate'] > results['red_win_rate']:
        print(f"经过分析,蓝方在模拟中更有优势,胜率高出 {results['blue_win_rate'] - results['red_win_rate']:.1f}%")
        print("建议:红方应加强防御战术或提高战机性能。")
    else:
        print("双方实力相当,胜负取决于临场发挥。")
    return results
if __name__ == "__main__":
    main()

运行效果示例

============================================================
空中对抗优势分析系统
============================================================
红方联合空军 (中国)
- 战机数量: 5
- 平均战斗评分: 7.53
- 战术理念: balanced
- 平均速度: 1880 km/h
- 总武器载荷: 5400 kg
- 主要装备:
  ◦ J-20A (评分: 8.7)
  ◦ J-16 (评分: 7.4)
  ◦ J-10C (评分: 6.9)
  ◦ J-15 (评分: 6.8)
  ◦ Su-35 (评分: 7.6)
蓝方联合空军 (美国)
- 战机数量: 5
- 平均战斗评分: 7.89
- 战术理念: defensive
- 平均速度: 1960 km/h
- 总武器载荷: 5350 kg
- 主要装备:
  ◦ F-22 (评分: 9.5)
  ◦ F-35 (评分: 8.3)
  ◦ F-15EX (评分: 7.5)
  ◦ F/A-18E (评分: 7.1)
  ◦ Rafale (评分: 7.3)
开始1000场空战模拟...
红方获胜: 423 场 (42.3%)
蓝方获胜: 541 场 (54.1%)
平局: 36 场
执行蒙特卡洛分析...
寻找最优战术...
[生成可视化图表]

项目特点

  1. 面向对象设计:使用dataclass定义战机、中队等实体
  2. 多模块架构:数据、战术、模拟、可视化分离
  3. 蒙特卡洛模拟:处理不确定性
  4. 战术优化:自动寻找最优策略
  5. 数据可视化:多维度图表展示
  6. 技术栈丰富:numpy、pandas、matplotlib、seaborn

这个案例展示了Python在军事模拟、数据分析、可视化等领域的综合应用能力。

抱歉,评论功能暂时关闭!