Skip to content

Commit 5f29047

Browse files
committed
Advance dynamic assortment
1 parent e8057cf commit 5f29047

File tree

8 files changed

+250
-205
lines changed

8 files changed

+250
-205
lines changed

src/DecisionFocusedLearningBenchmarks.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,11 @@ using .DynamicAssortment
7171
# Interface
7272
export AbstractBenchmark, AbstractStochasticBenchmark, AbstractDynamicBenchmark, DataSample
7373

74-
export generate_sample, generate_dataset, generate_environments
74+
export generate_sample, generate_dataset, generate_environments, generate_environment
7575
export generate_scenario_generator, generate_anticipative_solver
7676
export generate_statistical_model
7777
export generate_maximizer, maximizer_kwargs
78+
export is_exogenous, is_endogenous
7879

7980
export objective_value
8081
export plot_data, plot_instance, plot_solution

src/DynamicAssortment/DynamicAssortment.jl

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,69 @@ using Random: Random, AbstractRNG, MersenneTwister
1010
using Statistics: mean
1111

1212
using Flux: Chain, Dense
13-
# using Flux.Optimise
14-
# using InferOpt
15-
# using Random
16-
# using JLD2
17-
# using Plots
18-
# using Distributions
19-
# using LinearAlgebra
2013
using Combinatorics: combinations
2114

15+
"""
16+
$TYPEDEF
17+
18+
Benchmark for the dynamic assortment problem.
19+
20+
# Fields
21+
$TYPEDFIELDS
22+
"""
23+
struct DynamicAssortmentBenchmark{exogenous,M} <: AbstractDynamicBenchmark{exogenous}
24+
"customer choice model (price, hype, saturation, and features)"
25+
customer_choice_model::M
26+
"number of items"
27+
N::Int
28+
"dimension of feature vectors (in addition to hype, satisfaction, and price)"
29+
d::Int
30+
"assortment size constraint"
31+
K::Int
32+
"number of steps per episode"
33+
max_steps::Int
34+
end
35+
36+
function DynamicAssortmentBenchmark(;
37+
N=20,
38+
d=2,
39+
K=4,
40+
max_steps=80,
41+
customer_choice_model=Chain(Dense([-0.8 0.6 -0.4 0.3 0.5]), vec),
42+
exogenous=false,
43+
)
44+
return DynamicAssortmentBenchmark{exogenous,typeof(customer_choice_model)}(
45+
customer_choice_model, N, d, K, max_steps
46+
)
47+
end
48+
49+
include("instance.jl")
2250
include("environment.jl")
2351

24-
struct DynamicAssortmentBenchmark <: AbstractDynamicBenchmark end
52+
customer_choice_model(b::DynamicAssortmentBenchmark) = b.customer_choice_model
53+
item_count(b::DynamicAssortmentBenchmark) = b.N
54+
feature_count(b::DynamicAssortmentBenchmark) = b.d
55+
assortment_size(b::DynamicAssortmentBenchmark) = b.K
56+
max_steps(b::DynamicAssortmentBenchmark) = b.max_steps
57+
58+
function Utils.generate_sample(
59+
b::DynamicAssortmentBenchmark, rng::AbstractRNG=MersenneTwister(0); seed=nothing
60+
)
61+
Random.seed!(rng, seed)
62+
return DataSample(; instance=Instance(b, rng))
63+
end
2564

26-
function Utils.generate_sample(::DynamicAssortmentBenchmark)
27-
return DataSample(; instance=Instance())
65+
function Utils.generate_maximizer(b::DynamicAssortmentBenchmark)
66+
return TopKMaximizer(assortment_size(b))
2867
end
2968

30-
function Utils.generate_maximizer(::DynamicAssortmentBenchmark)
31-
return DAP_optimization
69+
function Utils.generate_environment(
70+
::DynamicAssortmentBenchmark,
71+
instance::Instance;
72+
seed=nothing,
73+
rng::AbstractRNG=MersenneTwister(seed),
74+
)
75+
return Environment(instance; seed=seed, rng=rng)
3276
end
3377

3478
export DynamicAssortmentBenchmark

0 commit comments

Comments
 (0)