Microsoft Solver Foundation不解决Excel解算器解决的问题
我有一个约束的非线性优化问题。 我用Excel求解器(GRG)解决了这个问题,但是当我试图将它翻译成Microsoft Solver Foundation
C#时,它会得到solution.Quality = SolverQuality.Unknown
。
问题是这样的:我有一些决定和限制(上限和下限)为他们每一个。 还有另外两个约束(这些约束是有问题的):
- 该决定的总和需要为1(100%)
-
(MMULT(TRANSPOSE(Decision-Array),MMULT(Tabel-with-values,Decision-Array)))^0.5
需要等于另一个值
目标是sum(Decision * value)
。 我是这样写的:Microsoft Solver Foundation:
SolverContext solverData = SolverContext.GetContext(); context.ClearModel(); model = context.CreateModel(); for (i=0 ; i< decisionCount; i++) { var decision = new Decision(SolverDomain.RealNonnegative, "decisions_" + i); model.AddDecision(decision); model.AddConstraint("limits_of_" + i, downConstraint(i) <= decision <= upConstraint(i)); } var fdecision = new Decision(SolverDomain.RealNonnegative, "formula"); //mymatrix is double[,] model.AddConstraint("f_constraint_1", fdecision == matMult(transpose(model.Decisions.ToList()), matMult(matrix(mymatrix), transpose(model.Decisions.ToList()))[0, 0]); //myAalue is double = givvenValue^2 solverData.model.AddConstraint("f_constraint_2", fdecision == myAalue); var udecision = new Decision(SolverDomain.RealNonnegative, "upto100"); model.AddConstraint("upto1_constraint_1", udecision == UpTo100Precent(model.Decisions.ToList())); model.AddConstraint("upto1_constraint_2", udecision == 1); solverData.model.AddGoal("goal", GoalKind.Maximize, CalcGoal(model.Decisions.ToList())); model.AddDecision(udecision); model.AddDecision(fdecision); Solution solution = context.Solve(new HybridLocalSearchDirective() { TimeLimit = 60000 }); //add here I get solution.Quality == SolverQuality.Unknown
这些是我在上面的代码中使用的function:
private Term[,] matrix(Double[,] m) { int rows = m.GetLength(0); int cols = m.GetLength(1); Term[,] r = new Term[rows, cols]; for (int row = 0; row < rows; row++) for (int col = 0; col < cols; col++) r[row, col] = m[row, col]; return r; } private Term[,] matMult(Term[,] a, Term[,] b) { int rows = a.GetLength(0); int cols = b.GetLength(1); Term[,] r = new Term[rows, cols]; for (int row = 0; row < rows; row++) for (int col = 0; col < cols; col++) { r[row, col] = 0; for (int k = 0; k < a.GetLength(1); k++) { r[row, col] += a[row, k] * b[k, col]; } } return r; } private Term[,] transpose(Term[,] m) { int rows = m.GetLength(0); int cols = m.GetLength(1); Term[,] r = new Term[cols, rows]; for (int row = 0; row < rows; row++) for (int col = 0; col < cols; col++) { r[col, row] = m[row, col]; } return r; } private Term UpTo100Precent(List<Decision> decisions) { Term to100 = 0; foreach (var decision in decisions) { to100 += decision; } return to100; } private Term CalcGoal(List<Decision> decisions) { Term x = 0; //A is double[] for (i = 0; i < decisions.Count ; i++) { x += decisions[i] * A[1] } return x; }
有人有解决scheme吗?