Не выполняются ли ограничения в мистической нелинейной оптимизации? - PullRequest
0 голосов
/ 17 октября 2019

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

Есть ли способ передать оба ограничения? и двоичное условие в поле ограничений, а не использовать штрафное поле?

...