-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHJB_Solver_Ruin.jl
121 lines (115 loc) · 2.98 KB
/
HJB_Solver_Ruin.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using BlackBoxOptim
import Juno
function hjbsolver(;
NRe,
β,
FR,
pR,
End,
End1,
Δx,
r_max,
SearchRanges,
MaxEvals = false,
MaxSteps = 10000,
)
xv = 0:Δx:End
n = length(xv)
v = zeros(n + 1)
vhat = zeros(n)
v[1] = 1.0
Re = zeros(n, NRe)
function H0(r)
r = r + 100.0 * (r .> r_max)
pRR = pR(r)
if pRR > 0
s = v[1] * FR(r, Δx)
return (β * v[1] - β * s) / pRR
else
return Inf
end
end
MIN = bboptimize(
H0;
SearchRange = SearchRanges,
TraceMode = :silent,
MaxSteps = MaxSteps,
)
vhat[1] = best_fitness(MIN)
v[2] = v[1] + Δx * vhat[1]
Re[1, :] = best_candidate(MIN)
l = n
n1 = floor(Int, End1 / Δx + 1)
Juno.@progress for i in 2:n1
function H(r)
r = r + 100.0 * (r .> r_max)
pRR = pR(r)
if pRR > 0
FRΔ = FR(r, 0.0)
FRΔ1 = FR(r, Δx)
s = 0.0
for j in 1:(i - 1)
s += (v[i - j + 1] + v[i - j]) * (FRΔ1 - FRΔ)
FRΔ = FRΔ1
FRΔ1 = FR(r, (j + 1) * Δx)
end
return β * (v[i] - 0.5 * s) / pRR
else
return Inf
end
end
MIN = bboptimize(
H;
SearchRange = SearchRanges,
MaxFuncEvals = MaxEvals,
TraceMode = :silent,
MaxSteps = MaxSteps,
)
vhat[i] = best_fitness(MIN)
Re[i, :] = best_candidate(MIN)
HMIN1 = H(Re[i - 1, :])
if HMIN1 < vhat[i]
vhat[i] = HMIN1
Re[i, :] = Re[i - 1, :]
end
# while (vhat[i] > vhat[i - 1])
# MIN = bboptimize(
# H;
# SearchRange = SearchRanges,
# MaxFuncEvals = MaxEvals,
# TraceMode = :silent,
# MaxSteps = MaxSteps,
# )
# vhat[i] = best_fitness(MIN)
# Re[i, :] = best_candidate(MIN)
# end
v[i + 1] = v[i] + Δx * vhat[i]
for k in 1:length(r_max)
if Re[i, k] > r_max[k]
Re[i, k] = 100.0
end
end
end
for i in (n1 + 1):n
function H(r)
pRR = pR(r)
if pRR > 0
FRΔ = FR(r, 0.0)
FRΔ1 = FR(r, Δx)
s = 0.0
for j in 1:(i - 1)
s += (v[i - j + 1] + v[i - j]) * (FRΔ1 - FRΔ)
FRΔ = FRΔ1
FRΔ1 = FR(r, (j + 1) * Δx)
end
return β * (v[i] - 0.5 * s) / pRR
else
return Inf
end
end
Re[i, :] = Re[i - 1, :]
vhat[i] = H(Re[i, :])
v[i + 1] = v[i] + Δx * vhat[i]
end
return collect(xv[1:l]), v[1:l] ./ v[l], vhat[1:l] ./ v[l], Re[1:l, :]
end