Python Pulp репликации решатель Excel - PullRequest
0 голосов
/ 19 марта 2020

Когда я пытаюсь использовать функцию math.log в целевом выражении, появляется эта ошибка. Может ли кто-нибудь помочь мне понять, как можно добавить формулу, которую мне нужно оптимизировать?

model_MPL + = samples * (math.log (beta_var) - beta_var * math.log (alfa_var)) + suma

Я пытаюсь воспроизвести решатель Excel, чтобы оптимизировать альфа и бета-параметры распределения Вейбулла.

data = np.array([509,660,386,753,811,613,848,725,315,872,487,512])

def func_aplicada(x):
    return (beta_last -1)*math.log(x)-(x/alfa)**beta_last

alfa = 688.916073521629
beta_last = 3.979166666666667

suma=0
samples=data.shape[0]
for i in range(0,samples):
    suma += func_aplicada(data[i])

print('Cantidad de muestras = ',samples, '/ sumaacum =',suma)

import pulp as pl

model_MPL = pl.LpProblem("MPL", pl.LpMaximize)

beta_var = pl.LpVariable("beta_var",beta_last*0.5 , beta_last*1.5)
alfa_var = pl.LpVariable("alfa_var", alfa*0.5, alfa*1.5)

model_MPL += alfa_var>=0.1
model_MPL += beta_var>=0.1

model_MPL += samples * (math.log(beta_var) - beta_var * math.log(alfa_var)) + suma 


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-52-08c6614fb718> in <module>
     22 model_MPL += beta_var>=0.1
     23 
---> 24 model_MPL += samples * (math.log(beta_var) - beta_var * math.log(alfa_var)) + suma

TypeError: must be real number, not LpVariable

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Я думаю, вам нужно использовать lpSum в целевой функции

import pulp as pl

model_MPL = pl.LpProblem("MPL", pl.LpMaximize)

beta_var = pl.LpVariable("beta_var",beta_last*0.5 , beta_last*1.5)
alfa_var = pl.LpVariable("alfa_var", alfa*0.5, alfa*1.5)

model_MPL += alfa_var>=0.1
model_MPL += beta_var>=0.1

model_MPL += lpSum([sample * (math.log(beta_var) - sample * beta_var + sample * math.log(alfa_var)) 
                    for sample in samples]) + suma 

0 голосов
/ 19 марта 2020

Поскольку ошибка указывает, что alpha_var и beta_var относятся к типу LpVariable, но требуется числовое значение.

Вызовите alpha_var.value(), чтобы получить значение LpVariable.

model_MPL += samples * (math.log(beta_var.value()) - beta_var.value() * math.log(alfa_var.value())) + suma
...