Не получается решение задачи линейного программирования через linprog. При этом задача решабельная.
22.09.2020
Доброго времени суток! Столкнулся с проблемой решения задачи линейного программирования симплекс методом, при построении матрицы 110 ограничений на 54 переменных.
Происходит 49 итераций и матлаб выдае...
Доброго времени суток! Столкнулся с проблемой решения задачи линейного программирования симплекс методом, при построении матрицы 110 ограничений на 54 переменных.
Происходит 49 итераций и матлаб выдает: Exiting: The constraints are overly stringent; no feasible starting point found.
Ограничения на корректность соотношения переменных проверил, вроде не наблюдается.
В тоже время другой софт выполняет матрицу симплекс-методом и дает значение целевой функции 11153.4.
Пример кода и файл матрицы ограничений приложил. Спасибо за внимание!
clear; clc;
format long;
work_matrix = readtable('matrix2.xlsx', 'Sheet', 'work'); % импорт матрицы ЭММ из эксель файла
%заменям пустые ячейки матрици (NaN) на нули
tic
for i = 1:size(work_matrix,1)
for k = 1:(size(work_matrix,2)-2)
if isnan(work_matrix{i, k}) == 1
work_matrix{i, k} = 0;
end
end
end
% Меняем знак >= на <=, поскольку функция linprog не работает с первым
for i1 = 1:(size(work_matrix,1)-1)
if strcmp(work_matrix{i1, size(work_matrix,2)-1}, '>=') == 1
work_matrix{i1, size(work_matrix,2)-1} = {'<='};
work_matrix{i1, 1:size(work_matrix,2)-2} = work_matrix{i1, 1:size(work_matrix,2)-2} * (-1);
work_matrix{i1, size(work_matrix,2)} = work_matrix{i1, size(work_matrix,2)} * (-1);
end
end
% Задаем вектор-столбец с коэфциентами целевой функции
f = work_matrix{size(work_matrix, 1), 1:(size(work_matrix, 2)-2)};
% Задаем матрицы с коэфциентами ограничений и свободными членами
A = []; % пустая матрица коэффициентов НЕРАВЕНСТ
Aeq = []; % пустой матрица коэффициентов РАВЕНСТВ
b = []; % пустая вектор строка свободных членов при неравенствах
beq = []; % пустая вектор строка свободных членов при равенствах
t = 0; % внутренние счетчики для упорядочивания
t1 = 0;
for i2 = 1:(size(work_matrix,1)-1)
if strcmp(work_matrix{i2, size(work_matrix,2)-1}, '<=') == 1
t = t+1;
A(t,:) = work_matrix{i2, 1:size(work_matrix,2)-2};
b(1,t) = work_matrix{i2, size(work_matrix,2)};
elseif strcmp(work_matrix{i2, size(work_matrix,2)-1}, '=') == 1
t1 = t1+1;
Aeq(t1,:) = work_matrix{i2, 1:size(work_matrix,2)-2};
beq(1,t1) = work_matrix{i2, size(work_matrix,2)};
end
end
% Находим максимум целевой функции через linprog
options = optimoptions('linprog', 'Algorithm', 'simplex', 'Diagnostics', 'on', 'Display', 'iter', 'TolFun', 1e-10);
lb = [];
ub = [];
[x, fval, exitflag, output] = linprog(-f, A, b, Aeq, beq, lb, ub, [], options);
toc
Комментарии