Last active
July 24, 2020 20:31
-
-
Save zehmatias/a8b610311b29675bd34a69eafa96185c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -------------------------------------------------------- | |
# PLANO DE MÍDIA COM NOVOS CANAIS E NO FORMATO DE VETORES E MATRIZES . 23/ABR/2020 | |
# -------------------------------------------------------- | |
# -------------------------------------------------------- | |
# PARA O FUTURO | |
# Inputs do usuario para CPC, Tx. Conv, etc. | |
# [Feito!] erros nos valores dos investimentos (não bate com o total) | |
# interface com genie/html | |
# incluir mais infos no XLS | |
# incluir CPM, publico total e frequencia | |
# -------------------------------------------------------- | |
using XLSX, JuMP, GLPK, Dates | |
model = Model(with_optimizer(GLPK.Optimizer)) | |
function Input(prompt) | |
print(prompt) | |
input() | |
end | |
dinheirot = 55760.00 #parse(Float64,Input("Informe o investimento previsto: ")) #valor investido | |
n = 4 #parse(Int,Input("Informe o número de meses: ")) #numero de meses | |
nome = "PLANO",Dates.format(now(), "HH:MM:SS") #"ïnvest_de ",dinheirot,"__",n," meses" | |
# incluir parametro de frequencia de cliques | |
println("\n--------------------------------\n--------------------------------\n--------------------------------") | |
m = 4 #numero de plataformas | |
#matriz de M X N sendo M plataforma e N meses | |
cpm = [21.27 21.27 21.27 21.27 21.27; #facebook | |
30.29 30.29 30.29 30.29 30.29; #instagram | |
10.58 10.58 10.58 10.58 10.58; #google display | |
109.59 109.59 109.59 109.59 109.59] #google search | |
ctr = [1.27 1.27 1.27 1.27 1.27 1.27; #facebook | |
0.29 0.29 0.29 0.29 0.29 0.29; #instagram | |
0.58 0.58 0.58 0.58 0.58 0.58; #google display | |
9.59 9.59 9.59 9.59 9.59 9.59] #google search | |
cpc = [0.59 0.59 0.59 0.59 0.59 0.59; #facebook | |
1.90 1.90 1.90 1.90 1.90 1.90; #instagram | |
0.13 0.13 0.13 0.13 0.13 0.13; #google display | |
0.41 0.41 0.41 0.41 0.41 0.41] #google search | |
txConv = [3.73 3.73 3.73 3.73 3.73 3.73; #facebook | |
8.88 8.88 8.88 8.88 8.88 8.88; #instagram | |
0.08 0.08 0.08 0.08 0.08 0.08; #google display | |
7.67 7.67 7.67 7.67 7.67 7.67] #Google search | |
indGoogle = 4 #indice que corresponde ao google search nas matrizes | |
volBuscas = [5900,5900,10000,8800,5900,2600] | |
publicoTotal = [250000,250000,500000,0] # TODOS OS PUBLICOS NA ORDEM FACE,INSTA, DISPLAY e google que precisa ser infinito caso | |
minservico = [2,2,2,2] # Mínimos informados pelo usuarios | |
@variable(model, dinheiro[1:m,1:n]) # Usar matrizes de N meses por M canais para ter apenas uma variavel dinheiro | |
# Primeira restricao é ser menor ou igual ao investimento total (estava dando erro, fazendo com que cada valor seja menor) | |
@constraint(model, sum(dinheiro) .<= sum(dinheirot)) # nao precisa do 1:n, ele le tudo | |
# Segunda restrição é o dinheiro nas midias ser proporcional ao publico e suas taxas | |
#@constraint(model, [j=1:m,j!=indGoogle], dinheiro[j,1:n] .<= publicoTotal[j] .* 0.8 .* cpc[j,1:n] .* (ctr[j,1:n]/100)) # limite do publico COM CTR | |
@constraint(model, [j=1:m,j!=indGoogle], dinheiro[j,1:n] .<= publicoTotal[j] .* 0.8 .* cpc[j,1:n]) # limite do publico SEM CTR | |
#@constraint(model, [j=1:m,j!=indGoogle], dinheiro[j,1:n] .<= publicoTotal[j] .* 0.8 .* dinheiro[j,1:n]/cpm[j,1:n]*ctr[j,1:n]) # limite do publico via CPM e CTR | |
#@constraint(model, [j=1:m,j!=indGoogle], dinheiro[j,1:n] .<= dinheiro[j,1:n]/cpm[j,1:n]*1000*ctr[j,1:n]/100) # SEM limite do publico via CPM e CTR | |
# Terceira restriçào é do volume de buscas do google | |
@constraint(model, dinheiro[indGoogle,1:n] .<= volBuscas[1:n] .* cpc[indGoogle,1:n]) | |
# Quarta restricao é que o dinheiro nunca pode ser negativo | |
@constraint(model, dinheiro .>= 0) | |
# Quinta restrição é o dinheiro ser maior que o minimos // ERRO QUANDO ENTRA ESSA RESTRIÇÃO, TUDO FICA COM R$500,00 | |
@constraint(model, [j=1:m], dinheiro[j,1:n] .>= minservico[j]) #j sao os canais, n sao o numero de meses | |
# Sexta restrição é o dinheiro ser menor que o total dividido por plataforma e meses? | |
#@constraint(model, dinheiro[1:m,1:n] .<= (dinheirot/m/n)) | |
#@objective(model, Max, sum((dinheiro[j,i]/cpc[j,i]*(txConv[j,i])/100) for i = 1:n,j=1:m)) # com CPC | |
@objective(model, Max, sum(( dinheiro[j,i]/cpm[j,i]*1000*ctr[j,i]/100*(txConv[j,i])/100) for i = 1:n,j=1:m)) # sem CPC, AI USA CTR E CPM | |
################################## IMPORTANTE!!!!!########################################################################################## | |
#nos testes de 22/7 a alocação foi igual nos dois modelos, quando removo o minimo de valores. O que mudou foi a estimativa de conversões... | |
############################################################################################################################################ | |
optimize!(model) | |
#-------------------------------- Gera o XLS com os dados -------------------------------- | |
filename = string(@__DIR__,"/",nome,".xlsx") | |
# Converte o retorno do modelo em string para usar no XLS | |
resultado = string(termination_status(model)) | |
# Reseva os vetores | |
columns_plano = Vector() | |
labels_plano = Vector() | |
columns_tab_invest = Vector() | |
labels_tab_invest = Vector() | |
# Adicionar os dados para os vetores de colunas e linhas do XLS | |
push!(labels_plano,"Dados do Plano") | |
push!(labels_plano,"Status") | |
push!(columns_plano,["Status da solução", "Investimento Previsto", "Investimento Aplicado", "Conversões Estimadas", "Saldo do Investimento"]) | |
push!(columns_plano,[ resultado, dinheirot, value(sum(dinheiro)), objective_value(model), (dinheirot - value(sum(dinheiro))) ]) | |
push!(columns_tab_invest,["Facebook","Instagram","Display","Google Search"]) | |
push!(labels_tab_invest,"Plataforma") | |
# Loop para pegar os dados de dinheiro de cada mes | |
for n in 1:n | |
push!(columns_tab_invest, [value(dinheiro[1,n]),value(dinheiro[2,n]),value(dinheiro[3,n]),value(dinheiro[4,n])]) | |
end | |
# Loop para montar o nome de cada mes | |
for i in 1:n | |
push!(labels_tab_invest, "Mês $(i)") | |
end | |
# Monta o XLS | |
XLSX.openxlsx(filename, mode="w") do xf | |
sheet = xf[1] | |
XLSX.rename!(sheet, "Dados do Plano") | |
XLSX.writetable!(sheet, columns_plano, labels_plano, anchor_cell=XLSX.CellRef("A1")) | |
sheet2 = XLSX.addsheet!(xf, "Tabela de Investimentos") | |
XLSX.writetable!(sheet2, columns_tab_invest, labels_tab_invest, anchor_cell=XLSX.CellRef("A1")) | |
end | |
# Status geral da execução | |
println("\n\n-----------------------") | |
println("Seu Plano '",nome,"' foi Gerado!") | |
println("Investimento aplicado no plano:",value(sum(dinheiro))) | |
println("Status da Execução:", termination_status(model)) | |
println("Conversões estimadas:",objective_value(model)) | |
println("-----------------------") | |
# Valores em cada midia em cada mes | |
for i in 1:n | |
println("Investimento no Facebook no mês $(i) :",value(dinheiro[1,i])) | |
println("Investimento no Instagram no mês $(i) :",value(dinheiro[2,i])) | |
println("Investimento no Display no mês $(i) :",value(dinheiro[3,i])) | |
println("Investimento no Google Search no mês $(i) :",value(dinheiro[4,i])) | |
println("-----------------------") | |
end | |
println("--------------------------------\n--------------------------------\n--------------------------------") | |
print(model) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment