Ответ 1
Это можно сделать с помощью линейного программирования с постоянной целевой функцией. То есть, только проверка возможности выполнения программы.
У меня есть k линейных неравенств по n переменным (0 < k < n). Меня не особо волнует, что такое решение, я только хочу проверить, пуст ли он или нет, т.е. Удовлетворяет ли какое-либо присвоение моим переменным n системе. Кто-нибудь знает способ решить эту проблему?
Спасибо!
Это можно сделать с помощью линейного программирования с постоянной целевой функцией. То есть, только проверка возможности выполнения программы.
Используйте решатель SMT для теории линейной арифметики (Yices, Z3,...). Эти программы предназначены для поиска моделей для введенного вами ввода. Конечно, вы также можете использовать существующие алгоритмы другими способами.
Вы можете использовать устранение Фурье-Моцкина для решения системы неравенств. Однако вам нужно знать основную алгебру, чтобы понять решение.
http://en.wikipedia.org/wiki/Fourier%E2%80%93Motzkin_elimination
Вам просто нужно пересечь диапазоны. Здесь, как в псевдокоде:
// An array that has the ranges (inequalities) to test:
fromToArray = [[0, 10], [5, 20], [-5, Infinity]]
currentRange = [-Infinity, Infinity];
for each pair myRange in fromToArray
if currentRange[0] < myRange[0]
then currentRange[0] = myRange[0]
if currentRange[1] > myRange[1]
then currentRange[1] = myRange[1]
if currentRange[0] >= currentRange[1] // from greater than to, so set is empty.
then return "NO SOLUTION"
end for each
return "Solution is: " + currentRange
Вычислить определитель соответствующей матрицы; если оно отличное от нуля, есть единственное решение; если оно равно нулю, существует либо бесконечно много решений, либо нет - http://en.wikipedia.org/wiki/System_of_linear_equations
В качестве альтернативы используйте исключение Гаусса - http://en.wikipedia.org/wiki/Gaussian_elimination