神秘非线性优化中未满足的约束?

2024-10-01 00:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的优化问题,我需要最小化一个非线性目标函数,受多个等式和不等式约束,我所有的变量都是二进制变量。我已经用mystic编写了一个代码,但有时,结果不满足指定的约束。具体来说,在结果中,当形成矩阵时,每列的总和应为1

在神秘主义的例子中,我传递一个函数,使优化算法调用的约束字段中的所有变量都是二进制的,并传递由约束生成的惩罚

@discrete([0.0, 1.0])
def make_binaryv(x):
  return x

#generates constraints for mystic solver from string eqn
cf = generate_constraint(generate_solvers(simplify(eqn)))
#generate penalties for mystic solver from string eqn
pf = generate_penalty(generate_conditions(simplify(eqn))

#diffev is minimization function
result = diffev2(f, x0=bnds, bounds=bnds, penalty=pf, constraints=make_binaryv, npop=40, disp=False, full_output=True, gtol=100)

在上面的代码中:eqn是我所有约束的字符串。每个约束位于单独的行中

输出应将每列的总和设为1,但我得到的结果是:

[[1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 1. 1. 0.]
 [0. 1. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

有没有办法在约束字段中传递约束和二进制条件,而不使用惩罚字段


Tags: 函数代码fromforstringmake二进制simplify