Hi. I am writing a CPLEX optimization code to generate a matrix, which takes r and n as the command line arguments, but they may be assumed 2 and 4 for now.

The condition for generating the matrix is that the sum of elements in any row or in any column should equal 10, where the elements are integers between 0 and 10. (i.e. doubly-stochastic matrix)

I turned this condition into the constraint, and generated the matrix, but it only gives a matrix with 10s and 0s.

I think it is because CPLEX always finds the "optimal" solution, but for the problem I want to solve, this is not going to help much.

I want matrices with some 6, 7, 8, 9, 10, and 0~5 for the rest.

I want to generate all possible matrices satisfying such condition (and some more condition to be added later) so that I could test all of them and exhaust the case.

How can I do that?

I am looking into this solution pool thing, and it is not easy..

Also,

cplex.out() << "number of solutions = " << cplex.getSolnPoolNsolns() << endl;

this gives 1... meaning that there is only one solution, while I know there are millions of those matrices.

If you have any ideas how to generate all the 'sub-optimal' matrices, please help me.

Thank you.

I attached my code in IPGenMat.cpp, and aa.sol was the solution it gave me.

I also copied it here below.

(In short, two questions: 1. how can I find 'less optimal' solutions? 2. how can I find all of such solutions?)

#include<ilcplex/ilocplex.h>

#include<vector>

#include<iostream>

#include<sstream>

#include<string>

using namespace std;

int main(int argc, char** argv) {

if (argc < 2) {

cerr << "Error: " << endl;

return 1;

}

else {

int r, n;

stringstream rValue(argv[1]);

stringstream nValue(argv[2]);

rValue >> r;

nValue >> n;

int N=n*r;

int ds = 10; //10 if doubly-stochastic, smaller if sub-doubly stochastic

IloEnv env;

try {

IloModel model(env);

IloArray<IloNumVarArray> m(env, N);

for (int i=0; i<N; i++) {

m[i] = IloNumVarArray(env, N, 0, 10, ILOINT);

}

IloArray<IloExpr> sumInRow(env, N);

for (int i=0; i<N; i++) {

sumInRow[i] = IloExpr(env);

}

for (int i=0; i<N; i++) {

for (int j=0; j<N; j++) {

sumInRow[i] += m[i][j];

}

}

IloArray<IloRange> rowEq(env, N);

for (int i=0; i<N; i++) {

rowEq[i] = IloRange(env, ds, sumInRow[i], 10); //doubly stochastic

}

IloArray<IloExpr> sumInColumn(env, N);

for (int i=0; i<N; i++) {

sumInColumn[i] = IloExpr(env);

}

for (int i=0; i<N; i++) {

for (int j=0; j<N; j++) {

sumInColumn[i] += m[j][i];

}

}

IloArray<IloRange> columnEq(env, N);

for (int i=0; i<N; i++) {

columnEq[i] = IloRange(env, ds, sumInColumn[i], 10); //doubly stochastic

}

for (int i=0; i<N; i++) {

model.add(rowEq[i]);

model.add(columnEq[i]);

}

IloCplex cplex(env);

cplex.extract(model);

cplex.setParam(IloCplex::SolnPoolAGap,0.0);

cplex.setParam(IloCplex::SolnPoolIntensity,4);

cplex.setParam(IloCplex::PopulateLim, 2100000000);

cplex.populate();//.solve();

cplex.out() << "solution status = " << cplex.getStatus() << endl;

cplex.out() << "number of solutions = " << cplex.getSolnPoolNsolns() << endl;

cplex.out() << endl;

cplex.writeSolutions("aa.sol");

for (int i = 0; i < N; i++) {

for (int j = 0; j < N; j++) {

cplex.out() << cplex.getValue(m[i][j]) << " | ";

}

cplex.out() << endl;

}

cplex.out() << endl;

}

catch(IloException& e) {

cerr << " ERROR: " << e << endl;

}

catch(...) {

cerr << " ERROR: " << endl;

}

env.end();

return 0;

}

}