#ifndef NMCALCULATIONAUTOFITGA_H #define NMCALCULATIONAUTOFITGA_H #include #include #include #include #include #include #include #include #include #include #include #include "nmCalculation_global.h" class nmDataWellBase; enum StopReasonGA { GA_CONTINUE_OPTIMIZATION = 0, GA_TARGET_ACHIEVED, GA_TRUE_CONVERGENCE, GA_LOCAL_OPTIMUM, GA_MAX_ITERATIONS, GA_USER_STOPPED, GA_CONSECUTIVE_FAILURES, GA_OPTIMIZATION_FAILED }; struct GAIndividual { QVector genes; // 基因(参数值) double fitness; // 适应度值 bool isEvaluated; // 是否已评估 GAIndividual() : fitness(1e10), isEvaluated(false) {} }; class NMCALCULATION_EXPORT nmCalculationAutoFitGA : public QObject { Q_OBJECT public: explicit nmCalculationAutoFitGA(QObject* parent = nullptr); virtual ~nmCalculationAutoFitGA(); // ==================== 公共接口方法 ==================== void setTargetLogLogData(const QVector>& targetData); bool startAutoFitting(); void stopFitting(); bool isRunning() const; int getCurrentGeneration() const; QVector getBestSolution() const; double getBestFitness() const; QString getLastError() const; void resetOptimizer(); void setGATargetWellName(const QString& wellName); signals: void progressUpdated(int generation, double bestFitness); void fittingFinished(bool success, const QString& message); void logMessageGenerated(const QString& message); private slots: void updateProgress(); private: // 临时目录管理 void initializeTemporaryDirectory(); void cleanupTemporaryDirectory(); bool removeDirectoryRecursively(const QString& path); // ==================== 数据加载方法 ==================== // 从数据管理器加载所有配置 bool loadAllConfigFromDataManager(); // 加载优化配置 void loadOptimizationConfig(); // 加载参数边界 void loadParameterBounds(); // 提取用户初始值 void extractUserInitialValues(); // ==================== 遗传算法核心方法 ==================== // 初始化种群 void initializePopulation(); // 评估基因 double evaluateGenes(const QVector& genes); // 评估个体 double evaluateIndividual(GAIndividual& individual); // 评估种群 void evaluatePopulation(); // 选择操作 int tournamentSelection(); int rouletteWheelSelection(); // 交叉操作 void crossover(const GAIndividual& parent1, const GAIndividual& parent2, GAIndividual& offspring1, GAIndividual& offspring2); void singlePointCrossover(const GAIndividual& parent1, const GAIndividual& parent2, GAIndividual& offspring1, GAIndividual& offspring2); void uniformCrossover(const GAIndividual& parent1, const GAIndividual& parent2, GAIndividual& offspring1, GAIndividual& offspring2); // 变异操作 void mutate(GAIndividual& individual); void gaussianMutation(GAIndividual& individual); void polynomialMutation(GAIndividual& individual); // 精英保留 void applyElitism(QVector& newPopulation); // 更新种群统计 void updatePopulationStatistics(); // 收敛检查 bool checkConvergence(); // 自适应参数更新 void adaptiveParameterUpdate(int generation); // ==================== 智能收敛判断方法 ==================== // 分析优化状态 StopReasonGA analyzeOptimizationStatus(); // 检查真收敛 bool checkTrueConvergence() const; // 检查局部最优陷阱 bool checkLocalOptimumTrap() const; // 计算种群多样性 double calculatePopulationDiversity() const; // 计算适应度方差 double calculateFitnessVariance(int windowSize) const; // 计算长期改进 double calculateLongTermImprovement(int windowSize) const; // 更新收敛指标 void updateConvergenceMetrics(); // 最终结果验证和保护 void validateAndProtectFinalResult(); // ==================== 参数处理方法 ==================== // 参数验证 bool validateParameters(const QVector& parameters) const; // 双对数数据验证 bool validateLogLogData(const QVector>& logLogData) const; // 初始值验证 bool validateInitialValues() const; // 应用参数到数据管理器 void applyParametersToDataManager(const QVector& parameters); // 更新储层参数 void updateReservoirParameters(const QVector& parameters); // 更新井参数 void updateWellParameters(const QVector& parameters); // 更新井到数据管理器 void updateWellToDataManager(nmDataWellBase* pWell); // 参数边界约束 void clampToLimits(QVector& parameters) const; // ==================== 求解器相关方法 ==================== // 运行求解器 QVector> runSolver(); // 运行EXE求解器 QVector> runSolverExe(); // 运行Dll求解器 QVector> runSolverDll(); // 验证求解器结果 bool validateSolverResult(const QVector>& result) const; // ==================== 数据处理方法 ==================== // 插值数据 QVector interpolateData(const QVector& source, const QVector& targetX) const; // 计算双对数曲线误差 double calculateLogLogCurveError(const QVector>& target, const QVector>& result) const; // 计算曲线误差 double calculateCurveError(const QVector& curve1, const QVector& curve2) const; // ==================== 工具方法 ==================== // 生成0-1随机数 double random01() const; // 高斯随机数 double gaussianRandom(double mean, double stddev) const; // 获取启用参数数量 int getEnabledParameterCount() const; // 保存优化结果 void saveOptimizationResult(); private: // ==================== 常量定义 ==================== static const double MIN_FITNESS_IMPROVEMENT; static const double MUTATION_STRENGTH; static const int CONVERGENCE_CHECK_INTERVAL; static const int MAX_STAGNATION_GENERATIONS; // ==================== 核心状态变量 ==================== bool m_isRunning; // 是否正在运行 bool m_shouldStop; // 是否应该停止 bool m_isPaused; // 是否暂停 int m_currentGeneration; // 当前代数 // 适应度统计 double m_bestFitness; // 最优适应度 double m_worstFitness; // 最差适应度 double m_averageFitness; // 平均适应度 double m_previousBestFitness; // 上一代最优适应度 // ==================== GA算法参数 ==================== int m_populationSize; // 种群大小 int m_maxGenerations; // 最大代数 double m_targetError; // 目标误差 double m_crossoverRate; // 交叉概率 double m_mutationRate; // 变异概率 double m_elitismRate; // 精英保留比例 int m_tournamentSize; // 锦标赛选择大小 bool m_useUniformCrossover; // 是否使用均匀交叉 // ==================== 种群和个体 ==================== QVector m_population; // 当前种群 QVector m_eliteIndividuals; // 精英个体 GAIndividual m_bestIndividual; // 全局最优个体 // ==================== 评估统计 ==================== int m_totalEvaluations; // 总评估次数 int m_successfulEvaluations; // 成功评估次数 int m_evaluationInProgress; // 正在进行的评估计数 int m_consecutiveFailures; // 连续失败次数 // ==================== 精英保护相关 ==================== QVector m_initialValues; // 用户初始参数值 QVector m_userInitialSolution; // 用户初始解 double m_userInitialFitness; // 用户初始适应度 int m_consecutiveFailedGenerations; // 连续失败代数 int m_maxConsecutiveFailures; // 最大允许连续失败数 bool m_hasValidUserSolution; // 是否有有效的用户解 double m_improvementThreshold; // 改进阈值 // ==================== 收敛判断相关 ==================== double m_diversityThreshold; // 多样性阈值 double m_convergenceVarianceThreshold; // 收敛方差阈值 int m_trueConvergenceWindow; // 真收敛判断窗口 int m_localOptimumWindow; // 局部最优判断窗口 double m_nearTargetFactor; // 接近目标的因子 double m_farTargetFactor; // 远离目标的因子 // ==================== 历史记录 ==================== QVector m_convergenceHistory; // 收敛历史 QVector m_diversityHistory; // 多样性历史 // ==================== 参数配置 ==================== QVector m_parameterSelected; // 参数选择状态 QVector m_parameterLower; // 参数下界 QVector m_parameterUpper; // 参数上界 QVector m_enabledParamIndices; // 启用参数索引 // ==================== 目标数据 ==================== QVector> m_targetLogLogData; // 目标双对数数据 // ==================== 其他 ==================== QString m_lastError; // 最后错误信息 QTimer* m_progressTimer; // 进度更新定时器 // DLL求解器需要的临时目录 QString m_tempDirectory; QString m_targetWellName;// 目标井名称 }; #endif // NMCALCULATIONAUTOFITGA_H