二次模型中的区间松弛
QuadraticSlackRangeFunction 精确表示二次表达式到闭区间
构造器要求 lower <= upper。
求解器数学模型
令
因此区间内部结果为零,区间外结果为精确的单侧违反量。
Kotlin API
Kotlin 提供原生二次符号:
kotlin
val slack = QuadraticSlackRangeFunction(
input = inputQuadratic,
lower = Flt64(1.0),
upper = Flt64(2.0),
bigM = Flt64(100.0),
converter = IntoValue.Identity,
name = "quadratic-slack-range"
)对于线性表达式,使用 SlackRangeFunction(input, lower, upper, bigM, converter, name);它同样使用精确最大值模型,并公开内部 MaxFunction 的结果多项式。
Rust API
rust
let slack = QuadraticSlackRangeFunction::new(
23, "quadratic_slack_range", input, 1.0_f64, 2.0_f64,
);
assert_eq!(slack.calculate_value(&tokens, false), Some(1.0));当输入不含二次项时,精确的线性区间距离模型直接使用原始线性输入;真正含二次项的输入会先获得一个有符号线性桥接变量和一条二次桥接等式。with_big_m 可提供显式 Big-M;否则在可用时使用已注册的 token 边界。result_variable() 是连续变量。
Kotlin/Rust 示例
kotlin
import fuookami.ospf.kotlin.core.solver.value.IntoValue
import fuookami.ospf.kotlin.core.symbol.function.QuadraticSlackRangeFunction
import fuookami.ospf.kotlin.math.algebra.number.Flt64
val slack = QuadraticSlackRangeFunction(
input = inputQuadratic,
lower = Flt64(1.0),
upper = Flt64(2.0),
bigM = Flt64(100.0),
converter = IntoValue.Identity,
name = "quadratic-slack-range"
)
check(slack.evaluate(values, null, IntoValue.Identity) == Flt64(1.0))rust
use ospf_rust_core::symbol::FunctionSymbol;
use ospf_rust_core::symbol::function::QuadraticSlackRangeFunction;
let slack = QuadraticSlackRangeFunction::new(
23, "quadratic_slack_range", input, 1.0_f64, 2.0_f64,
);
assert_eq!(slack.calculate_value(&tokens, false), Some(1.0));测试与参考
- Kotlin:
QuadraticSlackRangeFunctionTest.kt - Kotlin 实现:
QuadraticSlackRange.kt - Rust 实现:
quadratic_function.rs - Rust 辅助/行聚焦测试:
function_symbol_quadratic_slack_range.rs - Rust 线性区间实现:
slack_range.rs