Положить целочисленные ограничения в мистике - PullRequest
1 голос
/ 01 апреля 2020

Я новичок в mysti c и работаю над проблемой оптимизации. Мой код mysti c выглядит следующим образом:

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   

def objective(x):
    s=0
    for i in range(len(x)):
        s+=find_loss(edge_enum[i],lamd,q,x[i]) 
    return s 

added=lambda x: [i for i in x]        
cons=lambda x: my.constraints.impose_sum(total_cap,added(x)) 

@integers() 
def round(x): 
    return x 

bounds=[(0,None)]*a    
if __name__=='_main_':
   result=diffev2(objective,x0=bounds,bounds=bounds,constraints=round,npop=20,gtol=50,disp=True,full_output=True) 
   print(result[0])

Я уверяю, мой objective() определен правильно (он содержит несколько словарей и функций, не упомянутых в этом коде). Но работает ли мое ограничение cons только с x только как целочисленные значения, или мне нужно добавить для этого некоторые ограничения, например @integers() выше my.constraints, как это сделано ниже? Кроме того, мой результат оптимизации ничего не показывает. Где моя вина?

1 Ответ

0 голосов
/ 03 мая 2020

Если вы хотите применить оба ограничения одновременно, в mysti c есть помощники, которые помогут сделать это. Если вы примените два декоратора ограничений к одной функции, это будет ограничение «ИЛИ», и люди обычно хотят «И». Итак, в mystic.constraints есть «И», «ИЛИ» и «НЕ» для построения составных ограничений, а также mystic.coupler для других типов связывания функций.

Вот пример использования «И»:

>>> import mystic as my
>>> total_cap = 10
>>> added=lambda x: [i for i in x] 
>>> cons=lambda x: my.constraints.impose_sum(total_cap,added(x))
>>> import numpy as np
>>> round = np.round
>>> c = my.constraints.and_(cons, round)
>>> c([1.1, 2.3, 4.5, 6.7])
[1.0, 1.0, 3.0, 5.0]
>>> 
...