Skip to content

Instantly share code, notes, and snippets.

@zehmatias
Last active July 24, 2020 20:31
Show Gist options
  • Save zehmatias/a8b610311b29675bd34a69eafa96185c to your computer and use it in GitHub Desktop.
Save zehmatias/a8b610311b29675bd34a69eafa96185c to your computer and use it in GitHub Desktop.
# --------------------------------------------------------
# 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