All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
heur_intshifting.c
Go to the documentation of this file.
17 * @brief LP rounding heuristic that tries to recover from intermediate infeasibilities, shifts integer variables, and
22 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
143 assert(SCIPvarGetType(var) == SCIP_VARTYPE_BINARY || SCIPvarGetType(var) == SCIP_VARTYPE_INTEGER);
198 /** returns an integer variable, that pushes activity of the row in the given direction with minimal negative impact on
200 * if variables have equal impact, chooses the one with best objective value improvement in corresponding direction;
201 * prefer fractional integers over other variables in order to become integral during the process;
202 * shifting in a direction is forbidden, if this forces the objective value over the upper bound, or if the variable
241 activitydelta = (direction == +1 ? SCIProwGetLhs(row) - rowactivity : SCIProwGetRhs(row) - rowactivity);
306 assert(shiftval <= solval); /* may be equal due to numerical digit erasement in the subtraction */
324 assert(shiftval >= solval); /* may be equal due to numerical digit erasement in the subtraction */
349 /** returns a fractional variable, that has most impact on rows in opposite direction, i.e. that is most crucial to
351 * if variables have equal impact, chooses the one with best objective value improvement in corresponding direction;
358 SCIP_Real minobj, /**< minimal objective value possible after shifting remaining fractional vars */
387 assert(SCIPvarGetType(var) == SCIP_VARTYPE_BINARY || SCIPvarGetType(var) == SCIP_VARTYPE_INTEGER);
400 if( (nlocks > maxnlocks || deltaobj < bestdeltaobj) && minobj - obj < SCIPgetCutoffbound(scip) )
416 if( (nlocks > maxnlocks || deltaobj < bestdeltaobj) && minobj + obj < SCIPgetCutoffbound(scip) )
431 /** adds a given value to the fractionality counters of the rows in which the given variable appears */
516 /** solving process initialization method of primal heuristic (called when branch and bound process is about to begin) */
623 SCIPdebugMessage("executing intshifting heuristic: %d LP rows, %d fractionals\n", nlprows, nfrac);
638 /* get the minimal and maximal activity for all globally valid rows for continuous variables in their full range;
639 * these are the values of a*x' with x' being the LP solution for integer variables and the lower or upper bound
746 bestshiftval = obj > 0.0 ? SCIPfeasFloor(scip, lpcandssol[c]) : SCIPfeasCeil(scip, lpcandssol[c]);
754 while( (nfrac > 0 || nviolrows > 0) && nnonimprovingshifts < MAXSHIFTINGS && !SCIPisStopped(scip) )
762 SCIPdebugMessage("intshifting heuristic: nfrac=%d, nviolrows=%d, obj=%g (best possible obj: %g), cutoff=%g\n",
769 * - if a violated row exists, shift a variable decreasing the violation, that has least impact on other rows
770 * - otherwise, shift a variable, that has strongest devastating impact on rows in opposite direction
808 SCIProwGetName(row), SCIProwGetLhs(row), minactivities[rowpos], maxactivities[rowpos], SCIProwGetRhs(row));
817 SCIP_CALL( selectShifting(scip, sol, row, direction == +1 ? maxactivities[rowpos] : minactivities[rowpos],
824 SCIP_CALL( selectEssentialRounding(scip, sol, minobj, lpcands, nlpcands, &shiftvar, &oldsolval, &newsolval) );
834 assert(SCIPvarGetType(shiftvar) == SCIP_VARTYPE_BINARY || SCIPvarGetType(shiftvar) == SCIP_VARTYPE_INTEGER);
836 SCIPdebugMessage("intshifting heuristic: -> shift var <%s>[%g,%g], type=%d, oldval=%g, newval=%g, obj=%g\n",
837 SCIPvarGetName(shiftvar), SCIPvarGetLbGlobal(shiftvar), SCIPvarGetUbGlobal(shiftvar), SCIPvarGetType(shiftvar),
841 SCIP_CALL( updateActivities(scip, minactivities, maxactivities, violrows, violrowpos, &nviolrows, nlprows,
854 /* update fractionality counter and minimal objective value possible after shifting remaining variables */
865 /* the rounding was already calculated into the minobj -> update only if rounding in "wrong" direction */
900 SCIPdebugMessage("intshifting heuristic: -> nfrac=%d, nviolrows=%d, obj=%g (best possible obj: %g)\n",
904 /* check, if the new solution is potentially feasible and solve the LP to calculate values for the continuous
917 SCIPdebugMessage("shifted solution is potentially feasible -> solve LP to fix continuous variables\n");
933 for( v = 0; v < nintvars; ++v ) /* apply this after global bounds to not cause an error with intermediate empty domains */
945 SCIPdebugMessage(" -> old LP iterations: %"SCIP_LONGINT_FORMAT"\n", SCIPgetNLPIterations(scip));
947 /* Errors in the LP solver should not kill the overall solving process, if the LP is just needed for a heuristic.
948 * Hence in optimized mode, the return code is caught and a warning is printed, only in debug mode, SCIP will stop.
954 SCIPwarningMessage(scip, "Error while solving LP in Intshifting heuristic; LP solve terminated with code <%d>\n",retstat);
960 SCIPdebugMessage(" -> new LP iterations: %"SCIP_LONGINT_FORMAT"\n", SCIPgetNLPIterations(scip));
|