Mathematica的Minimize
函数是否允许像Mod [x,2] == 0这样的约束?我正在尝试用Mathematica解决MinuteMath难题:
四个不同的正整数的最小平均值是多少?
我的“解决方案”看起来像这样:
vars = Subscript[x, #] & /@ Range[4];
cond = Apply[And, Mod[#, 2] == 0 & /@ vars] &&
(0 < Subscript[x, 1]) &&
Apply[And, Table[Subscript[x, i] < Subscript[x, i + 1], {i, 1, 3}]];
Minimize[{Mean[vars], cond}, vars, Integers]
但Minimize
返回未评估。其他问题:我可以使用EvenQ
来定义约束吗?问题是,EvenQ[x]
为未定义的表达式False
返回x
。
答案 0 :(得分:5)
显然,这不需要数学,但是,在回答你的问题时,Minimize
似乎不喜欢数学。你可以将它构建到公式中,如下所示:
Minimize[{(2 x1 + 2 x2 + 2 x3 + 2 x4)/4,
0 < x1 < x2 < x3 < x4}, {x1, x2, x3, x4}, Integers]
答案 1 :(得分:4)
这个问题明显有些过分,但有助于展示一些技巧。
请注意:
Exists[x, Element[x, Integers] && n x == y]
可以用作
的替代方案 Mod[y,n] == 0
所以:
Minimize[{(x1 + x2 + x3 + x4)/4, 0 < x1 < x2 < x3 < x4 &&
Exists[x, Element[x, Integers] && 2 x == x1] &&
Exists[x, Element[x, Integers] && 2 x == x2] &&
Exists[x, Element[x, Integers] && 2 x == x3] &&
Exists[x, Element[x, Integers] && 2 x == x4]
},
{x1, x2, x3, x4}, Integers]
-> {5, {x1 -> 2, x2 -> 4, x3 -> 6, x4 -> 8}}
或许更优雅:
s = Array[x, 4];
Minimize[{
Total@s,
Less @@ ({0} \[Union] s) &&
And @@ (Exists[y, Element[y, Integers] && 2 y == #] & /@ s)},
s, Integers]
--> {20, {x[1] -> 2, x[2] -> 4, x[3] -> 6, x[4] -> 8}}
答案 2 :(得分:0)
最小化不适用于此问题,它给出了错误的解决方案:
2 4 8 10
好的解决方案是:
2 4 6 12
“选择”接受Mod功能要比“最小化”要好
最小化给出了错误的解决方案。
播放此程序,请参阅:
Res=Select[Permutations[Range@20 {4}],Mod[ #[[1]],2]==0 &&Mod[ #[[2]],2]==0&&Mod[#[[3]],2]==0 &&Mod[#[[4]],2]==0&&Mod[(#[[1]]+#[[2]]+#[[3]]+#[[4]])/4,2]==0 &];Sort[Res,Less];Res[[1]]