Mathematica, NMinimize: ограничение равенства, включающее функцию, неверно

В 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? Это как-то выполнимо?


person DJTunafish    schedule 02.04.2015    source источник


Ответы (1)


26 возможностей — это не так уж много, поэтому я бы использовал простую итерацию по всем возможностям:

MinimalBy[Select[Range[2^6 - 1], coverage[#] == goal &], cost]

Я недостаточно знаю Mathematica, чтобы понять сообщение об ошибке, но coverage[x,2,6] выглядит здесь как неправильное количество аргументов. Я также боюсь, что NMinimize не может знать, что он должен пробовать только целые числа, и что другие вещи сломаются, если будут предоставлены нецелые числа. Но это только предположение.

person MvG    schedule 02.04.2015
comment
Хм, я полагаю, вы правы насчет этого. Я попробую ваше предложение, спасибо! - person DJTunafish; 03.04.2015