در این تمرین، برای تعریف مدل شامل متغیرهای و محدودیتها، از رویه استفاده می شود.
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 کلیک کنید.