0

我是神秘主义者的新手,正在研究优化问题。我的神秘代码如下所示:

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()的定义是正确的(它包含一些本代码中未提及的字典和函数)。但是我的约束是否consx适用于整数值,或者我需要为此添加一些@integers()如上所述my.constraints的约束,如下所示?另外,我的优化结果什么也没显示。我的错在哪里?

4

1 回答 1

1

如果你想同时应用这两个约束,mystic 有耦合器来帮助你做到这一点。如果您将两个约束装饰器应用于单个函数,它将是一个约束“OR”,人们通常想要一个“AND”。因此,在 中mystic.constraints,有“AND”、“OR”和“NOT”来构建复合约束,以及mystic.coupler其他类型的函数耦合。

下面是一个使用“AND”的例子:

>>> 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]
>>> 

可以在此处找到使用具有整数约束的耦合器的完整示例:https ://github.com/uqfoundation/mystic/blob/master/examples2/eq10.py

更新: 跟进您发送给我的电子邮件,其中包含您的完整代码。一个问题是这条线需要k是一个整数:

 l_e=sum(edge_pmf[k+1:])

但是,np.round只是将浮点数四舍五入为整数,所以这就是您遇到错误的地方。如果您使用int(k),则可以解决该错误。

关于您上面发布的代码,cons未使用,您仅使用round. 通过使用and_,如我上面的示例所示,它将尝试同时解决这两个cons问题round。我已经检查过了,round(result[0])将四舍五入为整数,并cons(result[0])施加总和约束。但是,正如我在下面的评论中提到的那样,这两个约束似乎可能是互斥的……这就是为什么您会看到inf优化的“分数”(成本)。

一些需要经常检查的好事情是(1)尝试在没有优化器的情况下应用约束,并确认它有效(并且您得到了有效的解决方案),如果没有,您可能有没有解决方案的约束;(2) 如果您似乎有无效的解决方案,那么您可能希望使用 amystic.penalty来提供软约束;(3) 使用 a 运行优化器mystic.monitor.VerboseMonitor(1,1)以查看每个步骤发生了什么。

于 2020-05-03T12:00:08.313 回答