Как мне это сделать?
Использование scipy
, почему бы не обернуть get_result( aLIST )
в penalty_fun()
, который затем мог бы работать внутри набора scipy.optimize.fmin*
решателей?
def penalty_fun( x, other_param, yet_another_param ):
aResultLIST = get_result( x.tolist(), other_param, yet_another_param )
return sum( [ item**2 for item in aResultLIST )
, где при поиске минимизатора решателя используется вектор x[:]
~ ( a, b, c, d, e )
с некоторыми начальными или случайными значениями:
fmin_l_bfgs_b( func = penalty_fun,
x0 = x,
args = [ other_lst, target_lst ],
iprint = 5,
pgtol = 1E-8,
factr = 1E+9,
maxiter = 1E+8,
maxfun = 1E+8
)
Учитывая, что внутренние уловки внутри get_result()
не слишком дикие, эта наивная сила может решитьпотенциально со многими начальными начальными точками в x[:]
, чтобы служить вашему желанию в качестве готового к использованию решения.
Логика, набросанная выше перед редактированием (ями),
def get_result(lst):
# lst is always a list of 5 floats
a, b, c, d, e = lst
# logic goes here
a = a+b
b = b-c
c = min(a,b,c)
d = a*e
e = d+b
return [a, b, c, d, e]
дает бесконечно много решений:
a_OUT = 0 = a_IN + b_IN -> lin b_IN == -a_IN
b_OUT = 0 = b_IN - c_IN -> lin b_IN == c_IN
c_OUT = 0 = min( a_IN, b_IN, c_IN ) :: non-lin == min( a_IN, -a_IN, -a_IN ) == abs( a_IN ) == 0
d_OUT = 0 = a_IN * e_IN :: non-lin OR( a_IN == 0 e_IN == 0 )
e_OUT = 0 = b_IN + d_IN :: lin b_IN == -d_IN
для ввода:
a == 0, b == 0, c == 0, d == 0, e == < -INF, +INF >