78 lines
3.9 KiB
Plaintext
78 lines
3.9 KiB
Plaintext
我尝试在本地直接调整 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,但是这些步骤就是我原本准备落地的具体改动,用你喜欢的编辑器按步骤替换即可。 |