CompactQuasiNewtonSolver.Solve Method
Solve a model using the specified parameters.
Namespace: Microsoft.SolverFoundation.Solvers
Assembly: Microsoft.Solver.Foundation (in Microsoft.Solver.Foundation.dll)
Syntax
'Declaration
Public Function Solve ( _
solverParams As CompactQuasiNewtonSolverParams _
) As CompactQuasiNewtonSolutionQuality
public CompactQuasiNewtonSolutionQuality Solve(
CompactQuasiNewtonSolverParams solverParams
)
public:
CompactQuasiNewtonSolutionQuality Solve(
CompactQuasiNewtonSolverParams^ solverParams
)
member Solve :
solverParams:CompactQuasiNewtonSolverParams -> CompactQuasiNewtonSolutionQuality
public function Solve(
solverParams : CompactQuasiNewtonSolverParams
) : CompactQuasiNewtonSolutionQuality
Parameters
- solverParams
Type: Microsoft.SolverFoundation.Solvers.CompactQuasiNewtonSolverParams
The solver parameters.
Return Value
Type: Microsoft.SolverFoundation.Solvers.CompactQuasiNewtonSolutionQuality
The solution quality.
Examples
The following code example demonstrates how to use the compact quasi-Newton solver to solve a multi-dimensional variant of Rosenbrock's function. For more examples, see Samples for Solver Foundation.
Private Shared Sub SolveSecondMultidimensionalVariant(ByVal dimentions As Integer)
Dim solverParams = New CompactQuasiNewtonSolverParams()
Dim solver = New CompactQuasiNewtonSolver(dimentions)
solver.GradientAndValueAtPoint = AddressOf SecondRosenbrockVariantCallback
Dim solutionQuality As CompactQuasiNewtonSolutionQuality = solver.Solve(solverParams)
Console.WriteLine("=========Second, more complicated multidimensional variant of Rosenbrock==========")
Console.WriteLine(solver.ToString())
solver.SetStartingPointValue(0, -1)
For i As Integer = 1 To dimentions - 1
solver.SetStartingPointValue(i, 1)
Next
solutionQuality = solver.Solve(solverParams)
Console.WriteLine("=========Second, more complicated multidimensional variant of Rosenbrock, trapped in local Minima==========")
Console.WriteLine(solver.ToString())
End Sub
Private Shared Function SecondRosenbrockVariantCallback(ByVal point As Double(), ByVal gradient As Double()) As Double
Dim dimentions As Integer = gradient.Length
If dimentions < 2 Then
Throw New ArgumentException("Multidimensional variant require at least two dimensions")
End If
' common alpha is 100
Dim alpha As Integer = 100
' first dimention special case
Dim value As Double = alpha * (Math.Pow((point(1) - point(0) * point(0)), 2)) + (Math.Pow(1 - point(0), 2))
gradient(0) = 4 * alpha * point(0) * (point(0) * point(0) - point(1)) + 2 * (point(0) - 1)
For i As Integer = 1 To gradient.Length - 2
value += alpha * (Math.Pow((point(i + 1) - point(i) * point(i)), 2)) + (Math.Pow(1 - point(i), 2))
gradient(i) = -2 * alpha * (point(i - 1) * point(i - 1) - point(i)) + 4 * alpha * point(i) * (point(i) * point(i) - point(i + 1)) + 2 * (point(i) - 1)
Next
' last dimention special case
gradient(dimentions - 1) = -2 * alpha * (point(dimentions - 2) * point(dimentions - 2) - point(dimentions - 1))
Return value
End Function
static void SolveSecondMultidimensionalVariant(int dimentions) {
var solverParams =
new CompactQuasiNewtonSolverParams();
var solver =
new CompactQuasiNewtonSolver(dimentions);
solver.GradientAndValueAtPoint =
SecondRosenbrockVariantCallback;
CompactQuasiNewtonSolutionQuality solutionQuality =
solver.Solve(solverParams);
Console.WriteLine("=========Second, more complicated multidimensional variant of Rosenbrock==========");
Console.WriteLine(solver.ToString());
solver.SetStartingPointValue(0, -1);
for (int i = 1; i < dimentions; i++)
solver.SetStartingPointValue(i, 1);
solutionQuality = solver.Solve(solverParams);
Console.WriteLine("=========Second, more complicated multidimensional variant of Rosenbrock, trapped in local Minima==========");
Console.WriteLine(solver.ToString());
}
static double SecondRosenbrockVariantCallback(
/*in*/double[] point, /*out*/double[] gradient) {
int dimentions = gradient.Length;
if (dimentions < 2)
throw new ArgumentException("Multidimensional variant require at least two dimensions");
// common alpha is 100
int alpha = 100;
// first dimention special case
double value =
alpha * (Math.Pow((point[1] - point[0] * point[0]), 2)) +
(Math.Pow(1 - point[0], 2));
gradient[0] =
4 * alpha * point[0] * (point[0] * point[0] - point[1]) +
2 * (point[0] - 1);
for (int i = 1; i < gradient.Length - 1; i++) {
value +=
alpha * (Math.Pow((point[i + 1] - point[i] * point[i]), 2)) +
(Math.Pow(1 - point[i], 2));
gradient[i] =
-2 * alpha * (point[i - 1] * point[i - 1] - point[i]) +
4 * alpha * point[i] * (point[i] * point[i] - point[i + 1]) +
2 * (point[i] - 1);
}
// last dimention special case
gradient[dimentions - 1] =
-2 * alpha * (point[dimentions - 2] * point[dimentions - 2] -
point[dimentions - 1]);
return value;
}
.NET Framework Security
- Full trust for the immediate caller. This member cannot be used by partially trusted code. For more information, see Using Libraries from Partially Trusted Code.
See Also
Reference
CompactQuasiNewtonSolver Class
CompactQuasiNewtonSolver Members