В 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] да е възможно най-малък, като същевременно отговаря на критериите, че извикването на coverage[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 по неправилен начин? Възможно ли е това по някакъв начин?