У меня большая проблема оптимизации, когда мне нужно минимизировать нелинейную целевую функцию с учетом множества ограничений равенства и неравенства, и все мои переменные являются двоичными переменными. Я написал код на мистике, но иногда результаты не удовлетворяют указанным ограничениям. В частности, в результате, когда в виде матрицы каждый столбец должен иметь сумму 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.]]
Есть ли способ передать оба ограничения? и двоичное условие в поле ограничений, а не использовать штрафное поле?