Использование функции оптимизации Python только с целочисленными значениями - PullRequest
0 голосов
/ 22 марта 2020

Я решаю проблему минимизации в Python, которая распределяет пропускную способность по краям графа таким образом, чтобы потеря пакетов во всей сети / графе была минимальной. Пакеты генерируются в узлах, следующих за распределением Пуассона . Проблема в том, что scipy.optimize.minimize () не может принимать только целые числа в качестве входных данных для целевой функции loss_obj (x) . Он работает над всеми значениями с плавающей точкой, удовлетворяющими ограничению. Метод find_loss () находит потерю фронта e , принимая k в качестве своей емкости. Я вставляю только функцию оптимизации ниже, потому что исходный код содержит более 300 строк.

#here we find loss of an edge e of the graph 
def find_loss(e,lmd,q,k): 
    edge_pmf=find_final_dist(e,lmd,q) 
    l_e=sum(edge_pmf[k+1:])
    return l_e       

net_cap=12 #this is the net capacity to be allocated over the edges

#The minimization function 
x0=[1]*a  
for i in range(a):
    x0[i]=net_cap/a

#x=[c1,c2,c3,...]
def loss_obj(x):
    s=0 
    for i in range(len(x)):
       l=find_loss(edge_enum[i],lamd,q,m.floor(x[i]))  
       s+=l 
    return s 
print('Initial guess ',x0)    
def constraint(x):
    b=sum(x[0:]) 
    return b-net_cap 

con={'type':'eq','fun':constraint}   
b=(0,net_cap)
bounds=[]
for i in range(a):
    bounds.append(b)    
cap_op=minimize(loss_obj,x0,method='SLSQP',constraints=con,bounds=bounds)
print('\n',cap_op.x)

Это показанный вывод:

Initial guess  [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]

 [0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
 0.5 0.5 0.5 0.5 0.5 0.5]

Хотя я показал здесь вектор только с 24 элементами, чтобы продемонстрировать проблему, моя сеть имеет 104 ребра и, следовательно, не может решаться с помощью scipy.optimize.brute () или itertools.combination (), поскольку система не может обрабатывать слишком большие массивы и выдает Ошибка памяти . Проблема линейного программирования - это не то, к чему я стремлюсь, поэтому PuLP не будет хорошим решением. Может кто-нибудь найти способ свести к минимуму функции целочисленного ввода?

1 Ответ

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

Поскольку функция потерь понятна, как насчет использования байесовской оптимизации (BO)? Это делает "умное предположение", основанное на прежних догадках, предложенных правилом Байеса. Ниже приведена одна популярная реализация BO в Python, и ее документы понятны.

https://github.com/fmfn/BayesianOptimization

...