Ignore:
Timestamp:
Jul 29, 2013 4:56:04 AM (6 years ago)
Author:
forrest
Message:

adding a dubious heuristic

File:
1 edited

Legend:

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

    r1944 r1945  
    833833                        } else if (numberColumns>numberIntegersOrig) {
    834834                          // relax continuous
     835                          bool takeHint;
     836                          OsiHintStrength strength;
     837                          solver->getHintParam(OsiDoDualInResolve, takeHint, strength);
     838                          //solver->setHintParam(OsiDoReducePrint, false, OsiHintTry);
     839                          solver->setHintParam(OsiDoDualInResolve, false, OsiHintDo);
     840                          //solver->setHintParam(OsiDoScale, false, OsiHintDo);
    835841                          solver->resolve();
     842                          solver->setHintParam(OsiDoDualInResolve, takeHint, strength);
    836843                          if (solver->isProvenOptimal()) {
    837844                            memcpy(newSolution,solver->getColSolution(),
    838845                                   numberColumns*sizeof(double));
    839846                            newSolutionValue = -saveOffset;
    840                             for (  i = 0 ; i < numberColumns ; i++ )
     847                            for (  i = 0 ; i < numberColumns ; i++ ) {
    841848                              newSolutionValue += saveObjective[i] * newSolution[i];
     849                            }
    842850                            newSolutionValue *= direction;
    843851                            sprintf(pumpPrint, "Relaxing continuous gives %g", newSolutionValue);
     852                            //#define DEBUG_BEST
     853#ifdef DEBUG_BEST
     854                            {
     855                              int numberColumns=solver->getNumCols();
     856                              FILE * fp = fopen("solution.data2","wb");
     857                              printf("Solution data on file solution.data2\n");
     858                              size_t numberWritten;
     859                              numberWritten=fwrite(&numberColumns,sizeof(int),1,fp);
     860                              assert (numberWritten==1);
     861                              numberWritten=fwrite(&newSolutionValue,sizeof(double),1,fp);
     862                              assert (numberWritten==1);
     863                              numberWritten=fwrite(newSolution,sizeof(double),numberColumns,fp);
     864                              assert (numberWritten==numberColumns);
     865                              fclose(fp);
     866                              const double * rowLower = solver->getRowLower();
     867                              const double * rowUpper = solver->getRowUpper();
     868                              const double * columnLower = solver->getColLower();
     869                              const double * columnUpper = solver->getColUpper();
     870                              int numberRows = solver->getNumRows() ;
     871                              double *rowActivity = new double[numberRows] ;
     872                              memset(rowActivity, 0, numberRows*sizeof(double)) ;
     873                              const double * element = solver->getMatrixByCol()->getElements();
     874                              const int * row = solver->getMatrixByCol()->getIndices();
     875                              const CoinBigIndex * columnStart = solver->getMatrixByCol()->getVectorStarts();
     876                              const int * columnLength = solver->getMatrixByCol()->getVectorLengths();
     877                              double largestAway=0.0;
     878                              int away=-1;
     879                              double saveOffset;
     880                              solver->getDblParam(OsiObjOffset, saveOffset);
     881                              double newSolutionValue = -saveOffset;
     882                              const double * objective = solver->getObjCoefficients();
     883                              for ( int iColumn=0 ; iColumn<numberColumns ; ++iColumn ) {
     884                                double value=newSolution[iColumn];
     885                                CoinBigIndex start = columnStart[iColumn];
     886                                CoinBigIndex end = start + columnLength[iColumn];
     887                                for (CoinBigIndex j = start; j < end; j++) {
     888                                  int iRow = row[j];
     889                                  if (iRow==1996)
     890                                    printf("fp col %d val %g el %g old y %g\n",
     891                                  iColumn,value,element[j],rowActivity[iRow]);
     892                                  rowActivity[iRow] += value * element[j];
     893                                }
     894                                newSolutionValue += objective[iColumn] * newSolution[iColumn];
     895                                if (solver->isInteger(iColumn)) {
     896                                  double intValue = floor(value+0.5);
     897                                  if (fabs(value-intValue)>largestAway) {
     898                                    largestAway=fabs(value-intValue);
     899                                    away=iColumn;
     900                                  }
     901                                }
     902                              }
     903                              printf("Largest away from int at column %d was %g - obj %g\n",away,
     904                                     largestAway,newSolutionValue);
     905                              double largestInfeasibility=0.0;
     906                              for (int i = 0 ; i < numberRows ; i++) {
     907#if 0 //def CLP_INVESTIGATE
     908                                double inf;
     909                                inf = rowLower[i] - rowActivity[i];
     910                                if (inf > primalTolerance)
     911                                  printf("Row %d inf %g sum %g %g <= %g <= %g\n",
     912                                         i, inf, rowSum[i], rowLower[i], rowActivity[i], rowUpper[i]);
     913                                inf = rowActivity[i] - rowUpper[i];
     914                                if (inf > primalTolerance)
     915                                  printf("Row %d inf %g %g <= %g <= %g\n",
     916                                         i, inf, rowLower[i], rowActivity[i], rowUpper[i]);
     917#endif
     918                                double infeasibility = CoinMax(rowActivity[i]-rowUpper[i],
     919                                                               rowLower[i]-rowActivity[i]);
     920                                if (infeasibility>largestInfeasibility) {
     921                                  largestInfeasibility = infeasibility;
     922                                  printf("Binf of %g on row %d\n",
     923                                         infeasibility,i);
     924                                }
     925                              }
     926                              delete [] rowActivity ;
     927                              printf("Blargest infeasibility is %g - obj %g\n", largestInfeasibility,newSolutionValue);
     928                            }
     929#endif
    844930                          } else {
    845931                            sprintf(pumpPrint,"Infeasible when relaxing continuous!\n");
Note: See TracChangeset for help on using the changeset viewer.