我不知道为什么我无法使用 Microsoft Solver Foundation 解决这个看似简单的问题。
我只需要修改某些观察值的权重(数字),以确保没有一个观察值的权重百分比超过 25%。这是为了稍后使用该算法的结果计算约束加权平均值。
例如,给定 { 45, 100, 33, 500, 28 } 的 5 个权重,我希望这个算法的结果是 { 45, 53 , 33, 53 , 28 },其中 2 个数字必须是减少,使它们在新总数的 25% 阈值内(212 = 45+53+33+53+28),而其他保持不变。请注意,尽管最初,100 的第二个权重仅占总数 (706) 的 14%,但由于减少了 500 个的第四个权重,它随后推高了其他观察值的百分比,这是唯一的挑战这个。
我尝试使用 Solver 重新创建它,只是为了告诉我解决方案是“不可行的”,它只返回全 1。更新: 解决方案不需要使用 Solver,任何替代方案都是受欢迎的,只要它在处理相当数量的权重时速度很快。
var solver = SolverContext.GetContext();
var model = solver.CreateModel();
var decisionList = new List<Decision>();
decisionList.Add(new Decision(Domain.IntegerRange(1, 45), "Dec1"));
decisionList.Add(new Decision(Domain.IntegerRange(1, 100), "Dec2"));
decisionList.Add(new Decision(Domain.IntegerRange(1, 33), "Dec3"));
decisionList.Add(new Decision(Domain.IntegerRange(1, 500), "Dec4"));
decisionList.Add(new Decision(Domain.IntegerRange(1, 28), "Dec5"));
model.AddDecisions(decisionList.ToArray());
int weightLimit = 25;
foreach (var decision in model.Decisions)
{
model.AddConstraint(decision.Name + "weightLimit", 100 * (decision / Model.Sum(model.Decisions.ToArray())) <= weightLimit);
}
model.AddGoal("calcGoal", GoalKind.Maximize, Model.Sum(model.Decisions.ToArray()));
var solution = solver.Solve();
foreach (var decision in model.Decisions)
{
Debug.Print(decision.GetDouble().ToString());
}
Debug.Print("Solution Quality: " + solution.Quality.ToString());
对此的任何帮助将不胜感激,在此先感谢。