首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对初学者的差分进化多约束

针对初学者的差分进化多约束
EN

Stack Overflow用户
提问于 2021-04-07 04:51:20
回答 1查看 139关注 0票数 0

我正在尝试使用scipy optimize differential_evolution优化以下函数:

代码语言:javascript
复制
def obj_fun_cal(x,df_TZ_input,df_TZ_target):
v=(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],x[19],x[20])
prodmx=df_TZ_input*v
sum_vector=prodmx.sum(axis=1)
MAE=np.mean(np.absolute(df_TZ_target-sum_vector))
penalty=0
if x[1]<=x[0]:
    penalty+=1000
if x[2]<=x[1]:
    penalty+=1000
if x[3]<=x[2]:
    penalty+=1000
if x[4]<=x[3]:
    penalty+=1000
if x[5]<=x[4]:
    penalty+=1000
if x[6]<=x[5]:
    penalty+=1000
if x[7]<=x[6]:
    penalty+=1000
if x[8]<=x[7]:
    penalty+=1000
if x[9]<=x[8]:
    penalty+=1000
if x[10]<=x[9]:
    penalty+=1000
if x[11]<=x[10]:
    penalty+=1000
if x[12]<=x[11]:
    penalty+=1000
if x[13]<=x[12]:
    penalty+=1000
if x[14]<=x[13]:
    penalty+=1000
if x[15]<=x[14]:
    penalty+=1000
if x[16]<=x[15]:
    penalty+=1000
if x[17]<=x[16]:
    penalty+=1000
if x[18]<=x[17]:
    penalty+=1000
if x[19]<=x[18]:
    penalty+=1000
if x[20]<=x[19]:
    penalty+=1000

     
eval_num=MAE+penalty
return eval_num

代码在DE中运行得很好,但我正在寻找一种更智能的方法来强制要求每个变量必须大于前一个变量。我想使用约束参数,但我不知道如何用正确的sintax编写线性约束。我见过人们使用字典,其他人使用专用函数(总是使用Minimize...unfortunately,没有使用DE的示例),我非常喜欢confused..and stuck :P

如果有人能提供一段适合这个问题的代码,那将是非常有帮助的。

谢谢

PS:使用建议的方法编辑,结果为f(x)=inf

EN

回答 1

Stack Overflow用户

发布于 2021-04-07 15:06:27

您可以将约束写成矩阵形式-infty <= B @ x <= 0,其中@表示矩阵乘法,B表示矩阵

代码语言:javascript
复制
( -1  1  0  0 0 .... 0  0)
( 0  -1  1  0 0 .... 0  0)
( 0   0 -1  1 0 .... 0  0)
( .                      )
( .                      )
( .                      )
( 0   0  0  0 0 .... -1 1)
( 0   0  0  0 0 ....  0 0)

然后你只需要传递一个约束:

代码语言:javascript
复制
from scipy.optimize import NonlinearConstraint, differential_evolution

# Assuming (n,) is the shape of x and v
B = np.eye(n, k = 1) - np.eye(n)
B[-1,-1] = 0.0

# Define the constraint: -np.inf <= B @ x <= 0.0
def constr_fun(x): return B @ x
nlc = NonlinearConstraint(constr_fun, -np.inf, 0.0)

# Your objective function
def obj_fun_cal(x,df_TZ_input,df_TZ_target):
    v = (x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],x[19],x[20])
    prodmx = df_TZ_input*v
    sum_vector = prodmx.sum(axis=1)
    MAE = np.mean(np.absolute(df_TZ_target-sum_vector))
    return MAE

# Pass the constraint..
result = differential_evolution(obj_fun_cal, args=(df_TZ_input, df_TZ_target), constraints=nlc)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66976295

复制
相关文章

相似问题

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