Randomization: Explicitly use MersenneTwister; allow other RNGs

update-deps
Alinson S. Xavier 3 years ago
parent 2367e5a348
commit 58a7567c16

@ -118,11 +118,12 @@ Base.@kwdef struct Randomization
end end
function _randomize_costs( function _randomize_costs(
rng,
instance::UnitCommitmentInstance, instance::UnitCommitmentInstance,
distribution, distribution,
)::Nothing )::Nothing
for unit in instance.units for unit in instance.units
α = rand(distribution) α = rand(rng, distribution)
unit.min_power_cost *= α unit.min_power_cost *= α
for k in unit.cost_segments for k in unit.cost_segments
k.cost *= α k.cost *= α
@ -135,10 +136,11 @@ function _randomize_costs(
end end
function _randomize_load_share( function _randomize_load_share(
rng,
instance::UnitCommitmentInstance, instance::UnitCommitmentInstance,
distribution, distribution,
)::Nothing )::Nothing
α = rand(distribution, length(instance.buses)) α = rand(rng, distribution, length(instance.buses))
for t in 1:instance.time for t in 1:instance.time
total = sum(bus.load[t] for bus in instance.buses) total = sum(bus.load[t] for bus in instance.buses)
den = sum( den = sum(
@ -153,6 +155,7 @@ function _randomize_load_share(
end end
function _randomize_load_profile( function _randomize_load_profile(
rng,
instance::UnitCommitmentInstance, instance::UnitCommitmentInstance,
params::Randomization, params::Randomization,
)::Nothing )::Nothing
@ -161,12 +164,13 @@ function _randomize_load_profile(
for t in 2:instance.time for t in 2:instance.time
idx = (t - 1) % length(params.load_profile_mu) + 1 idx = (t - 1) % length(params.load_profile_mu) + 1
gamma = rand( gamma = rand(
rng,
Normal(params.load_profile_mu[idx], params.load_profile_sigma[idx]), Normal(params.load_profile_mu[idx], params.load_profile_sigma[idx]),
) )
push!(system_load, system_load[t-1] * gamma) push!(system_load, system_load[t-1] * gamma)
end end
capacity = sum(maximum(u.max_power) for u in instance.units) capacity = sum(maximum(u.max_power) for u in instance.units)
peak_load = rand(params.peak_load) * capacity peak_load = rand(rng, params.peak_load) * capacity
system_load = system_load ./ maximum(system_load) .* peak_load system_load = system_load ./ maximum(system_load) .* peak_load
# Scale bus loads to match the new system load # Scale bus loads to match the new system load
@ -186,22 +190,24 @@ end
function randomize!( function randomize!(
instance::UnitCommitment.UnitCommitmentInstance, instance::UnitCommitment.UnitCommitmentInstance,
method::XavQiuAhm2021.Randomization, method::XavQiuAhm2021.Randomization,
rng = MersenneTwister(),
)::Nothing )::Nothing
Randomize costs and loads based on the method described in XavQiuAhm2021. Randomize costs and loads based on the method described in XavQiuAhm2021.
""" """
function randomize!( function randomize!(
instance::UnitCommitment.UnitCommitmentInstance, instance::UnitCommitment.UnitCommitmentInstance,
method::XavQiuAhm2021.Randomization, method::XavQiuAhm2021.Randomization;
rng = MersenneTwister(),
)::Nothing )::Nothing
if method.randomize_costs if method.randomize_costs
XavQiuAhm2021._randomize_costs(instance, method.cost) XavQiuAhm2021._randomize_costs(rng, instance, method.cost)
end end
if method.randomize_load_share if method.randomize_load_share
XavQiuAhm2021._randomize_load_share(instance, method.load_share) XavQiuAhm2021._randomize_load_share(rng, instance, method.load_share)
end end
if method.randomize_load_profile if method.randomize_load_profile
XavQiuAhm2021._randomize_load_profile(instance, method) XavQiuAhm2021._randomize_load_profile(rng, instance, method)
end end
return return
end end

@ -6,6 +6,7 @@ import Random
import UnitCommitment: XavQiuAhm2021 import UnitCommitment: XavQiuAhm2021
using Distributions using Distributions
using Random
using UnitCommitment, Cbc, JuMP using UnitCommitment, Cbc, JuMP
get_instance() = UnitCommitment.read_benchmark("matpower/case118/2017-02-01") get_instance() = UnitCommitment.read_benchmark("matpower/case118/2017-02-01")
@ -27,10 +28,10 @@ test_approx(x, y) = @test isapprox(x, y, atol = 1e-3)
prev_system_load = system_load(instance) prev_system_load = system_load(instance)
test_approx(bus.load[1] / prev_system_load[1], 0.012) test_approx(bus.load[1] / prev_system_load[1], 0.012)
Random.seed!(42)
randomize!( randomize!(
instance, instance,
XavQiuAhm2021.Randomization(randomize_load_profile = false), XavQiuAhm2021.Randomization(randomize_load_profile = false),
rng = MersenneTwister(42),
) )
# Check randomized costs # Check randomized costs
@ -53,8 +54,11 @@ test_approx(x, y) = @test isapprox(x, y, atol = 1e-3)
@test round.(system_load(instance), digits = 1)[1:8] @test round.(system_load(instance), digits = 1)[1:8]
[3059.5, 2983.2, 2937.5, 2953.9, 3073.1, 3356.4, 4068.5, 4018.8] [3059.5, 2983.2, 2937.5, 2953.9, 3073.1, 3356.4, 4068.5, 4018.8]
Random.seed!(42) randomize!(
randomize!(instance, XavQiuAhm2021.Randomization()) instance,
XavQiuAhm2021.Randomization(),
rng = MersenneTwister(42),
)
# Check randomized load profile # Check randomized load profile
@test round.(system_load(instance), digits = 1)[1:8] @test round.(system_load(instance), digits = 1)[1:8]

Loading…
Cancel
Save