2017-02-07 94 views
2

У меня есть система линейных уравнений, которую я уже приводил к матрице эшелонов строк с использованием исключения Гаусса-Джордана. Моя система с n переменными Xn (где Xn находится в N0 (= положительные целые числа)) имеет несколько решений, и я хочу найти решение для witch Сумма всех Xn минимальна.система линейного уравнения с дополнительным ограничением минимальных переменных sum

Как я могу сделать это программно?

Для примера рассмотрим эту систему линейных уравнений:

x1 +    + x5 + x6 = 2 
    x2   + x5  = 1  
      x3   + x6 = 1 
       x4 + x5 + x6 = 1 

один из минимального решения я хочу получить это:

x3 = x4 = x5 = 0 
x1 = x2 = x6 = 1 

другой будет

x2 = x4 = x6 = 0 
    x1 = x3 = x5 = 1 

Но Я не хочу

x1 = 2 
x2 = x3 = x4 = 1 
x5 = x6 = 0 

, который также является решением этой системы, но не является минимальным по моим критериям: x1 + x2 + x3 + x4 + x5 + x6 = 5 (тогда как для 2 первых решений - только 3)

В случае нескольких минимальных решений (как здесь, где решения 1 и 2 являются минимальными), я не забочусь о минимальном решении, которое возвращается до тех пор, как это один из самых минимальных

+0

Нужны ли переменные неотрицательные? Поскольку существуют решения с разной суммой, из этого следует, что достижимые суммы не ограничены ниже. –

+0

Да, переменные не являются отрицательными. Они принадлежат множеству положительных целых чисел {0,1,2, ...} –

+1

Итак, сколько переменных в ваших экземплярах? Сколько уравнений? – sascha

ответ

0

с переменные все неотрицательны, эта проблема по существу эквивалентна целочисленному программированию. Используйте встроенный программный решатель и сформулируйте как

minimize x1 + x2 + x3 + x4 + x5 + x6 
subject to 
x1    + x5 + x6 = 2 
    x2   + x5  = 1 
      x3   + x6 = 1 
       x4 + x5 + x6 = 1 
integers 
x1, x2, x3, x4, x5, x6 >= 0 

(точный синтаксис зависит от инструмента).

+0

Ну, я не хочу использовать внешний инструмент. Мне нужно запрограммировать этот решатель самостоятельно (чтобы интегрировать его в игру, которую я программирую). Это была цель моего вопроса ... –

+2

@ThomasBernard: Для многих языков существуют линейные пакеты программирования: вы можете интегрировать их в свою игру. Если вы действительно хотите запрограммировать его самостоятельно, найдите [симплексный метод или симплекс-алгоритм] (https://en.wikipedia.org/wiki/Simplex_algorithm) и реализуйте его. –

+0

@RoryDaulton Simplex недостаточно, а Simplex - одна из самых сложных задач программирования (если производительность важна, и мы не знаем размер его экземпляров). – sascha