0

この一見単純な問題を Microsoft Solver Foundation を使用して解決できない理由がわかりません。

私が必要とするのは、特定の観察の重み (数値) を変更して、1 つの観察の重み AS A PERCENTAGE が 25% を超えないようにすることだけです。これは、後でこのアルゴリズムの結果を使用して、制約付き加重平均を計算するためのものです。

たとえば、{ 45, 100, 33, 500, 28 } の 5 つの重みが与えられた場合、このアルゴリズムの結果は { 45, 53 , 33, 53 , 28 } になると予想されます。新しい合計の 25% のしきい値 ( 212 = 45+53+33+53+28) 内になるように削減され、他のものは変更されませんでした。最初は、100 の 2 番目の重みは合計 (706) の 14% にすぎませんでしたが、500 の 4 番目の重みを減らした結果、その後他の観測値の % を押し上げ、そこに唯一の課題があります。これ。

ソルバーを使用してこれを再作成しようとしましたが、これは、ソリューションが「実行不可能」であり、すべて 1 を返すだけであることがわかりました。更新: ソリューションはソルバーを使用する必要はありません。適切な数の重みを処理するときに高速である限り、代替手段は歓迎されます。

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());

事前に感謝します。

4

1 に答える 1