current work on making operator level maximization as opposed to just the planner level.

temporaryWork^2
youainti 5 years ago
parent 2414e15735
commit 5d60a23270

@ -69,8 +69,8 @@ end
# ╔═╡ 5b45b29e-f0f4-41e9-91e7-d444687feb4e # ╔═╡ 5b45b29e-f0f4-41e9-91e7-d444687feb4e
#implement survival function #implement survival function
function survival( function survival(
stocks::Array stocks::Array{Float32}
,debris::Array ,debris::Array{Float32}
,physical_model::BasicModel ,physical_model::BasicModel
) )
return exp.( return exp.(
@ -82,9 +82,9 @@ end
# ╔═╡ 152f3a3c-a565-41bb-8e59-6ab0d2315ffb # ╔═╡ 152f3a3c-a565-41bb-8e59-6ab0d2315ffb
#debris evolution #debris evolution
function H( function H(
stocks::Array stocks::Array{Float32}
,debris::Array ,debris::Array{Float32}
,launches::Array ,launches::Array{Float32}
, physical_model::BasicModel , physical_model::BasicModel
) )
#get changes in debris from natural dynamics #get changes in debris from natural dynamics
@ -103,9 +103,9 @@ end
# ╔═╡ 25ac9438-2b1d-4f6b-9ff1-1695e1d52b51 # ╔═╡ 25ac9438-2b1d-4f6b-9ff1-1695e1d52b51
#stock update rules #stock update rules
function G( function G(
stocks::Array stocks::Array{Float32}
,debris::Array ,debris::Array{Float32}
,launches::Array ,launches::Array{Float32}
, physical_model::BasicModel , physical_model::BasicModel
) )
return LinearAlgebra.diagm(survival(stocks,debris,physical_model) .- physical_model.decay_rate)*stocks + launches return LinearAlgebra.diagm(survival(stocks,debris,physical_model) .- physical_model.decay_rate)*stocks + launches
@ -117,42 +117,44 @@ md"""
""" """
# ╔═╡ f7aabe43-9a2c-4fe0-8099-c29cdf66566c # ╔═╡ f7aabe43-9a2c-4fe0-8099-c29cdf66566c
function value_function_generator(number_params=10) function value_function_generator(number_params=32)
return Flux.Chain( return Flux.Chain(
Flux.Parallel(vcat Flux.Parallel(vcat
#parallel joins together stocks and debris, after a little bit of preprocessing #parallel joins together stocks and debris, after a little bit of preprocessing
,Flux.Chain( ,Flux.Chain(
Flux.Dense(N_constellations, N_states*2,Flux.relu) Flux.Dense(N_constellations, number_params*2,Flux.relu)
,Flux.Dense(N_states*2, N_states*2,Flux.σ) ,Flux.Dense(number_params*2, number_params*2,Flux.σ)
) )
,Flux.Chain( ,Flux.Chain(
Flux.Dense(N_debris, N_states,Flux.relu) Flux.Dense(N_debris, number_params,Flux.relu)
,Flux.Dense(N_states, N_states,Flux.σ) ,Flux.Dense(number_params, number_params,Flux.σ)
) )
) )
#Apply some transformations to the preprocessed data. #Apply some transformations to the preprocessed data.
,Flux.Dense(N_states*3,number_params,Flux.σ) ,Flux.Dense(number_params*3,number_params,Flux.σ)
,Flux.Dense(number_params,number_params,Flux.σ)
,Flux.Dense(number_params,1) ,Flux.Dense(number_params,1)
) )
end end
# ╔═╡ d816b252-bdca-44ba-ac5c-cb21163a1e9a # ╔═╡ d816b252-bdca-44ba-ac5c-cb21163a1e9a
function policy_function_generator(number_params=10) function planner_policy_function_generator(number_params=32)
return Flux.Chain( return Flux.Chain(
Flux.Parallel(vcat Flux.Parallel(vcat
#parallel joins together stocks and debris #parallel joins together stocks and debris
,Flux.Chain( ,Flux.Chain(
Flux.Dense(N_constellations, N_states*2,Flux.relu) Flux.Dense(N_constellations, number_params*2,Flux.relu)
,Flux.Dense(N_states*2, N_states*2,Flux.σ) ,Flux.Dense(number_params*2, number_params*2,Flux.σ)
) )
,Flux.Chain( ,Flux.Chain(
Flux.Dense(N_debris, N_states,Flux.relu) Flux.Dense(N_debris, number_params,Flux.relu)
,Flux.Dense(N_states, N_states) ,Flux.Dense(number_params, number_params)
) )
) )
#Apply some transformations #Apply some transformations
,Flux.Dense(N_states*3,number_params,Flux.σ) ,Flux.Dense(number_params*3,number_params,Flux.σ)
,Flux.Dense(number_params,number_params,Flux.σ)
,Flux.Dense(number_params,N_constellations,Flux.relu) ,Flux.Dense(number_params,N_constellations,Flux.relu)
) )
@ -176,6 +178,12 @@ begin
Flux.@functor Split Flux.@functor Split
(m::Split)(x::AbstractArray) = tuple(map(f -> f(x), m.paths)) (m::Split)(x::AbstractArray) = tuple(map(f -> f(x), m.paths))
struct Duplicate
n::Int
end
Flux.@functor Duplicate
(m::Duplicate)(x::Tuple) = [x for i=1:m.n]
### TESTING ### ### TESTING ###
@ -187,21 +195,55 @@ begin
end end
# ╔═╡ 6a3b5f7a-a535-450f-8c5f-19bdcc280146
function operators_policy_function_generator(number_params=32)
function f()
return Flux.Chain(
Flux.Parallel(vcat
#parallel joins together stocks and debris
,Flux.Chain(
Flux.Dense(N_constellations, number_params,Flux.relu)
,Flux.Dense(number_params, number_params,Flux.σ)
)
,Flux.Chain(
Flux.Dense(N_debris, number_params,Flux.relu)
,Flux.Dense(number_params, number_params)
)
)
#Apply some transformations
,Flux.Dense(number_params*3,number_params,Flux.σ)
,Flux.Dense(number_params,number_params,Flux.σ)
,Flux.Dense(number_params,1,Flux.relu)
)
end
a = [f() for i=1:N_constellations]
Flux.Chain(
Duplicate(N_constellations)
)
end
# ╔═╡ 0ba48a75-36db-4003-95c0-2329d4fb29c5
Duplicate(2)(([1.0f0 2],[3f0]))
# ╔═╡ 340da189-f443-4376-a82d-7699a21ab7a2 # ╔═╡ 340da189-f443-4376-a82d-7699a21ab7a2
abstract type EconomicParameters end abstract type EconomicParameters end
# ╔═╡ 206ac4cc-5102-4381-ad8a-777b02dc4d5a # ╔═╡ 206ac4cc-5102-4381-ad8a-777b02dc4d5a
begin #basic linear model begin #basic linear model
struct EconModel1 <: EconomicParameters struct EconModel1 <: EconomicParameters
β::Real β::Float32
payoff_array::Array{Real} payoff_array::Array{Float32}
policy_costs::Array{Real} policy_costs::Array{Float32}
end end
function payoff1( function payoff1(
s::Vector s::Vector{Float32}
,d::Vector ,d::Vector{Float32}
,a::Vector ,a::Vector{Float32}
,em::EconModel1 ,em::EconModel1
) )
return em.payoff_array*s - em.policy_costs*a return em.payoff_array*s - em.policy_costs*a
@ -212,16 +254,16 @@ end
# ╔═╡ eebb8706-a431-4fd1-b7a5-40f07a63d5cb # ╔═╡ eebb8706-a431-4fd1-b7a5-40f07a63d5cb
begin #basic CES model begin #basic CES model
struct CESParams <: EconomicParameters struct CESParams <: EconomicParameters
β::Real β::Float32
r::Real #elasticity of subsititution r::Float32 #elasticity of subsititution
payoff_array::Array{Real} payoff_array::Array{Float32}
policy_costs::Array{Real} policy_costs::Array{Float32}
debris_costs::Array{Real} debris_costs::Array{Float32}
end end
function CES_with_debris( function CES_with_debris(
s::Vector s::Vector{Float32}
,d::Vector ,d::Vector{Float32}
,a::Vector ,a::Vector{Float32}
,em::CESParams ,em::CESParams
) )
return (em.payoff_array*(s.^em.r) - em.debris_costs*(d.^em.r)).^(1/em.r) - em.policy_costs*a return (em.payoff_array*(s.^em.r) - em.debris_costs*(d.^em.r)).^(1/em.r) - em.policy_costs*a
@ -250,21 +292,25 @@ md"""
""" """
# ╔═╡ 65e0b1fa-d5e1-4ff6-8736-c9d6b5f40150 # ╔═╡ 65e0b1fa-d5e1-4ff6-8736-c9d6b5f40150
em1 = EconModel1(0.95, [1 0 0 0], [5 0 0 0]) begin
#= em1_a = EconModel1(0.95, [1.0 0 0 0], [5 0 0 0])
This is the most basic profit model em1_b = EconModel1(0.95, [0 1.0 0 0], [0 5 0 0])
em1_c = EconModel1(0.95, [0 0 1.0 0], [0 0 5 0])
em1_d = EconModel1(0.95, [0 0 0 1.0], [0 0 0 5])
You earn 1 per operating satellite and it costs 5 per launch. #=
Only interaction is through debris. This is the most basic profit model
=#
You earn 1 per operating satellite and it costs 5 per launch.
Only interaction is through debris.
=#
end
# ╔═╡ 19ccfc3a-6dbb-4c64-bf03-e2e219ef0efe # ╔═╡ 19ccfc3a-6dbb-4c64-bf03-e2e219ef0efe
begin begin
em2_a = EconModel1(0.95, [1 -0.02 -0.02 0], [5 0 0 0]) em2_a = EconModel1(0.95, [1 -0.02 -0.02 0], [5.0 0 0 0])
em2_b = EconModel1(0.95, [-0.02 1 -0.02 0], [0 5 0 0]) em2_b = EconModel1(0.95, [-0.02 1 -0.02 0], [0.0 5 0 0])
em2_c = EconModel1(0.95, [0 -0.02 1 -0.02], [0 0 5 0]) em2_c = EconModel1(0.95, [0 -0.02 1 -0.02], [0.0 0 5 0])
em2_d = EconModel1(0.95, [0 -0.02 -0.02 1], [0 0 0 5]) em2_d = EconModel1(0.95, [0 -0.02 -0.02 1], [0.0 0 0 5])
#= #=
This is a simple addition to the basic model, where you lose some benefit based This is a simple addition to the basic model, where you lose some benefit based
the size of your competitor's satellites. the size of your competitor's satellites.
@ -287,13 +333,13 @@ md"""
""" """
# ╔═╡ fb6aacff-c42d-4ec1-88cb-5ce1b2e8874f # ╔═╡ fb6aacff-c42d-4ec1-88cb-5ce1b2e8874f
policy = policy_function_generator(); policy = planner_policy_function_generator();
# ╔═╡ 41271ab4-1ec7-431f-9efb-0f7c3da2d8b4 # ╔═╡ 41271ab4-1ec7-431f-9efb-0f7c3da2d8b4
#Constellation level loss function #Constellation level loss function
function Ξ( function Ξ(
s::Vector s::Vector{Float32}
,d::Vector ,d::Vector{Float32}
, physical_model::PhysicalParameters , physical_model::PhysicalParameters
,co::ConstellationOperator ,co::ConstellationOperator
) )
@ -322,14 +368,17 @@ end
# ╔═╡ 43b99708-0052-4b78-886c-92ac2b532f29 # ╔═╡ 43b99708-0052-4b78-886c-92ac2b532f29
begin #testing begin #testing
s1 = ones(N_constellations) s1 = ones(Float32,N_constellations)
d1 = ones(N_debris) d1 = ones(Float32,N_debris)
Ξ(s1,d1,bm,operators[1]) Ξ(s1,d1,bm,operators[1])
end end
# ╔═╡ dff642d9-ec5a-4fed-a059-6c07760a3a58 # ╔═╡ dff642d9-ec5a-4fed-a059-6c07760a3a58
#planner's loss function #planner's loss function
function planners_loss(s,d) function planners_loss(
s::Vector{Float32}
,d::Vector{Float32}
)
l = 0.0 l = 0.0
for co in operators for co in operators
l += Ξ(s,d,bm,co) l += Ξ(s,d,bm,co)
@ -340,13 +389,13 @@ end
# ╔═╡ 5abebc1a-370c-4f5f-8826-dc0b143d5166 # ╔═╡ 5abebc1a-370c-4f5f-8826-dc0b143d5166
md""" md"""
## Constructing data ## Constructing data and training
""" """
# ╔═╡ a20959be-65e4-4b69-9521-503bc59f0854 # ╔═╡ a20959be-65e4-4b69-9521-503bc59f0854
begin begin
N=200 #increase later N=200 #increase later
data = [(rand(1:500, N_constellations),rand(1:500, N_debris)) for n=1:N] data = [(rand(1:500f0, N_constellations),rand(1:500f0, N_debris)) for n=1:N]
end end
# ╔═╡ 6bf8d29a-7990-4e91-86e6-d9894ed3db27 # ╔═╡ 6bf8d29a-7990-4e91-86e6-d9894ed3db27
@ -355,7 +404,7 @@ ADAM = Flux.Optimise.ADAM(0.1)
# ╔═╡ e7ee1a0f-ab9b-439e-a7be-4a6d3b8f160d # ╔═╡ e7ee1a0f-ab9b-439e-a7be-4a6d3b8f160d
begin begin
accum1 = 0.0 local accum1 = 0.0
for d in data for d in data
accum1 += planners_loss(d...) accum1 += planners_loss(d...)
end end
@ -364,8 +413,8 @@ end
# ╔═╡ 74f5fde3-0593-46fc-a688-f1db7ab28c64 # ╔═╡ 74f5fde3-0593-46fc-a688-f1db7ab28c64
# Social planners problem # Social planners problem
for epoch in 1:200 for epoch in 1:20
data1 = [(rand(1:500, N_constellations),rand(1:500, N_debris)) for n=1:N] data1 = [(rand(1:500f0, N_constellations),rand(1:500f0, N_debris)) for n=1:N]
#train the social planner's policy funciton #train the social planner's policy funciton
Flux.Optimise.train!(planners_loss, params(policy), data1, ADAM) Flux.Optimise.train!(planners_loss, params(policy), data1, ADAM)
@ -378,7 +427,7 @@ end
# ╔═╡ 02f3fe78-e7a7-453f-9ddf-acddf08d8676 # ╔═╡ 02f3fe78-e7a7-453f-9ddf-acddf08d8676
begin begin
accum = 0.0 local accum = 0.0
for d in data for d in data
accum += planners_loss(d...) accum += planners_loss(d...)
@ -391,7 +440,7 @@ policy(data[3])
# ╔═╡ 14e61097-f28f-4029-b6b4-5fb119620fc3 # ╔═╡ 14e61097-f28f-4029-b6b4-5fb119620fc3
begin begin
n=1 n=15
[operators[1].value(data[n]) [operators[1].value(data[n])
,operators[2].value(data[n]) ,operators[2].value(data[n])
@ -982,12 +1031,14 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
# ╠═9fa41b7c-1923-4c1e-bfc6-20ce4a1a2ede # ╠═9fa41b7c-1923-4c1e-bfc6-20ce4a1a2ede
# ╟─90446134-4e45-471c-857d-4e165e51937a # ╟─90446134-4e45-471c-857d-4e165e51937a
# ╠═5b45b29e-f0f4-41e9-91e7-d444687feb4e # ╠═5b45b29e-f0f4-41e9-91e7-d444687feb4e
# ╟─152f3a3c-a565-41bb-8e59-6ab0d2315ffb # ╠═152f3a3c-a565-41bb-8e59-6ab0d2315ffb
# ╟─25ac9438-2b1d-4f6b-9ff1-1695e1d52b51 # ╠═25ac9438-2b1d-4f6b-9ff1-1695e1d52b51
# ╠═29ff1777-d276-4e8f-8582-4ca191f2e2ff # ╠═29ff1777-d276-4e8f-8582-4ca191f2e2ff
# ╟─f7aabe43-9a2c-4fe0-8099-c29cdf66566c # ╠═f7aabe43-9a2c-4fe0-8099-c29cdf66566c
# ╟─d816b252-bdca-44ba-ac5c-cb21163a1e9a # ╠═d816b252-bdca-44ba-ac5c-cb21163a1e9a
# ╠═6a3b5f7a-a535-450f-8c5f-19bdcc280146
# ╠═95bfc9d8-8427-41d6-9f0f-f155296eef91 # ╠═95bfc9d8-8427-41d6-9f0f-f155296eef91
# ╠═0ba48a75-36db-4003-95c0-2329d4fb29c5
# ╠═340da189-f443-4376-a82d-7699a21ab7a2 # ╠═340da189-f443-4376-a82d-7699a21ab7a2
# ╠═206ac4cc-5102-4381-ad8a-777b02dc4d5a # ╠═206ac4cc-5102-4381-ad8a-777b02dc4d5a
# ╠═eebb8706-a431-4fd1-b7a5-40f07a63d5cb # ╠═eebb8706-a431-4fd1-b7a5-40f07a63d5cb
@ -1003,7 +1054,7 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
# ╠═cd55e232-493d-4849-8bd7-b0ba85e21bab # ╠═cd55e232-493d-4849-8bd7-b0ba85e21bab
# ╠═fb6aacff-c42d-4ec1-88cb-5ce1b2e8874f # ╠═fb6aacff-c42d-4ec1-88cb-5ce1b2e8874f
# ╠═f30904a7-5caa-449a-a5bd-f2aa78777a9a # ╠═f30904a7-5caa-449a-a5bd-f2aa78777a9a
# ╟─5abebc1a-370c-4f5f-8826-dc0b143d5166 # ╠═5abebc1a-370c-4f5f-8826-dc0b143d5166
# ╠═a20959be-65e4-4b69-9521-503bc59f0854 # ╠═a20959be-65e4-4b69-9521-503bc59f0854
# ╠═6bf8d29a-7990-4e91-86e6-d9894ed3db27 # ╠═6bf8d29a-7990-4e91-86e6-d9894ed3db27
# ╠═e7ee1a0f-ab9b-439e-a7be-4a6d3b8f160d # ╠═e7ee1a0f-ab9b-439e-a7be-4a6d3b8f160d

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save