You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MIPLearn.jl/src/bb/varbranch/infeasibility.jl

55 lines
1.5 KiB

# MIPLearn: Extensible Framework for Learning-Enhanced Mixed-Integer Optimization
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
# Released under the modified BSD license. See COPYING.md for more details.
"""
FirstInfeasibleBranching()
Branching rule that always selects the first fractional variable.
"""
struct FirstInfeasibleBranching <: VariableBranchingRule end
function find_branching_var(
rule::FirstInfeasibleBranching,
node::Node,
pool::NodePool,
)::Variable
return node.fractional_variables[1]
end
"""
LeastInfeasibleBranching()
Branching strategy that select the fractional variable whose value is the closest
to an integral value.
"""
struct LeastInfeasibleBranching <: VariableBranchingRule end
function find_branching_var(
rule::LeastInfeasibleBranching,
node::Node,
pool::NodePool,
)::Variable
scores = [max(v - floor(v), ceil(v) - v) for v in node.fractional_values]
_, max_offset = findmax(scores)
return node.fractional_variables[max_offset]
end
"""
MostInfeasibleBranching()
Branching strategy that selects the fractional variable whose value is closest
to 1/2.
"""
struct MostInfeasibleBranching <: VariableBranchingRule end
function find_branching_var(
rule::MostInfeasibleBranching,
node::Node,
pool::NodePool,
)::Variable
scores = [min(v - floor(v), ceil(v) - v) for v in node.fractional_values]
_, max_offset = findmax(scores)
return node.fractional_variables[max_offset]
end