Changeset 1589 for trunk/Cbc


Ignore:
Timestamp:
Jan 28, 2011 4:16:51 AM (9 years ago)
Author:
forrest
Message:

allow SOS greedy with 0-1

File:
1 edited

Legend:

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

    r1587 r1589  
    989989    const CoinBigIndex * columnStart = matrix_.getVectorStarts();
    990990    const int * columnLength = matrix_.getVectorLengths();
     991    int * sosRow = new int [numberColumns];
    991992    // If bit set then use current
    992993    if ((algorithm_&1)!=0) {
     
    10171018        CoinBigIndex j;
    10181019        int nSOS=0;
    1019         if (!solver->isInteger(iColumn))
    1020           good = false;
     1020        int iSOS=-1;
    10211021        for (j = columnStart[iColumn];
    10221022             j < columnStart[iColumn] + columnLength[iColumn]; j++) {
     
    10271027            if (element[j] != 1.0)
    10281028              good = false;
     1029            iSOS=iRow;
    10291030            nSOS++;
    10301031          }
    10311032        }
    1032         if (nSOS!=1)
     1033        if (nSOS>1||!solver->isBinary(iColumn))
    10331034          good = false;
     1035        sosRow[iColumn] = iSOS;
    10341036      }
    10351037      if (!good) {
    10361038        delete [] rhs;
     1039        delete [] sosRow;
    10371040        setWhen(0); // switch off
    10381041        return 0;
    10391042      }
     1043    } else {
     1044      abort(); // not allowed yet
    10401045    }
    10411046    const double * solution = solver->getColSolution();
     
    10551060    // Take off cost of gub slack
    10561061    for (int iColumn = 0; iColumn < numberColumns; iColumn++) {
    1057       if (columnLength[iColumn] == 1) {
     1062      int iRow = sosRow[iColumn];
     1063      if (columnLength[iColumn] == 1&&iRow>=0) {
    10581064        // SOS slack
    10591065        double cost = direction*objective[iColumn];
    1060         int iRow = row[columnStart[iColumn]];
    10611066        assert (rhs[iRow]<0.0);
    10621067        slackCost[iRow]=CoinMin(slackCost[iRow],cost);
     
    11551160        forSort=1.0;
    11561161      // Use smallest cost if will fit
    1157       if (willFit && hasSlack &&
     1162      if (willFit /*&& hasSlack*/ &&
    11581163          value == 0.0 && columnUpper[iColumn]) {
    11591164        if (hasSlack) {
     
    12491254        }
    12501255    }
     1256    delete [] sosRow;
    12511257    delete [] newSolution;
    12521258    delete [] rowActivity;
     
    13201326            CoinBigIndex j;
    13211327            int nSOS=0;
    1322             if (!solver->isInteger(iColumn))
    1323               good = false;
    13241328            for (j = columnStart[iColumn];
    13251329                    j < columnStart[iColumn] + columnLength[iColumn]; j++) {
     
    13331337                }
    13341338            }
    1335             if (nSOS!=1)
     1339            if (nSOS>1||!solver->isBinary(iColumn))
    13361340              good = false;
    13371341        }
Note: See TracChangeset for help on using the changeset viewer.