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


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