- This topic has 1 reply, 2 voices, and was last updated 9 years ago by
hessinemaaoui.
-
AuthorPosts
-
June 27, 2011 at 2:38 pm #1874
hessinemaaoui
Keymaster//Hi, Here is a code trying to find x such that x’Vx*0.5-c’x is minimized constrained on sum of elements of x =1 ,but
//it doesn’t work well and I think the problem is on optim.solve which may not be able to optimize the functions like crosssum and dot by //myself, can anyone help to find the mistakes?
//Also, any better way to deal with a quadratic programming problem?
//Here is the code.import com.numericalmethod.suanshu.optimization.constrained.general.penaltymethod.PenaltyMethod;
import com.numericalmethod.suanshu.optimization.unconstrained.quasinewton.BFGS;
import com.numericalmethod.suanshu.analysis.function.rn2r1.RealScalarFunction;
import com.numericalmethod.suanshu.number.DoubleUtils;
import com.numericalmethod.suanshu.optimization.constrained.general.ConstrainedProblem;
import com.numericalmethod.suanshu.vector.doubles.Vector;
import com.numericalmethod.suanshu.optimization.constrained.general.constraint.EqualityConstraints;
import com.numericalmethod.suanshu.optimization.constrained.general.constraint.LessThanConstraints;
import com.numericalmethod.suanshu.matrix.doubles.matrixtype.dense.DenseMatrix;
import com.numericalmethod.suanshu.vector.doubles.dense.DenseVector;
import com.numericalmethod.suanshu.matrix.doubles.matrixtype.dense.DenseMatrixUtils;
import java.util.Arrays;
public class Quadprog{
public static void main(String[]arg){
double [] u = new double []{0.15,0.2,0.4,0.2,0.05,0.3,0.4,0.3,0.06};
DenseMatrix I1 = new DenseMatrix(u,3,3);
double [] a = new double []{1,0.5,0.7};
DenseVector mu = new DenseVector(a);System.out.println(Arrays.toString(Solver(I1,mu)));
}
public static double [] Solver (final DenseMatrix V , final DenseVector mu){
final double [][] v = DenseMatrixUtils.to2DArray(V);
final double []y = mu.toArray();
final int len = mu.length;
RealScalarFunction f = new RealScalarFunction() {
public double evaluate (double…x) {
return 0.5*crosssum(x,v)-dot(x,y);
}
public int dimension4Domain() {
return len;
}public int dimension4Range() {
return 1;
}
};
RealScalarFunction c1 = new RealScalarFunction() {
public double evaluate (double …x) {
return sum(x)-1;
}
public int dimension4Domain() {
return len;
}public int dimension4Range() {
return 1;
}
};
RealScalarFunction c2 = new RealScalarFunction() {
public double evaluate (double …x) {
return -sum(x);
}
public int dimension4Domain() {
return len;
}public int dimension4Range() {
return 1;
}
};
ConstrainedProblem problem = new ConstrainedProblem(f,new EqualityConstraints(c1),new LessThanConstraints(c2));
PenaltyMethod optim = new PenaltyMethod(PenaltyMethod.DEFAULT_PENALTY_FUNCTION_FACTORY,
1e30,
new BFGS());
optim.solve(problem, 1e-2, 200);
Vector xmin = optim.search(new DenseVector(new double []{0,0,0})); // as len=3
double fxmin = f.evaluate(xmin.toArray());System.out.println(String.format(“f(%s) = %f”, DoubleUtils.doubleArray2StringArray(xmin.toArray()), fxmin));
return xmin.toArray();
}
public static double sum (double []x) { //finding sum of elements of an array
double sum =0;
for (int i = 0; i<=x.length-1 ;i++) {
sum=sum+x;
}
return sum;
}
public static double crosssum (double []x ,double [][]v) { //finding x’vx
double sum =0;
for (int i = 0; i<=x.length-1 ;i++) {
for (int j=0; j<=x.length-1 ; j++){
sum=sum+v[j]*x*x[j];
}
}
return sum;
}
public static double dot(double []x , double []y){ //finding dot product of two arrays
double dot = 0;
for (int i=0; i<=x.length-1; i++){
dot = dot +x*y;
}
return dot;
}
} -
AuthorPosts
- You must be logged in to reply to this topic.