平衡三值化
契约
BalanceTernaryzationFunction 将线性表达式映射为
端点 null/None),在注册模型中不可行。无法计算输入表达式时也不返回结果。
API
kotlin
BalanceTernaryzationFunction(
x: LinearPolynomial<V>,
epsilon: Flt64 = Flt64(1e-6),
converter: IntoValue<V>,
name: String = "bter",
displayName: String? = null,
fallbackBigM: Flt64 = Flt64(1e6),
strictBoundary: Flt64 = Flt64(NONZERO_TOLERANCE)
)rust
BalanceTernaryzationFunction::new(
id: u64,
name: &str,
input: Linear<V>,
epsilon: V,
fallback_big_m: V,
) -> Self两端实现都公开结果变量以及互斥的正、负二值变量。实现会优先根据输入推导有限界;只有无法推导时才使用回退 Big-M。
实际传给求解器的数学模型
令 1e-10)。生成的模型为
因此,
最小示例
kotlin
import fuookami.ospf.kotlin.core.solver.value.IntoValue
import fuookami.ospf.kotlin.core.symbol.function.BalanceTernaryzationFunction
import fuookami.ospf.kotlin.math.algebra.number.Flt64
import fuookami.ospf.kotlin.math.symbol.polynomial.LinearPolynomial
val function = BalanceTernaryzationFunction(
x = LinearPolynomial(emptyList(), Flt64(2.0)),
epsilon = Flt64(0.1),
converter = IntoValue.Identity,
name = "direction"
)
check(function.evaluate(emptyMap()) == Flt64.one)rust
use ospf_rust_core::symbol::FunctionSymbol;
use ospf_rust_core::symbol::flatten::Linear;
use ospf_rust_core::symbol::function::BalanceTernaryzationFunction;
use ospf_rust_core::token::VecTokenList;
let function = BalanceTernaryzationFunction::new(
1,
"direction",
Linear::new(vec![], 2.0),
0.1,
1_000_000.0,
);
let tokens = VecTokenList::<f64>::new();
assert_eq!(function.calculate_value(&tokens, false), Some(1.0));