मेरे पास बाधाओं के साथ एक गैर-रैखिक अनुकूलन समस्या है। इसे सॉफ़्टवेयर ऐड-इन के साथ माइक्रोसॉफ्ट एक्सेल में हल किया जा सकता है, लेकिन मुझे सी # में दोहराने में परेशानी हो रही है।मैं सी # में माइक्रोसॉफ्ट एक्सेल की सॉल्वर कार्यक्षमता (जीआरजी नॉनलाइनर) का अनुकरण कैसे कर सकता हूं?
मेरी समस्या following spreadsheet में दिखाया गया है। मैं क्लासिक ए x = b समस्या को हल कर रहा हूं लेकिन चेतावनी के साथ कि x के सभी घटक गैर-नकारात्मक होना चाहिए। तो मानक रैखिक बीजगणित का उपयोग करने के बजाय मैं गैर-नकारात्मक बाधा के साथ सॉल्वर का उपयोग करता हूं, वर्ग अंतरों के योग को कम करता हूं, और उचित समाधान प्राप्त करता हूं। मैंने Microsoft Solver Foundation या Solver SDK का उपयोग करके इसे सी # में दोहराने की कोशिश की है। हालांकि मुझे उनके साथ कहीं भी नहीं मिल रहा है क्योंकि एमएसएफ के साथ मैं यह नहीं समझ सकता कि लक्ष्य को परिभाषित करने के लिए और सॉल्वर एसडीके के साथ मैं हमेशा "इष्टतम" स्थिति वापस लेता हूं और सभी 0 का समाधान जो निश्चित रूप से स्थानीय भी नहीं है न्यूनतम।
यहाँ सॉल्वर एसडीके के लिए मेरे कोड है:
static double[][] A = new double[][] { new double[] { 1, 0, 0, 0, 0 }, new double[] { 0.760652602, 1, 0, 0, 0 }, new double[] { 0.373419404, 0.760537565, 1, 0, 0 }, new double[] { 0.136996731, 0.373331934, 0.760422587, 1, 0 }, new double[] { 0.040625222, 0.136953801, 0.373244464, 0.76030755, 1 } };
static double[][] b = new double[][] { new double[] { 2017159 }, new double[] { 1609660 }, new double[] { 837732.8125 }, new double[] { 330977.3125 }, new double[] { 87528.38281 } };
static void Main(string[] args)
{
using(Problem problem = new Problem(Solver_Type.Minimize, 5, 0))
{
problem.VarDecision.LowerBound.Array = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0 };
problem.VarDecision.UpperBound.Array = new double[] { Constants.PINF, Constants.PINF, Constants.PINF, Constants.PINF, Constants.PINF };
problem.Evaluators[Eval_Type.Function].OnEvaluate += new EvaluateEventHandler(SumOfSquaredErrors);
problem.ProblemType = Problem_Type.OptNLP;
problem.Solver.Optimize();
Optimize_Status status = problem.Solver.OptimizeStatus;
Console.WriteLine(status.ToString());
foreach(double x in problem.VarDecision.FinalValue.Array)
{
Console.WriteLine(x);
}
}
}
static Engine_Action SumOfSquaredErrors(Evaluator evaluator)
{
double[][] x = new double[evaluator.Problem.Variables[0].Value.Array.Length][];
for(int i = 0; i < x.Length; i++)
{
x[i] = new double[1] { evaluator.Problem.Variables[0].Value.Array[i] };
}
double[][] b_calculated = MatrixMultiply(A, x);
double sum_sq = 0.0;
for(int i = 0; i < b_calculated.Length; i++)
{
sum_sq += Math.Pow(b_calculated[i][0] - b[i][0], 2);
}
evaluator.Problem.FcnObjective.Value[0] = sum_sq;
return Engine_Action.Continue;
}
static double[][] MatrixMultiply(double[][] left, double[][] right)
{
if(left[0].Length != right.Length)
{
throw new ArgumentException();
}
double[][] sum = new double[left.Length][];
for(int i = sum.GetLowerBound(0); i <= sum.GetUpperBound(0); i++)
{
sum[i] = new double[right[i].Length];
}
for(int i = 0; i < sum.Length; i++)
{
for(int j = 0; j < sum[0].Length; j++)
{
for(int k = 0; k < right.Length; k++)
{
sum[i][j] += left[i][k] * right[k][j];
}
}
}
return sum;
}
मैं क्योंकि मुझे नहीं लगता कि लक्ष्य समारोह एक पंक्ति में लिखा जा सकता है माइक्रोसॉफ्ट सॉल्वर फाउंडेशन के लिए किसी भी कोड नहीं है और यह 'नहीं करता है सॉलवर एसडीके जैसे प्रतिनिधियों की अनुमति नहीं है।
तो हमें अपना कोड दिखाने के बारे में कैसे?यदि आप सभी 0 वापस प्राप्त करते हैं तो आप शायद कुछ गलत कर रहे हैं। –
वहां आप जाते हैं। पहले यह किया होगा लेकिन मुझे एक त्वरित और गंदे मैट्रिक्स गुणात्मक कार्य लिखना पड़ा क्योंकि मैं मालिकाना 'मैट्रिक्स' वर्ग का उपयोग कर रहा हूं। –
@FistOfFury नीचे स्वीकार किए जाते हैं जवाब देखें माइक्रोसॉफ्ट solver नींव कोड – FistOfFury