كيف يمكن تنفيذ طريقة Simplex في C# ؟ | سؤال وجواب

كيف يمكن تنفيذ طريقة Simplex في C# ؟

السؤال:
كيف يمكن تنفيذ طريقة simplex method علىC#

Profil
Icons
تم طرح السؤال بواسطة: مجهول
آخر تحديث: 2024-05-01

رقم السؤال: 419
الإجابة:

السلام عليكم، ها هو مثال على كيفية تنفيذ طريقة Simplex في C# باستخدام بعض المكتبات المتاحة مثل Extreme Optimization:

يمكن استخدام مكتبات أخرى للبرمجة الخطية مثل GLPK و Gurobi بدلاً من مكتبات Extreme.Mathematics.

using System;
using Extreme;
using Extreme.Mathematics.Optimization;

class Program
{
   static void Main()
   {
       // تحديد المصفوفة A والمتجه b والمتجه c
       double[,] A = { { 2, 1 }, { 1, 1 }, { 1, 0 } };
       double[] b = { 6, 4, 2 };
       double[] c = { 3, 2 };

       // إنشاء كائن LinearProgram
       LinearProgram lp = new LinearProgram()
       {
           // تعيين أبعاد المصفوفة والمتجهات
           A = Matrix.Create(A),
           B = Vector.Create(b),
           C = Vector.Create(c),
           Maximize = false // تعيين الهدف للحد الأدنى
       };

       // حل المسألة باستخدام طريقة Simplex
       SimplexSolver solver = new SimplexSolver();
       Solution solution = solver.Solve(lp);

       // طباعة الحل
       Console.WriteLine("Optimal solution:");
       foreach (var variable in solution.Variables)
       {
           Console.WriteLine($"{variable.Name}: {variable.Value}");
       }
       Console.WriteLine($"Optimal value: {solution.Value}");

       Console.ReadLine();
   }
}

يقوم هذا الكود بحل مسألة تحليل البرمجة الخطية التي تحتوي على مصفوفة A، ومتجه b، ومتجه c. يتم استخدام مكتبة Extreme Optimization لتوفير مجموعة من الأدوات الرياضية وأساليب الحلول بما في ذلك الطريقة البسيطة Simplex. تتيح هذه المكتبة إنشاء كائن LinearProgram لتحديد المعادلة الخطية ومن ثم حلها باستخدام طريقة Simplex.

مثال 2:

نفترض أن لدينا مشكلة برمجة خطية بسيطة مع دالة هدف وقيود على النحو التالي:

دالة الهدف:

Maximize Z = 2x1 + 3x2

القيود:

x1 + 2x2 <= 4
2x1 + x2 <= 6
x1, x2 >= 0

خطوات الحل:

  • تعريف المشكلة:
    • متغيرات المشكلة: x1 و x2.
    • دالة الهدف: Maximize Z = 2x1 + 3x2.
    • قيود المشكلة: x1 + 2x2 <= 4, 2x1 + x2 <= 6, x1, x2 >= 0.
  • إنشاء جدول simplex الأولي:

// جدول simplex الأولي
   | Basis | x1 | x2 | s1 | s2 | RHS | Z |
   |---|---|---|---|---|---|---|
   | s1 | 1 | 2 | 0 | 1 | 4 | 0 |
   | s2 | 2 | 1 | 1 | 0 | 6 | 0 |
   |   | -2 | -3 | 0 | 0 |   | 0 |
   -------------------------------
   |   | 0 | 1 | 0 | 0 | -3 | 2 |

// حيث:
   * s1 و s2 هما متغيرات الاصطناعية.
   * RHS هو الجانب الأيمن من القيود.
   * Z هي قيمة دالة الهدف.
   * Cj-Zj هو الفرق بين تكلفة العمود وقيمة Z لكل صف.

  • اختيار العمود المحوري:

في هذا الجدول، أصغر قيمة Zj-Zj سلبية هي -3 في العمود x2. لذلك، فإن العمود المحوري هو x2.

  • اختيار الصف المحوري:

حساب نسبة Bi/aj لكل صف:

Bi/aj = 4/1 = 4
      6/2 = 3

أصغر نسبة موجبة هي 3 في الصف 2. لذلك، فإن الصف المحوري هو الصف 2.

  • تحديث الجدول:

تقسيم الصف المحوري على العنصر المحوري (2):

// جدول simplex بعد التحديث
   | Basis | x1 | x2 | s1 | s2 | RHS | Z |
   |---|---|---|---|---|---|---|
   | s1 | 1 | 1 | 0 | 0.5 | 2 | 0 |
   | s2 | 0 | 0.5 | 1 | -0.5 | 3 | 3 |
   |   | -2 | -1.5 | 0 | 0.5 |   | -3 |
   -------------------------------
   |   | 0 | 0.5 | 0 | 0.5 | -3 | 3 |

  • تكرار الخطوات 3 إلى 5 حتى الوصول إلى الحل الأمثل:

في هذه الحالة، جميع قيم Zj-Zj إيجابية، لذلك فقد وصلنا إلى الحل الأمثل.

الحل الأمثل:

  • x1 = 0
  • x2 = 6
  • Z = 18

ملاحظة:

هذا مثال بسيط لتنفيذ طريقة simplex method على C#. يمكن تطبيق نفس الخطوات على مشاكل البرمجة الخطية الأكثر تعقيدًا باستخدام مكتبات البرمجة الخطية المتوفرة في C#.

شرح الكود:

  • يتم تعريف دالة الهدف والقيود في متغيرات منفصلة.
  • يتم إنشاء جدول simplex الأولي باستخدام صفوف وأعمدة لتمثيل جميع المتغيرات والقيود.
  • يتم استخدام دورة while لاختيار العمود المحوري، ثم الصف المحوري، ثم تحديث الجدول حتى الوصول إلى الحل الأمثل.
  • يتم حساب قيم Zj-Zj لكل عمود لتحديد العمود المحوري.
  • يتم حساب نسبة Bi/aj لكل صف لتحديد الصف المحوري.
  • يتم تقسيم الصف المحوري على العنصر المحوري لتحديث الجدول.

Profil
Icons
Yaser_sab1
كاتب محتوى في معلومات

التصنيف: تكنولوجيا
شارك



التصنيفات


شكرًا لكم على زيارتكم لمعلومات، ونتطلع لرؤية تقدمكم ونجاحكم في رحلة التعلم.