我有一个很大的优化问题,我需要最小化一个非线性目标函数,受多个等式和不等式约束,我所有的变量都是二进制变量。我已经用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.]]
有没有办法在约束字段中传递约束和二进制条件,而不使用惩罚字段
目前没有回答
相关问题 更多 >
编程相关推荐