Main Page   Class Hierarchy   Compound List   File List   Contact   Download   Symbolic Constraints   Examples  

qap.cc

00001 #include<scil/scil.h>
00002 #include<scil/core/monomial.h>
00003 
00004 #include<iostream>
00005 #include<string>
00006 
00007 
00008 using std::cout;
00009 using std::endl;
00010 using std::ifstream;
00011 using std::cerr;
00012 
00013 
00014 #define INPATH ""
00015 
00016 
00017 using namespace SCIL;
00018 
00019 
00020 void  readcoeff(char* infile, double**& matrix1, double**& matrix2, int& size) {
00021    std::string path(INPATH);
00022    path += infile;
00023    ifstream file(path.c_str());
00024    if(file.fail()) {
00025       cerr << "in path " << path << endl;
00026       cerr<<"is no "<< infile<< endl;
00027       exit(1);
00028    }
00029    char buf[1024];
00030    while(file.peek() != '#')
00031       file.getline(buf, 1024);
00032 
00033    char c;
00034    file >> c;
00035    file >> size;
00036    matrix1 = new double*[size];
00037    for(int i=0; i<size; i++) {
00038       matrix1[i] = new double[size];
00039       for(int j=0; j<size; j++) {
00040          file >>matrix1[i][j];
00041       }
00042    }
00043    matrix2 = new double*[size];
00044    for(int i=0; i<size; i++) {
00045       matrix2[i] = new double[size];
00046       for(int j=0; j<size; j++) {
00047          file >>matrix2[i][j];
00048       }
00049    }
00050 }
00051 
00052 
00053 int main(int argc, char ** argv) {
00054    if(argc != 2) {
00055       cerr<< "wrong number of input parameters!"<< endl;
00056       return 1;
00057    }
00058 
00059    double **matrix1=NULL;
00060    double **matrix2=NULL;
00061    int size;
00062 
00063    //read the coefficients from file
00064    readcoeff(argv[1], matrix1, matrix2, size);
00065 
00066    //create ILP and add binary variables
00067    ILP_Problem IP(Optsense_Min);
00068    var **variablen= new var*[size];
00069    for(int i=0; i<size; i++) {
00070       variablen[i] = new var[size];
00071       for(int j=0; j<size; j++) {
00072          variablen[i][j] = IP.add_binary_variable(0);
00073       }
00074    }
00075 
00076    //create objective function
00077    for(int i=0; i<size; i++) {
00078       for(int j=0; j<size; j++) {
00079          for(int k=0; k<size; k++) {
00080             for(int l=0; l<size; l++) {
00081                if(((i!=k) && (j!=l)) || ((i==k) && (j==l))) {
00082                   if( matrix1[i][k] != 0. && matrix2[j][l] != 0. )
00083                      IP.add_polynomial(variablen[i][j]*variablen[k][l]*(matrix1[i][k]*matrix2[j][l]));
00084                }
00085             }
00086          }
00087       }
00088    }
00089 
00090 
00091    //add basic constraints necessary for QAP
00092    row r;
00093    for(int i=0; i<size; i++) {
00094       r=0;
00095       for(int j=0; j<size; j++) {
00096          r+=variablen[i][j];
00097       }
00098       IP.add_basic_constraint(r==1,Static);
00099    }
00100    for(int i=0; i<size; i++) {
00101       r=0;
00102       for(int j=0; j<size; j++) {
00103          r+=variablen[j][i];
00104       }
00105       IP.add_basic_constraint(r==1,Static);
00106    };
00107    IP.set_qrType(SQK2_SQK3);
00108 
00109    IP.optimize();
00110 
00111    //print solution
00112    for(int i=0; i<size; i++) {
00113       for(int j=0; j<size; j++) {
00114          cout<<IP.get_solution(variablen[i][j]);
00115       }
00116       cout << endl;
00117    };
00118 
00119    for(int i=0; i<size; i++){
00120       delete[] variablen[i];
00121       delete[] matrix1[i];
00122       delete[] matrix2[i];
00123    }
00124    delete[] variablen;
00125    delete[] matrix1;
00126    delete[] matrix2;
00127 }
00128 
Generated on Mon Mar 28 22:03:49 2011 for SCIL by  doxygen 1.6.3