-
Notifications
You must be signed in to change notification settings - Fork 0
/
nsga.jl
121 lines (95 loc) · 3.52 KB
/
nsga.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
include("dados.jl")
include("classe.jl")
include("fitness.jl")
include("populacao.jl")
include("operadores.jl")
it, tam_pop, cardinalidade, β, cx, mr = parametros("params.in")
ativos, μ, σ = portfolio(β)
qnt_ativos = length(ativos)
pop = []
for i in 1:tam_pop
a = gera_ativos(cardinalidade, qnt_ativos)
l = gera_lotes(cardinalidade, qnt_ativos, a)
ind = Individuo(a, l)
push!(pop, ind)
end
solver = NSGA(cx, mr, μ, σ, tam_pop, cardinalidade, pop)
@time for i in 1:it
# atualiza cx e mr - o esquema do garcia tá zoadaço
# classifica os caras
# faz seleção
# crossover ativos
# crossover lotes
# mutação ativos
# mutação lotes
# classifica os caras 2
# filtra população
# atualiza_parametros(solver, i, it) # comenta essa linha se quiser parâmetros fixos
# println("cx: ", solver.cx, " mr: ", solver.mr)
if i % 50 == 0 println(i) end
# println("============== : ", i)
# for ind in solver.populacao
# println(ind)
# end
pontos = fitness_populacao(solver)
# for p in pontos println(pontos) end
fronteiras, indices = nds(pontos)
# for f in fronteiras println(f) end
# for i in indices println(i) end
selecao = torneio_binario(solver, fronteiras, indices)
# println(selecao)
# println("passei da selecao")
# for x in solver.populacao println(x.ativos, " ", sum(x.lotes)) end
# println(length(solver.populacao))
# println(length(solver.populacao))
# for x in solver.populacao println(x.ativos, " ", x.lotes, " ", sum(x.lotes)) end
crossover(solver, selecao, solver.cardinalidade)
# meu_crossover(solver, selecao)
# println("passei do crossover")
# println(length(solver.populacao))
# for x in solver.populacao println(x.ativos, " ", x.lotes, " ", sum(x.lotes)) end
# for x in solver.populacao println(x.ativos, " ", x.lotes, " ", sum(x.lotes)) end
# println(length(solver.populacao))
mutacao(solver)
# minha_mutacao(solver, qnt_ativos)
# println("passei da mutacao")
# for x in solver.populacao println(x.ativos, " ", x.lotes, " ", sum(x.lotes)) end
# println(length(solver.populacao))
pontos = fitness_populacao(solver)
fitness = copy(pontos)
fronteiras, indices = nds(pontos)
filtra_populacao(solver, fronteiras, indices, tam_pop, fitness)
# println("passei do filtro")
# for i in solver.populacao
# println(i)
# end
end
pontos = fitness_populacao(solver)
fronteiras, indices = nds(pontos)
# for i in indices[1]
# println(solver.populacao[i])
# end
# for f in fronteiras[1]
# println(f)
# end
println("caras na fronteira ótima: ", length(fronteiras[1]))
# plot(fronteiras[1], cardinalidade)
portfolios_resposta(solver.populacao, fronteiras[1], cardinalidade)
# for x in solver.populacao println(x.ativos, " : ", sum(x.lotes)) end
# dados sobre custos de transação:
# https://www.bb.com.br/pbb/pagina-inicial/compra-e-venda-de-acoes/guia-do-investidor/perguntas-frequentes#/
# > custos e liquidação > dúvidas
# capital disponível C de R$ 100.000,00 ;
# TARIFA DE CORRETAGEM: R$ 20,00 para cada compra e venda
# se eu usar 1 como 100% e 100% for 100.000, então 20 será 0.00020
# EMOLUMENTOS, aplicar se movimentar o ativo
# 0.0345% do valor negociado // 0.000345 * lotes[i]
# TARIFA DE CUSTÓDIA
# de R$ 0 a 1.000.000,00 - 0.0130% // 0.000130
# ========================
# custos de transação
# como que vou manter a taxa total para cada indivíduo?
# não posso resetar a cada iteração
# ele pode ser usado em mais de um crossover, e ai faz o que?
# a ideia será que é usar um valor ao envés de porcentagens?
# daria pra manter o valor de cada portfólio até o final, atualizando a cada iteração?