我是mystic的新手,正在开发一个优化的problem.My mystic代码,如下所示:
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,或者我需要在my.constraints之上添加一些约束,如@integers(),如下所示?此外,我的优化结果没有显示任何内容。我的错误在哪里?
发布于 2020-05-03 20:00:08
如果你想同时应用这两个约束,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),那么这个错误就解决了。
关于您在上面发布的代码,您只使用了round,而没有使用cons。通过使用and_,就像我上面的例子一样,它将尝试同时解决cons和round。我已经检查过了,round(result[0])将舍入为整数,并且cons(result[0])施加了一个sum约束。然而,正如我在下面的评论中提到的那样,这两个约束似乎是相互排斥的……这就是为什么你会看到inf的“分数”(成本)的优化。
需要经常检查的几件事是:(1)尝试在没有优化器的情况下应用约束,并确认它可以工作(并且您得到了一个有效的解决方案),如果没有,您可能有没有解决方案的约束;(2)如果您似乎有无效的解决方案,那么您可能希望使用mystic.penalty来提供软约束;(3)使用mystic.monitor.VerboseMonitor(1,1)运行优化器,以查看每一步发生了什么。
https://stackoverflow.com/questions/60978086
复制相似问题