Цель: Чтобы имитировать вывод из MS Excel Solver с помощью Google OR Tools
Описание: Маркетинговый пример помогает выделить выделение.Пожалуйста, посмотрите на изображение ниже для того, что я пытаюсь воспроизвести, используя Google OR Tools .
Результаты изображения должны соответствовать моим результатам следующим образом:
- X1, X2, X3, X4 (изображение Excel) - X0, X1, X2, X3 (код Google OR)
.
import pandas as pd
data =[['Search Ads', 8827, 0.4, 1096, 0.12,225776, 24.58],
['Display Ads', 5172, 0.03, 482, 0.09, 99292, 18.20],
['YouTube Ads', 833,3.98, 20, 0.02, 4120 ,3.95],
['Gmail Ads', 423, 0.08, 12, 0.03, 2472, 4.84]]
# cost = number of clicks x CPC
# conversions = phoe calls + filled franchise form
# converstion/cost = total conversion to cost value of each campaign
ad_practice = pd.DataFrame(data, columns=['Campaign Type', 'Cost', 'Avg CPC','Conversion', 'Conversion/Cost','Revenue', 'ROI'])
from ortools.linear_solver import pywraplp
def solve_ads():
t = 'Optimize Ad Spend'
# solver
s = pywraplp.Solver(t, pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
# decision variables
x = [s.NumVar(0, 1000000, 'x[%i]' %i) for i in range(4)]
pop = s.NumVar(0,15000,'pop')
s.Add(x[0] + x[1] + x[2] + x[3] <= 15000)
s.Add(0 * x[0] + 1 * x[1] + 0 * x[2] + 0 * x[3] >= 3000)
s.Add(0 * x[0] + 0 * x[1] + 1 * x[2] + 0 * x[3] >= 400)
s.Add(-0.60 * x[0] + 0.40 * x[1] + 0.40 * x[2] - 0.60 * x[3] >= 0)
s.Add(0 * x[0] + 0 * x[1] - 1 * x[2] + 1 * x[3] >= 0)
s.Add(-0.10 * x[0] - 0.10 * x[1] - 0.10 * x[2] + 0.90 * x[3] <= 0)
s.Add(0.12 * x[0] + 0.09 * x[1] + 0.02 * x[2] + 0.03 * x[3] >= 1500)
# objective function
s.Add(pop == 24.58 * x[0] + 18.20 * x[1] + 3.95 * x[2] + 4.84 * x[3])
s.Maximize(pop)
s.Solve()
return pop.SolutionValue(), [e.SolutionValue() for e in x]