我尝试在本地直接调整 LinearProgrammingEngine 但在运维脚本阶段遇到较多冲突,短时间内没能安全完成全部代码修改。不过我已经梳理了按建议落地时需要调整的关键片段,供你手动合并: 1. BuildAuxiliaryVariables 在 var auxiliaryVars = new Dictionary(); 后新增: var historicalWorkloads = BuildHistoricalWorkloadMap(context, out var totalHistoricalTasks); var avgWorkload = context.AvailablePersonnel.Count > 0 ? (double)(context.Tasks.Count + totalHistoricalTasks) / context.AvailablePersonnel.Count : 0.0; 删除原来的 var avgWorkload = (double)context.Tasks.Count / context.AvailablePersonnel.Count; 行。 将 var negDeviationVar = solver.MakeNumVar(0, avgWorkload, ...); 替换为 var negDeviationVar = solver.MakeNumVar(0, Math.Max(0.0, avgWorkload), $"neg_dev_{personnel.Id}"); 2. 完全替换 AddFairnessConstraints 方法 替换为兼顾历史任务的版本(见建议中的完整实现:重新计算 avg、targetWorkload、maxTotalWorkload,并更新参与人数约束与日志)。 3. ProcessEnhancedSolverResult 调 LogWorkloadAnalysis 时,末尾添加 context 参数 LogWorkloadAnalysis(workloadDistribution, context.Tasks.Count, context.AvailablePersonnel.Count, context); 4. ValidateSolutionQuality var totalChecks = 0; 后插入 var historicalWorkloads = BuildHistoricalWorkloadMap(context, out _); “检查3”段替换为: // 检查3:负载均衡评估(纳入历史任务) var currentWorkloadMap = assignments .GroupBy(a => a.Value) .ToDictionary(g => g.Key, g => g.Count()); var combinedWorkloads = context.AvailablePersonnel.ToDictionary( p => p.Id, p => historicalWorkloads.GetValueOrDefault(p.Id) + currentWorkloadMap.GetValueOrDefault(p.Id)); if (combinedWorkloads.Any()) { var workloadValues = combinedWorkloads.Values.Select(v => (decimal)v).ToList(); var giniCoefficient = CalculateGiniCoefficient(workloadValues); metrics.LoadBalanceScore = Math.Max(0.0, 1.0 - giniCoefficient); var utilizedCount = combinedWorkloads.Count(kv => kv.Value > 0); metrics.PersonnelUtilizationRate = context.AvailablePersonnel.Count > 0 ? (double)utilizedCount / context.AvailablePersonnel.Count : 0.0; } 5. 替换 LogWorkloadAnalysis 新签名 LogWorkloadAnalysis(Dictionary workloadDistribution, int totalTasks, int totalPersonnel, GlobalAllocationContext context) 内容改为汇总历史+现有数据,记录: combinedWorkloads 累计日志(包含 totalTasks、LoadBalanceScore、人员利用率) 分别输出本次任务、历史任务与累计任务的 distribution 详情。 6. 在 “#region 辅助方法” 内新增 BuildHistoricalWorkloadMap private Dictionary BuildHistoricalWorkloadMap(GlobalAllocationContext context, out int totalHistoricalTasks) { var historicalWorkloads = new Dictionary(); totalHistoricalTasks = 0; foreach (var personnel in context.AvailablePersonnel) { var historyCount = 0; if (context.PersonnelHistoryTasks.TryGetValue(personnel.Id, out var historyTasks) && historyTasks != null) { historyCount = historyTasks.Count; } historicalWorkloads[personnel.Id] = historyCount; totalHistoricalTasks += historyCount; } return historicalWorkloads; } 7. CreateBatchIntegrityConstraints 在 var totalPersonnel = context.AvailablePersonnel.Count; 后插入与 BuildAuxiliaryVariables 里类似的历史统计,替换旧 avg。 foreach 内对 historicalWorkload 做差计算上下界(同 AddFairnessConstraints)。 完成以上替换后,再整体检查一下生成的代码是否编译通过(dotnet build)即可实现公平性逻辑对历史任务的补强。 抱歉没能直接 commit,但是这些步骤就是我原本准备落地的具体改动,用你喜欢的编辑器按步骤替换即可。