首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将整数约束放在mystic中

将整数约束放在mystic中
EN

Stack Overflow用户
提问于 2020-04-02 02:42:34
回答 1查看 269关注 0票数 0

我是mystic的新手,正在开发一个优化的problem.My mystic代码,如下所示:

代码语言:javascript
复制
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(),如下所示?此外,我的优化结果没有显示任何内容。我的错误在哪里?

EN

回答 1

Stack Overflow用户

发布于 2020-05-03 20:00:08

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

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

代码语言:javascript
复制
>>> 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为整数:

代码语言:javascript
复制
 l_e=sum(edge_pmf[k+1:])

但是,np.round仅将浮点数舍入为整数,因此这就是错误所在。如果你使用int(k),那么这个错误就解决了。

关于您在上面发布的代码,您只使用了round,而没有使用cons。通过使用and_,就像我上面的例子一样,它将尝试同时解决consround。我已经检查过了,round(result[0])将舍入为整数,并且cons(result[0])施加了一个sum约束。然而,正如我在下面的评论中提到的那样,这两个约束似乎是相互排斥的……这就是为什么你会看到inf的“分数”(成本)的优化。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60978086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档