mirror of
https://github.com/ANL-CEEESA/UnitCommitment.jl.git
synced 2025-12-06 00:08:52 -06:00
Randomization: Explicitly use MersenneTwister; allow other RNGs
This commit is contained in:
@@ -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] ≈
|
||||||
|
|||||||
Reference in New Issue
Block a user