Microsoft.SolverFoundation линейное программирование - PullRequest
0 голосов
/ 31 декабря 2018

Я не могу решить целочисленное линейное программирование с переменными числами до тысяч и числовыми ограничениями до сотен Microsoft.SolverFoundation, это решает очень медленно.Пожалуйста, дайте мне совет, какую библиотеку использовать для ускорения, мне нужно в течение 15 секунд.Спасибо.

public void Calculate()
{
    Services.SolverContext solver = Services.SolverContext.GetContext();
    solver.ClearModel();
    Services.Model model = solver.CreateModel();

    List<Services.Decision> decisions = new List<Services.Decision>();
    for (int i = 0; i < NumChoices.Count; i++)
    {
        var decision = new Services.Decision(Services.Domain.IntegerNonnegative, $"x{i}");
        model.AddDecision(decision);
        decisions.Add(decision);
    }

    for (int j = 0; j < NumChoices[0].Count; j++)
    {
        Services.Term target = null;
        for (int i = 0; i < decisions.Count; i++)
        {
            if (i == 0)
            {
                target = decisions[i] * NumChoices[i][j];
            }
            else
            {
                target += decisions[i] * NumChoices[i][j];
            }
        }
        if (j == 0)
        {
            model.AddGoal("Goal", Services.GoalKind.Minimize, target);
        }
        else
        {
            target = (QuantityRebars[j] == target);
            model.AddConstraint($"Constraint{j}", target);
        }
    }

    Services.Solution solution = solver.Solve();

    for (int i = 0; i < decisions.Count; i++)
    {
        Results.Add(Math.Round(decisions[i].GetDouble()));
        TotalBarLength += Math.Round(decisions[i].GetDouble()) * StandandBarLength;
        Waste += NumChoices[i][0] * Math.Round(decisions[i].GetDouble());
    }
    Used = TotalBarLength - Waste;
}
...