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.
55 lines
1.5 KiB
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
|