Non Linear Programming Menggunakan Pyomo

Non Linear Programming, baik constraint ataupun objective function memiliki persamaan nonlinear, seperti perkalian antara variable, atau penggunaan fungsi non linear seperti Sin(), Cos() dan lainnya.

Mari kita ubah persamaan matematika dari modul sebelumnya menjadi persamaan nonlinear

#objective function
max x + xy

#constraint
-x + 2xy <= 8
2x + y <= 14
2x - y <= 10
0 <= x <= 10
0 <= y <= 10
#import library yang diperlukan
import pyomo.environ as pyo
from pyomo.environ import *
from pyomo.opt import SolverFactory

#inisialisasi model
model = pyo.ConcreteModel()

#definisikan variable
model.x = pyo.Var(bounds=(0,10))
model.y = pyo.Var(bounds=(0,10))
x = model.x
y = model.y

#definsikan constraint, perhatikan C1 memiliki persamaan nonlinear
model.C1 = pyo.Constraint(expr= -x+2*y*x<=8)
model.C2 = pyo.Constraint(expr= 2*x+y<=14)
model.C3 = pyo.Constraint(expr= 2*x-y<=10)

#definisikan objective function, perhatikan persamaan adalah nonlinear
model.obj = pyo.Objective(expr= x+y*x, sense=maximize)

#gunakan solver ipopt
opt = SolverFactory('ipopt', executable='C:\\ipopt\\bin\\ipopt.exe')
opt.solve(model)

model.pprint()

x_value = pyo.value(x)
y_value = pyo.value(y)

print('---------------------------------')
print('x=',x_value)
print('y=',y_value)
F:\Project\optimizationpy> python nonlp_pyomo.py
2 Var Declarations
    x : Size=1, Index=None
        Key  : Lower : Value              : Upper : Fixed : Stale : Domain
        None :     0 : 5.6067151589768685 :    10 : False : False :  Reals
    y : Size=1, Index=None
        Key  : Lower : Value              : Upper : Fixed : Stale : Domain
        None :     0 : 1.2134302215032389 :    10 : False : False :  Reals

1 Objective Declarations
    obj : Size=1, Index=None, Active=True
        Key  : Active : Sense    : Expression
        None :   True : maximize : x + y*x

3 Constraint Declarations
    C1 : Size=1, Index=None, Active=True
        Key  : Lower : Body        : Upper : Active
        None :  -Inf : - x + 2*y*x :   8.0 :   True
    C2 : Size=1, Index=None, Active=True
        Key  : Lower : Body    : Upper : Active
        None :  -Inf : 2*x + y :  14.0 :   True
    C3 : Size=1, Index=None, Active=True
        Key  : Lower : Body    : Upper : Active
        None :  -Inf : 2*x - y :  10.0 :   True

6 Declarations: x y C1 C2 C3 obj
---------------------------------
x= 5.6067151589768685
y= 1.2134302215032389

Solver dapat download di https://drive.google.com/file/d/1dgFE5ItIVxKPKsDyFXv3QpnW1cSi-AwF/view?usp=sharing

Pembahasan Code

Silakan lihat komentar pada code diatas untuk melihat penjelasan program. Dapat Anda perhatikan, proses dan logika coding tidak ada yang berubah dengan linear programming sebelumnya.

Perbadaanya saat penggunaan solver

opt = SolverFactory('ipopt', executable='C:\\ipopt\\bin\\ipopt.exe')
Sharing is caring:

Leave a Comment