Почему Google OR Tools предоставляет мне все нули в результатах оптимизации? - PullRequest
0 голосов
/ 19 мая 2019

Цель: Чтобы имитировать вывод из MS Excel Solver с помощью Google OR Tools

Описание: Маркетинговый пример помогает выделить выделение.Пожалуйста, посмотрите на изображение ниже для того, что я пытаюсь воспроизвести, используя Google OR Tools .

Результаты изображения должны соответствовать моим результатам следующим образом:

  • X1, X2, X3, X4 (изображение Excel) - X0, X1, X2, X3 (код Google OR)

Desired optimization output.

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] 

1 Ответ

0 голосов
/ 19 мая 2019

Проблема была здесь:

pop = s.NumVar(0,15000,'pop')

Его необходимо изменить и отразить возможную верхнюю границу SumProduct ROI и выделенную сумму расходов для переменных решения.

pop = s.NumVar(0,300000,'pop')
...