Как проверить все возможные значения для всех переменных, чтобы получить максимальный результат для функции - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть три переменные, названные a, b и c, каждая из которых может принимать различное значение, определенное в диапазоне.Я хотел бы создать функцию, которая проверяет каждое возможное значение переменной и дает мне их лучшую комбинацию для вывода 'f'.

a = list(range(1, 10, 2))
b = list(range(5, 8, 1))
c = list(range(1, 3, 1))

def all_combinations (a, b, c):
    #something
    f = a + (b * a) - (c*(a ^ b))
    return BEST a, b, c for my f

это возможно сделать?какой лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 28 сентября 2019

Прежде всего, вы сказали I have three variables called a, b and c, each of these can assume a different value defined in a range.Обратите внимание, что переменные в вашем коде фактически равны трем спискам целых чисел, не трем целым числам.

Наивным алгоритмом для проверки всех возможных комбинаций является 3 вложенных цикла for.Здесь я предполагаю, что под «лучшим» вы подразумеваете «максимальное значение»:

def all_combinations (list1, list2, list3):
    best_f, best_a, best_b, best_c = None, None, None, None

    for a in list1:
        for b in list2:
            for c in list3:
                f = a + (b * a) - (c*(a ^ b))
                # here you have to define what f being "better" than best_f means:
                if not f or f > best_f:
                    best_f = f
                    best_a = a
                    best_b = b
                    best_c = c
    return best_a, best_b, best_c
1 голос
/ 28 сентября 2019

Вы можете использовать itertools.product(), чтобы получить все возможные комбинации a, b и c.

Затем рассчитайте свою формулу для каждой уникальной комбинации a b c, отследите результат, и еслирезультат лучше предыдущего, сохраните текущие значения a b c.

import itertools

def all_combinations (alist, blist, clist):
    best_a = 0
    best_b = 0
    best_c = 0
    best_f = 0
    for a,b,c in itertools.product(alist, blist, clist):
        f = a + (b * a) - (c*(a ^ b))
        if f > best_f: # use your own definition of "better"
            best_a = a
            best_b = b
            best_c = c
            best_f = f
    return best_a, best_b, best_c
0 голосов
/ 28 сентября 2019

Если вы уверены, что это единственные значения, которые вы хотите проверить, то сработает следующее.В противном случае вы можете посмотреть scipy.optimize .

from itertools import product
import numpy as np

parameters = list(product(a, b, c))
results = [my_fun(*x) for x in parameters]
print(parameters[np.argmax(results)])

, очевидно, замените np.argmax на np.argmin, если вы хотите свернуть функцию

...