#include "ClpSimplex.hpp" #include "CoinHelperFunctions.hpp" #include #define N 5 #define M 2 #define numberElements N*M * (N+M+M) using namespace std; int main(int argc, const char *argv[]) { ClpSimplex model; //int N = 5; //int M = 2; int numberRow1 = N; int numberRow2 = M; int numberRow3 = M; int numberColumns = N*M; int numberRows = N + M + M; //int numberElements = numberColumns * (numberRow1 + numberRow2 + numberRow3); double c[N][M] = { { 1,3 },{ 2,1 },{ 3,2 },{ 2,1 },{ 0,1 } }; double a[N][M] = { { 2,0 },{ 0,5 },{ 3,1 },{ 4,5 },{ 1,3 } }; double b[M] = { 1,1 }; // matrix data - column ordered CoinBigIndex start[N*M + 1]; //COLUMN 的个数迭代之和 start[0] = 0; for (int i = 1; i < N*M + 2; i++) { start[i] = start[i - 1] + N + M + M; } //int length[N*M] = {3,3,3,3,3,3,3,3,3,3}; int length[N*M]; for (int i = 0; i < N*M; i++) { length[i] = M + M + N; } //numberElements = numberColumns * (numberRow1 + numberRow2 + numberRow3) = 90 // position of the vars //int rows[30] = { 0,5,7,1,5,7,2,5,7,3,5,7,4,5,7,0,6,8,1,6,8,2,6,8,3,6,8,4,6,8 }; //有数据的变量所在位置 int rows[numberElements]; for (int i = 0; i < numberElements; i++) { rows[i] = i % 9; cout << "rows: " << rows[i] << endl; } //double elements[30] = {1,1,2,1,1,0,1,1,3,1,1,4,1,1,1,1,1,0,1,1,5,1,1,1,1,1,5,1,1,3 }; double elements[numberElements]; double temp1[N][N*M]; double temp2[M][N*M]; double temp3[M][N*M]; double temp4[N + M + M][M*N]; int temp_Row = 0, temp_Col = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N*M; j++) { if (j % 5 == i) { temp1[i][j] = 1; } else { temp1[i][j] = 0; } } } for (int i = 0; i < N; i++) { for (int j = 0; j < N*M; j++) { temp4[temp_Row][temp_Col] = temp1[i][j]; temp_Col = temp_Col + 1; cout << "rows: " << temp1[i][j] << endl; } temp_Col = 0; temp_Row = temp_Row + 1; } for (int i = 0; i < M; i++) { for (int j = 0; j < N*M; j++) { int temp = (int)j / 5; if (temp == i) { temp2[i][j] = 1; } else { temp2[i][j] = 0; } } } for (int i = 0; i < M; i++) { for (int j = 0; j < N*M; j++) { temp4[temp_Row][temp_Col] = temp2[i][j]; temp_Col = temp_Col + 1; cout << "rows1: " << temp2[i][j] << endl; } temp_Col = 0; temp_Row = temp_Row + 1; } for (int i = 0; i < M; i++) { for (int j = 0; j < N*M; j++) { int temp = (int)j / 5; if (temp == i) { temp3[i][j] = a[j % 5][i]; } else { temp3[i][j] = 0; } } } for (int i = 0; i < M; i++) { for (int j = 0; j < N*M; j++) { temp4[temp_Row][temp_Col] = temp3[i][j]; temp_Col = temp_Col + 1; cout << "rows2: " << temp3[i][j] << endl; } temp_Col = 0; temp_Row = temp_Row + 1; } int temp_pos = 0; for (int j = 0; j < N*M; j++) { for (int i = 0; i < N; i++) { elements[temp_pos] = temp4[i][j]; //cout << "elements: " << elements[temp_pos] << endl; temp_pos = temp_pos + 1; } for (int i = N; i < N + M; i++) { elements[temp_pos] = temp4[i][j]; //cout << "elements: " << elements[temp_pos] << endl; temp_pos = temp_pos + 1; } for (int i = N + M; i < N + M + M; i++) { elements[temp_pos] = temp4[i][j]; //cout << "elements: " << elements[temp_pos] << endl; temp_pos = temp_pos + 1; } } CoinPackedMatrix matrix(true, numberRows, numberColumns, numberElements, elements, rows, start, length); // rim data double objective[10]; int temp_pos_obj = 0; for (int j = 0; j < M; j++) { for (int i = 0; i < N; i++) { objective[temp_pos_obj] = c[i][j]; cout << "C: " << c[i][j] << endl; temp_pos_obj = temp_pos_obj + 1; } } double rowLower[M + M + N], rowUpper[M + M + N], colLower[M*N], colUpper[M*N]; for (int i = 0; i < M + N; i++) { rowLower[i] = -COIN_DBL_MAX; } for (int i = 0; i < N; i++) { rowLower[M + N + i] = b[i]; } for (int i = 0; i < M + M + N; i++) { cout << "rowLower: " << rowLower[i] << endl; } for (int i = 0; i < M + N; i++) { rowUpper[i] = 1; } for (int i = 0; i < N; i++) { rowUpper[M + N + i] = b[i]; } for (int i = 0; i < M + M + N; i++) { cout << "rowUpper: " << rowUpper[i] << endl; } // Var Lower and Upper for (int i = 0; i < M *N; i++) { colLower[i] = 0; } for (int i = 0; i < M *N; i++) { colUpper[i] = 1; } //double rowLower[9] = { -COIN_DBL_MAX , -COIN_DBL_MAX , -COIN_DBL_MAX , -COIN_DBL_MAX , -COIN_DBL_MAX , -COIN_DBL_MAX , -COIN_DBL_MAX ,1,1}; //double rowUpper[9] = { 1,1,1,1,1,1,1,1,1 }; //double colLower[M*N] = {0,0,0,0,0,0,0,0,0,0 }; //double colUpper[M*N] = {1,1,1,1,1,1,1,1,1,1 }; // load problem model.loadProblem(matrix, colLower, colUpper, objective, rowLower, rowUpper); model.writeMps("model.mps"); // Solve //model.initialSolve(); //****************************************** ClpSimplex modelNew; int status; status = modelNew.readMps("model.mps", true); int numberColumnsNew = modelNew.numberColumns(); int numberRowsNew = modelNew.numberRows(); int iRow; // get row copy CoinPackedMatrix rowCopy = *modelNew.matrix(); rowCopy.reverseOrdering(); const int * column = rowCopy.getIndices(); const int * rowLength = rowCopy.getVectorLengths(); const CoinBigIndex * rowStart = rowCopy.getVectorStarts(); modelNew.initialSolve(); //******************************************* // Solution const double * solution = modelNew.primalColumnSolution(); for (int i = 0; i < numberColumns; i++) if (solution[i]) printf("Column %d has value %g\n", i, solution[i]); return 0; }