Ignore:
Timestamp:
Jan 11, 2011 2:04:34 PM (9 years ago)
Author:
forrest
Message:

add some more heuristics

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cbc/src/CbcHeuristicGreedy.cpp

    r1573 r1585  
    10641064    }
    10651065    double offset2 = 0.0;
     1066    char * sos = new char [numberRows];
    10661067    for (int iRow = 0;iRow < numberRows; iRow++) {
     1068      sos[iRow]=0;
     1069      if (rhs[iRow]<0.0) {
     1070        sos[iRow]=1;
     1071        rhs[iRow]=1.0;
     1072      }
    10671073      if( slackCost[iRow] == 1.0e30) {
    10681074        slackCost[iRow]=0.0;
    10691075      } else {
    10701076        offset2 += slackCost[iRow];
    1071         rhs[iRow] = -2.0;
     1077        sos[iRow] = 2;
    10721078      }
    10731079    }
     
    10951101    double * rowActivity = new double[numberRows];
    10961102    memset(rowActivity, 0, numberRows*sizeof(double));
    1097     if ((algorithm_&2)==0) {
     1103    if ((algorithm_&(2|4))==0) {
    10981104      // get solution as small as possible
    10991105      for (iColumn = 0; iColumn < numberColumns; iColumn++)
     
    11151121      }
    11161122    }
     1123    // get row activity
     1124    for (iColumn = 0; iColumn < numberColumns; iColumn++) {
     1125      CoinBigIndex j;
     1126      double value = newSolution[iColumn];
     1127      for (j = columnStart[iColumn];
     1128           j < columnStart[iColumn] + columnLength[iColumn]; j++) {
     1129        int iRow = row[j];
     1130        rowActivity[iRow] += value * element[j];
     1131      }
     1132    }
    11171133    double * contribution = new double [numberColumns];
    11181134    int * which = new int [numberColumns];
     
    11231139      double forSort = 0.0;
    11241140      bool hasSlack=false;
     1141      bool willFit=true;
    11251142      newSolutionValue += value * cost;
    11261143      for (j = columnStart[iColumn];
    11271144           j < columnStart[iColumn] + columnLength[iColumn]; j++) {
    11281145        int iRow = row[j];
    1129         rowActivity[iRow] += value * element[j];
    1130         if (rhs[iRow] >0.0) {
    1131           forSort += element[j];
    1132         } else  if (rhs[iRow] == -2.0) {
     1146        if (sos[iRow] == 2)
    11331147          hasSlack = true;
    1134         }
     1148        forSort += element[j];
     1149        double gap = rhs[iRow] - rowActivity[iRow]+1.0e-8;
     1150        if (gap<element[j])
     1151          willFit = false;
    11351152      }
    1136       if (forSort && value == 0.0 && columnUpper[iColumn]) {
     1153      bool isSlack = hasSlack && (columnLength[iColumn]==1);
     1154      if ((algorithm_&4)!=0)
     1155        forSort=1.0;
     1156      // Use smallest cost if will fit
     1157      if (willFit && hasSlack &&
     1158          value == 0.0 && columnUpper[iColumn]) {
    11371159        if (hasSlack) {
    1138           if (cost>=0.0) {
     1160          if (cost>0.0) {
    11391161            forSort = 2.0e30;
     1162          } else if (cost==0.0) {
     1163            if (!isSlack)
     1164              forSort = 1.0e29;
     1165            else
     1166              forSort = 1.0e28;
    11401167          } else {
    11411168            forSort = cost/forSort;
     
    11631190           j < columnStart[iColumn] + columnLength[iColumn]; j++) {
    11641191        int iRow = row[j];
    1165         if (rhs[iRow]<0.0&&rowActivity[iRow]) {
     1192        if (sos[iRow]&&rowActivity[iRow]) {
    11661193          possible = false;
    1167         } else if (rhs[iRow]>=0.0) {
     1194        } else {
    11681195          double gap = rhs[iRow] - rowActivity[iRow]+1.0e-8;
    11691196          if (gap<element[j])
     
    11831210      }
    11841211    }
     1212    delete [] sos;
    11851213    if (newSolutionValue < solutionValue) {
    11861214        // check feasible
Note: See TracChangeset for help on using the changeset viewer.