在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似乎认为将coverage [x]与目标进行比较的约束不是一个平等。我一直在试图找出原因。我刚刚做了某种语法错误,或者我是否以错误的方式使用NMinimize?这有可能吗?
答案 0 :(得分:1)
2 6 可能性不是那么,所以我在所有可能性上都使用了一个简单的迭代:
MinimalBy[Select[Range[2^6 - 1], coverage[#] == goal &], cost]
我不太了解Mathematica以了解错误消息,但coverage[x,2,6]
看起来像是错误的参数数量。我还担心NMinimize
无法知道它只应该尝试整数,并且如果提供了非整数,其他事情就会破坏。但那只是在猜测。