Hello,
I am new to ALGLIB and I must say it is a great library to use.
My issue is that I have the following optimization problem (c#), and I am trying to obtain the most evenly distributed solution, i.e. I'm aiming to have a reduction in the weights that is as evenly distributed amongst them as possible. Is there a way to ensure that? My code is as follows:
Code:
public static void createWeightsFunction(double[] w, ref double func, double[] grad, object obj)
{
//Create the function to minimise
//In our case: - w[0] - w[1] - ... - w[n-1]
func = 0;
for (int i = 0; i < w.Length; i++)
{
func -= w[i];
grad[i] = 1;
}
}
public static double[] getOptimizedWeights(double[] totalAppliancePrices, double[] thresholds, double target)
{
double[] weights = new double[totalAppliancePrices.Length];
for (int i = 0; i < weights.Length; i++)
{
weights[i] = 1;
}
double[,] constr = new double[1, weights.Length + 1];
//Add total consumption condition
for (int i = 0; i < weights.Length; i++)
{
constr[0, i] = totalAppliancePrices[i];
}
constr[0, weights.Length] = target;
int[] ct = new int[1];
ct[0] = 0;
// Add boundary constraints
double[] bndl = new double[weights.Length];
double[] bndu = new double[weights.Length];
for (int i = 0; i < weights.Length; i++)
{
bndl[i] = thresholds[i];
bndu[i] = 1;
}
alglib.minbleicstate state;
alglib.minbleicreport rep;
//
// These variables define stopping conditions for the optimizer.
//
// We use very simple condition - |g|<=epsg
//
double epsg = 0.000001;
double epsf = 0;
double epsx = 0;
int maxits = 0;
//
// Now we are ready to actually optimize something:
// * first we create optimizer
// * we add linear constraint
// * we add the boundary constraints
// * we tune stopping conditions
// * and, finally, optimize and obtain results...
//
try
{
alglib.minbleiccreate(weights, out state);
alglib.minbleicsetlc(state, constr, ct);
alglib.minbleicsetbc(state, bndl, bndu);
alglib.minbleicsetcond(state, epsg, epsf, epsx, maxits);
alglib.minbleicoptimize(state, createWeightsFunction, null, null);
alglib.minbleicresults(state, out weights, out rep);
}
catch (Exception ex)
{
}
return weights;
}
Thank you in advance.