‫ درس 2 : حل یک مدل برنامه ریزی خطی عدد صحیح ( بخش دوم ) | انجمن

مدیریت
مدیریت 30 شهریور 1396

در این تمرین، برای تعریف مدل شامل متغیرهای و محدودیتها، از رویه استفاده می شود.

1. برنامه ویژوال استدیو را باز کرده و یک پروژه جدید باز می کنید.

2. یک فرم ساده با تنها یک دکمه commonbutton ایجاد می کنید.

3. در محیط ویژوال برنامه، بر روی دکمه دوبار کلیک می کنید تا کد مربوط به آن باز شود.

4. خروجی های این برنامه در یک متغیر رشته ای ذخیره می شود که برای این منظور باید متغیر زیر را تعریف کرد.

  Dim stra As String

        stra = ""

5. برای استفاده از ویژگی های cplex، از کلاس cplex یک شی نمونه سازی می کنیم که به صورت زیر صورت می گیرد.

            Dim cplex As New Cplex()

6. متغیرها و محدودیت ها به روش زیر تعریف می شود.

            Dim var(1)() As INumVar

            Dim rng(1)() As IRange

7. در این تمرین، برای ساخت مدل از فراخوانی تابع استفاده می شود که مدل در این تابع تولید می شود.

            PopulateByRowbutton2(cplex, var, rng)

8. تابع polulateByRowButton2 به صورت زیر تعریف می شود. ارگمان های این تابع، مدل، متغیر و محدودیت است. کلاس impmodeler قابلیت پذیرفت کلاس cplex را دارد.

  Friend Shared Sub PopulateByRowbutton2(ByVal model As IMPModeler, ByVal var()() As INumVar, ByVal rng()() As IRange)

9. حد پایین و حد بالا متغیرها با استفاده از کد زیر تعیین می شود.

        Dim xlb As Double() = {0.0, 0.0, 0.0, 2.0}

        Dim xub As Double() = {40.0, System.Double.MaxValue, System.Double.MaxValue, 3.0}

10. تعریف متغیر می تواند به صورت ارایه تعریف شود. برای این منظور تمامی ارگمان ها باید به صورت ارایه و هر مولفه از ارایه ویزگی متغیر در آرایه باشد. تفاوت NumVarArray با numvar در این است که در صورتی که تعداد متغیرها بسیار زیاد باشد می توان با دستور numvararray تمام متغیر را با یک خط تعریف کرد و نیاز به تعریف تک به تک متغیرها با استفاده از دستور numvar نیست.

        Dim xt As NumVarType() = {NumVarType.Int, NumVarType.Int, NumVarType.Int, NumVarType.Int}

        Dim x As INumVar() = model.NumVarArray(4, xlb, xub, xt)

        var(0) = x

11. برای تعریف تابع هدف به صورت بیشینه از دستور زیر استفاده میشود. برای این که ضرب متغیر در ضرایب آن ساده تر صورت گیرید، X و objvals به صورت آرایه باشد تا نیاز به ضرب متغیر در ضریب نباشد.

        ' Objective Function

        Dim objvals As Double() = {1.0, 2.0, 3.0, 1.0}

        model.AddMaximize(model.ScalProd(x, objvals))

12. محدودیت ها که به صورت کوچکتر مساوی است از دستور زیر برای اضافه شدن به مدل استفاده می شود. با اضافه کردن کد زیر، تعریف تابع 'PopulateByRow  به پایان می رسد.

        ' Three constraints

        rng(0) = New IRange(2) {}

        rng(0)(0) = model.AddLe(model.Sum(model.Prod(-1.0, x(0)), model.Prod(1.0, x(1)), model.Prod(1.0, x(2)), model.Prod(10.0, x(3))), 20.0)

        rng(0)(1) = model.AddLe(model.Sum(model.Prod(1.0, x(0)), model.Prod(-3.0, x(1)), model.Prod(1.0, x(2))), 30.0)

        rng(0)(2) = model.AddEq(model.Sum(model.Prod(1.0, x(1)), model.Prod(-3.5, x(3))), 0.0)

    End Sub 'PopulateByRow

13. با تعریف تابع popluateByrowمی توان تابع solve را اجرا کرد. برای گرفتن خروجی از توابع getvalues و getslacks  استفاده کنید. برای ذخیره نتایج از متغیر رشته ای stra استفاده می شود.

            If cplex.Solve() Then

                Dim x As Double() = cplex.GetValues(var(0))

                Dim slack As Double() = cplex.GetSlacks(rng(0))

                stra = stra & "Solution status = " & cplex.GetStatus().ToString & vbLf

                stra = stra & "Solution value  = " & cplex.ObjValue & vbLf

                Dim j As Integer

                For j = 0 To x.Length - 1

                    stra = stra & "Column: " & j & " Value = " & x(j) & vbLf

                Next j

                Dim i As Integer

                For i = 0 To slack.Length - 1

                    stra = stra & "Row   : " & i & " Slack = " & slack(i) & vbLf

                Next i

            End If

            cplex.End()

14. پس از اجرای برنامه، مدل حل می شود و نتایج به صورت زیر نشان داده می شود.

15. در صورتیکه می خواهید برنامه را ذخیره کنید بر روی دکمه save  کلیک کنید.

ویرایش شده توسط مدیریت (30 شهریور 1396)