# -------------------------------------------------------- # 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)