From 9cf37ec9e424878ca304e421ca7414ab3b0a5217 Mon Sep 17 00:00:00 2001 From: emil28092005 <65846814+emil28092005@users.noreply.github.com> Date: Sun, 22 Sep 2024 19:33:24 +0300 Subject: [PATCH] it kinda works --- main.cpp | 24 ++++++++++++++---------- simplex.cpp | 34 +++++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/main.cpp b/main.cpp index 2227974..30dcad0 100644 --- a/main.cpp +++ b/main.cpp @@ -4,16 +4,20 @@ #include "simplex.h" int main() { - Vector C(6); - Matrix A(6, 4); - int Carr[C.size()] = {-5, -4, 0, 0, 0, 0}; - for (int i = 0; i < C.size(); ++i) { - C[i] = Carr[i]; + Vector C = {5, 4, 0, 0}; + Matrix A = {{6, 4, 1, 0, 0, 0}, {1, 2, 0, 1, 0, 0}, {-1, 1, 0, 0, 1, 0}, {0, 1, 0, 0, 0, 1}}; + Vector b = {24, 6, 1, 2}; + + Result result = Simplex(C, A, b); + if(result.state == bounded) { + + if(result.solution == nullptr) { + std::cout << "HUYN: Khong tim duoc nghiem" << std::endl; + } + std::cout << *result.solution << std::endl; + std::cout << result.objective_fucntion_value << std::endl; + } - A = {{6, 4, 1, 0, 0, 0}, {1, 2, 0, 1, 0, 0}, {-1, 1, 0, 0, 1, 0}, {0, 1, 0, 0, 0, 1}}; - Vector b(A.getRows()); - b = {24, 6, 1, 2}; - std::cout << A << std::endl; - std::cout << C << std::endl; + return 0; } diff --git a/simplex.cpp b/simplex.cpp index 579f07c..c6a7e32 100644 --- a/simplex.cpp +++ b/simplex.cpp @@ -17,17 +17,37 @@ struct Result { Result Simplex(Vector C, Matrix A, Vector b, double eps = 0.01, bool maximize=true) { - std::cout << "C: " << C << std::endl; - std::cout << "A: " << A << std::endl; - std::cout << "b: " << b << std::endl; - int m = A.getRows(); - while (b[0] < eps) { + Result result{}; + std::vector basicVars(A.getColumns() - A.getRows()); + basicVars[0] = -1; + + for (int i = 1; i < basicVars.size(); i++) { + basicVars[i] = static_cast(basicVars.size()) + i; + } + + while (true) { //3 int pivot_column_index = 0; pivot_column_index = max_index(C); + if (A[0][pivot_column_index] >= 0) { + + result.state = bounded; + result.solution = new Vector(C.size()); + for (int i = 0; i < C.size(); i++) { + result.solution->operator[](i) = 0; + } + for (int i = 1; i < basicVars.size(); i++) { + if (basicVars[i] <= C.size()) { + (*result.solution)[basicVars[i]] = b.size() - 1; + } + } + result.objective_function_value = b[0]; + return result; + } + //4 Vector ratio_vector(m); for (int i = 0; i < m; i++) { @@ -35,6 +55,8 @@ Result Simplex(Vector C, Matrix A, Vector b, double eps = 0.01, bool maximize=tr } int pivot_row_index = min_index(ratio_vector); + basicVars[pivot_row_index] = pivot_column_index; + //5 FracturedMatrix fractured_matrix(elimination(A, C, b, pivot_column_index, pivot_row_index)); A = fractured_matrix.A; @@ -44,8 +66,6 @@ Result Simplex(Vector C, Matrix A, Vector b, double eps = 0.01, bool maximize=tr pivot_row_index = fractured_matrix.pivot_row_index; } - Result result; - return result; /*