В Mathematica я определил следующее, чтобы попытаться решить проблему оптимизации:
costVector := {710000, 610000, 650000, 910000, 720000, 570000}
cost[x_] := Total[IntegerDigits[x, 2, 6]*costVector]
coverage[x_] := coveragex @@ IntegerDigits[x, 2, 6]
coveragex[a_ , b_, c_, d_, e_, f_ ] :=
Complement[
Union[a*{4, 5, 6}, b*{1, 5}, c*{5, 6, 7}, d*{1, 3, 4, 7},
e*{2, 3, 5}, f*{2, 6}], {0}]
goal = {1, 2, 3, 4, 5, 6, 7}
Подводя итог проблеме: я хотел бы найти шестизначное двоичное значение x, такое что cost[x] было бы как можно меньше, при этом выполняя критерии, согласно которым вызовcover[x] дает указанную цель списка целых чисел. Чтобы найти это значение, я пытаюсь использовать NMinimize следующим образом:
NMinimize[{cost[x], {(coverage[x]) == goal,
x <= 63, x >= 0}}, x]|
Моя проблема в том, что я получаю следующую ошибку:
NMinimize::bcons: "The following constraints are not valid: {coveragex[x,2,6]==goal,x>=0,x<=63}. Constraints should be equalities, inequalities, or domain specifications involving the variables"
По какой-то причине система Mathematica считает, что ограничение, сравнивающее покрытие[x] с целью, не является равенством. Я рву на себе волосы, пытаясь понять, почему. Я только что сделал какую-то синтаксическую ошибку или неправильно использую NMinimize? Это как-то выполнимо?