C #: решение нелинейной системы с помощью Microsoft Solver - PullRequest
0 голосов
/ 09 мая 2018

Используя Microsoft Solver Foundation, я до сих пор решал только линейные задачи. Сейчас я пытаюсь решить очень простую нелинейную задачу, но по некоторым причинам решатель Microsoft не может ее решить.

Проблема заключается в максимизации a0 * a1, при a0 <10 и a1 <20. Вот код, который я использую: </p>

с использованием системы; использование Microsoft.SolverFoundation.Services;

namespace SolverFoundationDemo { Программа класса { static void Main (строка [] args) { Console.WriteLine ("\ nBegin Solver demo \ n");

        var solver = SolverContext.GetContext();
        var model = solver.CreateModel();

        var decision1 = new Decision(Domain.RealNonnegative, "a0"); model.AddDecision(decision1);
        var decision2 = new Decision(Domain.RealNonnegative, "a1"); model.AddDecision(decision2);


        model.AddConstraint("Constraint0", "a0 <=10");
        model.AddConstraint("Constraint1", "a1 <=20");


         model.AddGoal("Goal", GoalKind.Maximize, " a0*a1 ");


        var solution = solver.Solve();


        Console.WriteLine("\nEnd Solver demo\n");
        Console.ReadLine();
    } 
} 

}

Я получаю ошибку «Модель не выпуклая», и это правда, но я ожидал, что решатель Microsoft будет достаточно умен, чтобы найти решение в любом случае.

Большое спасибо за ваш отзыв.

С уважением,

1 Ответ

0 голосов
/ 11 мая 2018

На самом деле, Microsoft Solver выбирает NLP по умолчанию.По некоторым причинам, если я добавлю бесполезное ограничение, например, a0 * a1 <1000000, это сработает.Если я не добавлю это ограничение, оно не будет работать .. Я действительно не удовлетворен этим Солвером.Эрвин, не могли бы вы сказать мне, какой решатель мне следует использовать? Если я хочу перейти с решателя Microsoft? </p>

Моя программа написана на C #.У меня есть все мои решения и ограничения внутри Datable, и я передаю его решателю, как показано ниже.Чтобы избежать переписывания всего материала, я бы хотел, чтобы решатель мог кормить, используя тот же метод.

string Comment = Convert.ToString (Table_Constraints.Rows [i] ["Comment"]);

string Constraints = Convert.ToString (Table_Constraints.Rows [i] ["Constraint"]);

model.AddConstraint (Комментарий, Ограничения);

...