Skip to content

Commit a1ab98e

Browse files
committed
Simplify and correct logic. Apply only to subset of heur
1 parent ec06da6 commit a1ab98e

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

highs/mip/HighsMipSolverData.cpp

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,20 +1367,10 @@ bool HighsMipSolverData::oneOptImprovement(std::vector<double>& sol,
13671367
double& solobj) {
13681368
bool success = false;
13691369
for (const HighsInt col : integer_cols) {
1370-
double max_movement = kHighsInf;
1371-
if (mipsolver.model_->col_cost_[col] > 0 &&
1372-
sol[col] > domain.col_lower_[col] + feastol) {
1373-
max_movement = 0;
1374-
} else if (mipsolver.model_->col_cost_[col] < 0 &&
1375-
sol[col] < domain.col_upper_[col] - feastol) {
1376-
max_movement = 0;
1377-
} else if (mipsolver.model_->col_cost_[col] == 0) {
1378-
max_movement = 0;
1379-
}
1380-
if (max_movement == 0) continue;
1370+
if (mipsolver.model_->col_cost_[col] == 0) continue;
13811371
HighsInt dir = mipsolver.model_->col_cost_[col] > 0 ? 1 : -1;
1382-
max_movement = dir == 1 ? sol[col] - domain.col_lower_[col]
1383-
: domain.col_upper_[col] - sol[col];
1372+
double max_movement = dir == 1 ? sol[col] - domain.col_lower_[col]
1373+
: domain.col_upper_[col] - sol[col];
13841374
if (max_movement < 1 - feastol) continue;
13851375
const HighsInt start = mipsolver.model_->a_matrix_.start_[col];
13861376
const HighsInt end = mipsolver.model_->a_matrix_.start_[col + 1];
@@ -1435,18 +1425,22 @@ bool HighsMipSolverData::oneOptImprovement(std::vector<double>& sol,
14351425
max_movement = 0;
14361426
}
14371427
}
1438-
// Only move by integer amounts
1439-
max_movement = floor(max_movement + feastol);
1440-
if (max_movement <= 0) {
1428+
if (max_movement < 1 - feastol) {
14411429
break;
14421430
}
14431431
}
1444-
if (max_movement >= 1) {
1432+
if (max_movement >= 1 - feastol) {
1433+
if (max_movement >= kHighsInf) {
1434+
// instance is unbounded
1435+
printf("ONEOPT IS UNBOUNDED!!\n");
1436+
return false;
1437+
}
14451438
sol[col] -= dir * max_movement;
14461439
success = true;
14471440
}
14481441
}
14491442
if (success) {
1443+
printf("ONEOPT DID SOMETHING!!!!\n");
14501444
solobj = transformNewIntegerFeasibleSolution(sol, true);
14511445
}
14521446
return success;
@@ -1480,7 +1474,14 @@ bool HighsMipSolverData::addIncumbent(const std::vector<double>& sol,
14801474
bool one_opt_success = false;
14811475
double one_opt_transformed_solobj = transformed_solobj;
14821476
std::vector<double> one_opt_sol;
1483-
if (possibly_store_as_new_incumbent && transformed_solobj != kHighsInf) {
1477+
if (possibly_store_as_new_incumbent && transformed_solobj != kHighsInf &&
1478+
(solution_source == kSolutionSourceRandomizedRounding ||
1479+
solution_source == kSolutionSourceFeasibilityJump ||
1480+
solution_source == kSolutionSourceTrivialZ ||
1481+
solution_source == kSolutionSourceTrivialL ||
1482+
solution_source == kSolutionSourceTrivialU ||
1483+
solution_source == kSolutionSourceTrivialP ||
1484+
solution_source == kSolutionSourceCentralRounding)) {
14841485
one_opt_sol = sol;
14851486
one_opt_success =
14861487
oneOptImprovement(one_opt_sol, one_opt_transformed_solobj);

0 commit comments

Comments
 (0)