Подключите нашего Telegram-бота для уведомлений о новых проектах
Разработка функций линейного программирования.
Разместить заказ
m
Заказчик
Отзывы фрилансеров:
+ 3
- 0
Зарегистрирован на сайте 3 года и 10 месяцев
Бюджет:
15 000 руб
186.77 $ — 166.48 €
Нужно написать универсальный класс для решения задачи линейного программирования на C#
LPSolver. На чистом C#, без использования сторонних библиотек. Внутри класса нужно все типы ключей преобразовать в int и работать с массивами для максимальной производительности.
Вот с таким интерфейсом
// String – тип ключа
// double – тип данных
LPSolver<String, double> lPSolver = new LPSolver<string, double>();
lPSolver.addLimitation("глина", 100, '<'); // добавляем ограничение в сторону <
lPSolver.addLimitation("дерево", 200, '<');
lPSolver.addLimitation("строители", 1000, '<');
lPSolver.addLimitation("свободное место", 32, '<');
lPSolver.addLimitation("деньги", 5000, '<');
lPSolver.addLimitation("квартиры", 0, '>', true); // квартиры в сторону > ,а парамет true означает, что это целевой показатель,
lPSolver.addVariable("деревянный дом"); // добавляем.переменную
lPSolver.addVariable("глиняный дом", true); // true это целочисленная переменная
// Добавляем связь переменных и ограничений
lPSolver.addConnection("глина", "глиняный дом", 20);
lPSolver.addConnection("глина", "деревянный дом", 0);
lPSolver.addConnection("дерево", "глиняный дом", 0);
lPSolver.addConnection("дерево", "деревянный дом", 60);
lPSolver.addConnection("строители", "глиняный дом", 10);
lPSolver.addConnection("строители", "деревянный дом", 30);
lPSolver.addConnection("свободное место", "глиняный дом", 8);
lPSolver.addConnection("свободное место", "деревянный дом", 5);
lPSolver.addConnection("деньги", "глиняный дом", 300);
lPSolver.addConnection("деньги", "деревянный дом", 600);
lPSolver.addConnection("квартиры", "глиняный дом", 100);
lPSolver.addConnection("квартиры", "деревянный дом", 200);
Double результат_целевой_функции;
Dictionary<string, double> готовые_переменные;
Dictionary<string, double> остатки_условия;
lPSolver.solve(out результат_целевой_функции, out готовые_переменные, out остатки_условия);
String resultText = $"возможно построить квартир={результат_целевой_функции}";
Console.WriteLine("Какие дома лучше строить:");
foreach (var item in готовые_переменные)
{
Console.WriteLine($"{item.Key} : {item.Value}");
}
Console.WriteLine("Сколько останется ресурсов:");
foreach (var item in остатки_условия)
{
Console.WriteLine($"{item.Key} : {item.Value}");
}
Console.WriteLine(resultText);
То есть в классе задаем ограничения, переменные и связь между ними, после решения получаем результат по каждой переменной и остатки.
LPSolver. На чистом C#, без использования сторонних библиотек. Внутри класса нужно все типы ключей преобразовать в int и работать с массивами для максимальной производительности.
Вот с таким интерфейсом
// String – тип ключа
// double – тип данных
LPSolver<String, double> lPSolver = new LPSolver<string, double>();
lPSolver.addLimitation("глина", 100, '<'); // добавляем ограничение в сторону <
lPSolver.addLimitation("дерево", 200, '<');
lPSolver.addLimitation("строители", 1000, '<');
lPSolver.addLimitation("свободное место", 32, '<');
lPSolver.addLimitation("деньги", 5000, '<');
lPSolver.addLimitation("квартиры", 0, '>', true); // квартиры в сторону > ,а парамет true означает, что это целевой показатель,
lPSolver.addVariable("деревянный дом"); // добавляем.переменную
lPSolver.addVariable("глиняный дом", true); // true это целочисленная переменная
// Добавляем связь переменных и ограничений
lPSolver.addConnection("глина", "глиняный дом", 20);
lPSolver.addConnection("глина", "деревянный дом", 0);
lPSolver.addConnection("дерево", "глиняный дом", 0);
lPSolver.addConnection("дерево", "деревянный дом", 60);
lPSolver.addConnection("строители", "глиняный дом", 10);
lPSolver.addConnection("строители", "деревянный дом", 30);
lPSolver.addConnection("свободное место", "глиняный дом", 8);
lPSolver.addConnection("свободное место", "деревянный дом", 5);
lPSolver.addConnection("деньги", "глиняный дом", 300);
lPSolver.addConnection("деньги", "деревянный дом", 600);
lPSolver.addConnection("квартиры", "глиняный дом", 100);
lPSolver.addConnection("квартиры", "деревянный дом", 200);
Double результат_целевой_функции;
Dictionary<string, double> готовые_переменные;
Dictionary<string, double> остатки_условия;
lPSolver.solve(out результат_целевой_функции, out готовые_переменные, out остатки_условия);
String resultText = $"возможно построить квартир={результат_целевой_функции}";
Console.WriteLine("Какие дома лучше строить:");
foreach (var item in готовые_переменные)
{
Console.WriteLine($"{item.Key} : {item.Value}");
}
Console.WriteLine("Сколько останется ресурсов:");
foreach (var item in остатки_условия)
{
Console.WriteLine($"{item.Key} : {item.Value}");
}
Console.WriteLine(resultText);
То есть в классе задаем ограничения, переменные и связь между ними, после решения получаем результат по каждой переменной и остатки.
Разделы:
Опубликован:
10.09.2021 | 14:44 [поднят: 10.09.2021 | 14:44] [последние изменения: 10.09.2021 | 15:10]