• Регистрация
Lev
Lev 0.00
н/д

Не получается решение задачи линейного программирования через linprog. При этом задача решабельная.

22.09.2020

Доброго времени суток! Столкнулся с проблемой решения задачи линейного программирования симплекс методом, при построении матрицы 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

Теги

    22.09.2020

    Ответы