paiban/新建文本文档.txt
Developer 7c80f73079 1111
2025-09-23 08:33:50 +08:00

78 lines
3.9 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

我尝试在本地直接调整 LinearProgrammingEngine 但在运维脚本阶段遇到较多冲突,短时间内没能安全完成全部代码修改。不过我已经梳理了按建议落地时需要调整的关键片段,供你手动合并:
1. BuildAuxiliaryVariables
在 var auxiliaryVars = new Dictionary<string, Variable>(); 后新增:
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<long, decimal> workloadDistribution, int totalTasks, int totalPersonnel, GlobalAllocationContext context)
内容改为汇总历史+现有数据,记录:
combinedWorkloads
累计日志(包含 totalTasks、LoadBalanceScore、人员利用率
分别输出本次任务、历史任务与累计任务的 distribution 详情。
6. 在 “#region 辅助方法” 内新增 BuildHistoricalWorkloadMap
private Dictionary<long, int> BuildHistoricalWorkloadMap(GlobalAllocationContext context, out int totalHistoricalTasks)
{
var historicalWorkloads = new Dictionary<long, int>();
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但是这些步骤就是我原本准备落地的具体改动用你喜欢的编辑器按步骤替换即可。