-
Notifications
You must be signed in to change notification settings - Fork 49
Open
Labels
documentationImprovements or additions to documentationImprovements or additions to documentation
Description
The macros are great for small problems but anything a bit bigger or dynamic needs the non-macro approach. Here's a snippet of something I just did, not sure if there's a better way.
let mut vars = ProblemVariables::new();
let to_grid = vars.add_vector(variable().min(0.0).max(grid_out), rows);
let to_grid_ismax = vars.add_vector(variable().binary(), rows);
let clip = vars.add_vector(variable().min(0.0).max(max_clip), rows);
//soc balance rule
let lhs = charge[0] * rte[0] - discharge[0];
constraints.push(lhs.eq(soc[0]).set_name("soc_balance_rule_0".to_string()));
(1..rows).into_iter().for_each(|t| {
let lhs = soc[t - 1] + charge[t] * rte[t] - discharge[t];
constraints.push(lhs.eq(soc[t]).set_name(format!("soc_balance_rule_{}", t)));
});
let objective = (0..rows).into_iter().fold(Expression::from(0), |acc, t| {
acc + to_grid[t] * prices[t] - genr[t] * ppa_price + clip[t] * ppa_price
});
let mut solver = vars.maximise(objective).using(default_solver);
for c in constraints {
solver.add_constraint(c);
}
let solution = solver.solve()?;Metadata
Metadata
Assignees
Labels
documentationImprovements or additions to documentationImprovements or additions to documentation