У меня есть набор уравнений. У меня также есть набор значений и результаты для уравнения. Что-то вроде:Решение уравнений как CSP
a + b + c = x
и некоторые выделения могут быть:
1 + 1 + 1 = 3
2 + 3 + 4 = 9
Однако фактические уравнения намного больше и может содержать некоторые функции, например, логарифмы.
Теперь мне нужно изменить результат заданного набора так, чтобы (1) уравнение становилось равным определенному значению xx и (2) параметры менялись как можно меньше.
Я думал, что я мог бы решить эту проблему, как ПЕС путем изменения eqation к
(a + ax) + (b + bx) + (c + cx) = xx
где а, Ь и с соответствуем старым ценностям и ах, Ой и ое различие, которые должны быть применены к соответствующим старым значениям. И xx будет результатом, который я хочу получить у уравнения. Обратите внимание, что a, b, c, xa, xb, cx и т. Д. Являются целыми значениями, а xx всегда будет находиться на некотором расстоянии от x, то есть xx - d < x < xx + d
.
В CSP a, b, c и xx будут рассматриваться как факты проблемы, ax, bx, cx будет рассматриваться как переменная планирования, а уравнение (a + ax) + (b + bx) + (c + cx) = xx
будет жестким ограничением. Минимизация всех топора, ab, ac будет мягким ограничением. Я не вижу здесь объекта планирования.
global HardSoftScoreHolder scoreHolder;
rule "changeIsBad"
when
DeltaVariable($delta : delta)
then
scoreHolder.addSoftConstraintMatch(kcontext, -Math.abs(delta));
end
rule "equationMustBeEqual"
// No idea?
end
Но я не могу понять, как это происходит дальше. Возможно ли Optaplanner для такого рода проблем? Кажется, все PlanningVariable
s должны поступать из списка и должны быть экземплярами, тогда как у меня есть только целые значения. Является ли моя модель правильной?
Линейный подход к программированию может быть проще. Вы считали это? –
Я не думаю, что линейное программирование возможно, потому что уравнения не обязательно линейны. – Mene