• Tidak ada hasil yang ditemukan

BAB IV HASIL DAN PEMBAHASAN

4.3 Model Matematika

4.3.1 Penentuan Variabel Keputusan

Variabel keputusan pada permasalahan ini adalah banyaknya rumah masing-masing tipe yang ada di perumahan β€œAmbara Citra”. Variabel-variabel tersebut yaitu

π‘₯1= banyaknya rumah tipe 45/84 yang dibangun π‘₯2= banyaknya rumah tipe 50/96 yang dibangun π‘₯3= banyaknya rumah tipe 62/112 yang dibangun

4.3.2 Penentuan Fungsi Tujuan

Fungsi tujuan atau fungsi objektif dalam permasalahan ini yaitu memaksimumkan keuntungan dari penjualan rumah di perumahan

β€œAmbara Citra”, dan dirumuskan dalam fungsi seperti berikut:

Memaksimumkan:

𝒁 = πŸ”πŸ‘. πŸ—πŸπŸŽ. πŸŽπŸŽπŸŽπ’™πŸ+ πŸ•πŸ. πŸ‘πŸ—πŸŽ. πŸŽπŸŽπŸŽπ’™πŸ+ πŸπŸ‘πŸ. πŸ–πŸ–πŸŽ. πŸŽπŸŽπŸŽπ’™πŸ‘

4.3.3 Penentuan Fungsi Kendala

Kendala dalam pemodelan ini bertujuan agar diperoleh jumlah unit rumah yang maksimum. Uraian berikut adalah kendala-kendala yang digunakan dalam pemodelan ini yaitu

1. Kapasitas lahan

Total luas lahan yang digunakan untuk pembangunan seluruh rumah adalah 60% dari keseluruhan luas lahan. Seperti yang sudah dijelaskan di atas, maka luas lahan yang digunakan dalam kendala ini paling banyak adalah 6.600π‘š2. Untuk tiap unit rumah tipe 45/84 membutuhkan luas lahan 84π‘š2, tiap unit rumah tipe 50/96 membutuhkan luas lahan 96π‘š2, dan tiap unit rumah tipe 62/112 membutuhkan luas 112π‘š2. Dengan demikian model matematika dari kendala tersebut adalah

πŸ–πŸ’π’™πŸ+ πŸ—πŸ”π’™πŸ+ πŸπŸπŸπ’™πŸ‘β‰€ πŸ”. πŸ”πŸŽπŸŽ ………(1)

2. Minat Beli Masyarakat

Kendala minat beli masyarakat diperoleh dari hasil analisis minat beli masyarakat terhadap suatu tipe rumah yang ditawarkan oleh PT. Citra Kedaton seperti pada Tabel 4.4 dengan demikian model matematika dari kendala tersebut adalah

a. Tipe 45/84

Berdasarkan hasil kuesioner, rumah tipe 45/84 yang paling banyak diminati. Oleh sebab itu, pada pemodelan ini untuk banyaknya rumah tipe 45/84 tidak dibatasi.

b. Tipe 50/96

Untuk tipe 50/96 jumlah rumah yang dibangun tidak boleh melebihi 24% dari total keseluruhan rumah seperti pada Tabel 4.4. Sehingga dapat dirumuskan sebagai berikut.

π‘₯2 ≀ 24%(π‘₯1 + π‘₯2+ π‘₯3) π‘₯2 ≀ 0,24(π‘₯1+ π‘₯2+ π‘₯3) π‘₯2 ≀ 0,24π‘₯1+ 0,24π‘₯2+ 0,24π‘₯3

βˆ’0,24π‘₯1+ π‘₯2βˆ’ 0,24π‘₯2 βˆ’ 0,24π‘₯3 ≀ 0

βˆ’πŸŽ, πŸπŸ’π’™πŸ+ 𝟎, πŸ•πŸ”π’™πŸβˆ’ 𝟎, πŸπŸ’π’™πŸ‘ ≀ 𝟎 ………...(2) c. Tipe 62/112

Untuk tipe 62/112 jumlah rumah yang dibangun tidak boleh melebihi 17% dari total keseluruhan rumah seperti pada Tabel 4.4. Sehingga dapat dirumuskan sebagai berikut.

π‘₯3 ≀ 17%(π‘₯1 + π‘₯2+ π‘₯3)

π‘₯3 ≀ 0,17(π‘₯1+ π‘₯2+ π‘₯3) π‘₯3 ≀ 0,17π‘₯1+ 0,17π‘₯2+ 0,17π‘₯3

βˆ’0,17π‘₯1βˆ’ 0,17π‘₯2+ π‘₯3 βˆ’ 0,17π‘₯3 ≀ 0

βˆ’πŸŽ, πŸπŸ•π’™πŸβˆ’ 𝟎, πŸπŸ•π’™πŸ+ 𝟎, πŸ–πŸ‘π’™πŸ‘ ≀ 𝟎 ………...(3) d. Urutan banyaknya peminat tiap rumah

Berdasarkan hasil kuesioner, urutan pertama rumah yang paling banyak diminati oleh masyarakat adalah tipe 45/84, urutan kedua rumah tipe 50/96, dan urutan ketiga adalah rumah tipe 62/112.

Sehingga dapat dirumuskan sebagai berikut.

π‘₯1 β‰₯ π‘₯2 β‰₯ π‘₯3, artinya

ο‚· π‘₯1 β‰₯ π‘₯2

π’™πŸβˆ’ π’™πŸβ‰₯ 𝟎 ………...(4)

ο‚· π‘₯2 β‰₯ π‘₯3

π’™πŸβˆ’ π’™πŸ‘β‰₯ 𝟎 ………...……(5)

3. Kapasitas perumahan

Kapasitas perumahan diperoleh dari total keseluruhan luas lahan yang digunakan untuk pembangunan rumah dibagi dengan masing-masing luas lahan tiap tipe rumah sehingga banyaknya tiap tipe rumah yang dibangun tidak boleh melebihi kapasitas tersebut.

a. Tipe 45/84

Untuk setiap rumah tipe 45/84 yang dibangun membutuhkan luas lahan 84π‘š2, dengan demikian di perumahan tersebut maksimum hanya dapat dibangun rumah tipe 45/84 sebanyak 6.600: 84 =

78,57 dan dapat dibulatkan ke bawah menjadi 78. Berdasarkan hal tersebut maka dapat dirumuskan sebagai berikut.

π’™πŸ ≀ πŸ•πŸ– …...(6) b. Tipe 50/96

Untuk setiap rumah tipe 50/96 yang dibangun membutuhkan luas lahan 96π‘š2, dengan demikian di perumahan tersebut maksimum hanya dapat dibangun rumah tipe 50/96 sebanyak 6.600: 96 = 68,75 dan dapat dibulatkan ke bawah menjadi 68. Berdasarkan hal tersebut maka dapat dirumuskan sebagai berikut.

π’™πŸ ≀ πŸ”πŸ– …...……….(7)

c. Tipe 62/112

Untuk setiap rumah tipe 62/112 yang dibangun membutuhkan luas lahan 112π‘š2, dengan demikian di perumahan tersebut maksimum hanya dapat dibangun rumah tipe 62/112 sebanyak 6.600: 112 = 58,93 dan dapat dibulatkan ke bawah menjadi 58.

Berdasarkan hal tersebut maka dapat dirumuskan sebagai berikut.

π’™πŸ‘ ≀ πŸ“πŸ– ………(8)

4.4 Pemrograman Python

4.4.1 Penyusunan Aplikasi GUI Integer Programming

Menurut Abdul Kadir (2018), GUI (Graphical User Interface) adalah suatu antarmuka yang memungkinkan pengguna berinteraksi dengan sistem operasi melalui seperangkat elemen atau widget.

Pembuatan aplikasi GUI di Python dalam penelitian ini menggunakan perangkat Tkinter. Tkinter (Tk Interface) adalah suatu pustaka atau modul GUI yang secara langsung (bawaan) telah tersedia pada bahasa pemrograman Python sehingga memberikan kemudahan bagi para programmer dalam pembuatan program GUI. Aplikasi GUI ini juga menggunakan pustaka PuLP. Pustaka PuLP merupakan pustaka yang sudah tersedia dan ditulis dengan bahasa pemrograman Python. Pustaka tersebut digunakan untuk memodelkan dan menyelesaikan masalah yang berkaita dengan Linear Programming

Langkah awal yang harus dilakukan dalam pembuatan aplikasi GUI Integer Programming adalah memanggil modul Tkinter dengan memberikan perintah seperti pada gambar berikut.

Gambar 4.1 Memanggil Modul Tkinter

Berdasarkan Gambar 4.1 pernyataan from tkinter import * dan from tkinter import ttk digunakan untuk mengimpor modul Tkinter. Pernyataan from pulp import * digunakan untuk mengimpor pustaka PuLP.

Langkah selanjutnya adalah menuliskan suatu fungsi untuk membuat tampilan berbasis GUI seperti pada gambar berikut.

Gambar 4.2 Fungsi untuk Tampilan Jendela 1

Berdasarkan Gambar 4.2 fungsi dengan nama start_gui() digunakan untuk membuat tampilan jendela utama pertama. Pernyataan root = Tk() digunakan untuk membuat objek jendela. Variabel root akan merujuk ke objek jendela tersebut. Variabel tersebut merupakan variabel lokal yang hanya dapat diakses selama fungsi berjalan. Variabel tersebut akan digunakan diseluruh bagian kode jendela pertama sehingga perlu diubah menjadi variabel global dengan menambahkan pernyataan global root.

Selanjutnya perlu jendela baru yang akan diletakkan pada jendela pertama sehingga ditambahkan pernyataan top = Toplevel1(root). Jendela baru tersebut merupakan tempat untuk menampilkan objek-objek berikutnya.

Pernyataan root.mainloop() digunakan untuk menampilkan jendela pertama.

Setelah jendela baru top dibuat, perlu dilakukan beberapa pengaturan agar tampilan terlihat rapi. Pengaturan tersebut dapat dilakukan dengan menambahkan kode seperti berikut.

Gambar 4.3 Pengaturan Jendela Top

Berdasarkan Gambar 4.3 pernyataan top.geometry("680x600") digunakan untuk menentukan ukuran jendela dengan 680 menyatakan ukuran kolom dan 600 menyatakan ukuran baris. Pernyataan top.title("Kalkulator Integer Programming") digunakan untuk memberi judul pada jendela.

Pernyataan top.configure(bg="white") digunakan untuk memberi warna latar belakang jendela.

Jendela tersebut akan diisi dengan beberapa objek. Dalam aplikasi ini, objek atau widgets yang akan digunakan antara lain Button, Entry, Label, Radiobutton, Scrollbar, dan Combobox.

1. Button

Button adalah widget yang menyatakan suatu tombol. Widget ini digunakan untuk melaksanakan suatu tugas tertentu ketika diklik.

Pada aplikasi GUI Integer Programming terdapat beberapa tombol yaitu tombol β€œOK”, β€œHitung”, β€œReset”, dan β€œKembali”. Contoh kode untuk membuat tombol dapat dilihat seperti gambar berikut.

Gambar 4.4 Contoh Penggunaan Widget Button

Berdasarkan Gambar 4.4 pernyataan pertama yaitu self.ok=Button(self.second_frame) digunakan untuk membuat tombol dengan tulisan β€œOK” sesuai dengan pernyataan self.ok.configure(text='OK'). Pernyataan self.ok.grid(row=6, column=4, pady=5, padx=5) digunakan untuk mengatur letak tombol

β€œOK”. Pernyataan self.ok.configure(command=lambda:

[self.hasilinput(), self.buatTabel()]) digunakan untuk menjalankan fungsi hasilinput() dan buatTabel() saat tombol diklik. Pernyataan self.ok.configure(width=10) digunakan untuk menentukan lebar widget dalam jumlah karakter.

Beberapa atribut yang terdapat pada widget Button dan dapat digunakan dapat dilihat seperti Tabel 4.5 berikut.

Tabel 4.5 Atribut pada Button

Atribut Keterangan

Foreground (fg) Menentukan warna teks dalam keadaan normal

Background (bg) Menentukan warna latar belakang dalam keadaan normal Activeforeground Menentukan warna teks ketika kursor berada pada widget Activebackground Menentukan warna latar belakang ketika kursor berada

pada widget

Justify Menentukan posisi teks Font Menentukan jenis tulisan Heigh Menentukan tinggi label Width Menentukan lebar label

Relief Menentukan jenis pada tepi tombol State Mengatur bisa atau tidaknya tombol diklik

2. Entry

Entry adalah widget yang menyatakan suatu masukan. Widget ini digunakan untuk memasukkan teks yang diketikan oleh pengguna dari keyboard. Pada aplikasi GUI Integer Programming, widget Entry digunakan untuk menerima beberapa masukan yaitu jumah variabel, jumlah kendala, dan koefisien-koefisien dari setiap kendala pada model Integer Programming. Contoh kode untuk membuat Entry dapat dilihat seperti gambar berikut.

Gambar 4.5 Contoh Penggunaan Widget Entry

Berdasarkan Gambar 4.5 pernyataan self.jumlahVariabel = Entry(self.second_frame) digunakan untuk membuat objek Entry.

Sedangkan pernyataan lainnya merupakan atribut pada widget Entry yang fungsinya sama dengan atribut pada widget Button. Beberapa

atribut yang terdapat pada widget Entry dapat dilihat pada Tabel 4.6 berikut.

Tabel 4.6 Atribut pada Entry

Atribut Keterangan

Foreground (fg) Menentukan warna teks

Background (bg) Menentukan warna latar belakang

Show Mengatur karakter yang ditampilkan di kotak Entry Width Menentukan lebar widget

State Mengatur bisa atau tidaknya memasukkan karakter pada kotak Entry

3. Label

Widget Label digunakan untuk menampilkan teks atau tulisan dalam satu baris di jendela GUI. Pada aplikasi GUI Integer Programming, widget Label digunakan untuk menampilkan beberapa tulisan seperti

β€œJumlah Variabel”, β€œJumlah Kendala”, β€œOptimasi”, dll. Contoh kode untuk membuat Label dapat dilihat seperti gambar berikut.

Gambar 4.6 Contoh Penggunaan Widget Label

Berdasarkan Gambar 4.6 pernyataan self.Label1 = Label(self.second_frame) digunakan untuk membuat objek Label.

Sedangkan pernyataan lainnya merupakan atribut pada widget Label yang fungsinya sama dengan atribut pada widget Button. Beberapa atribut yang terdapat pada widget Label dapat dilihat pada Tabel 4.7 berikut.

Tabel 4.7 Atribut pada Label

Atribut Keterangan

Foreground (fg) Menentukan warna teks

Background (bg) Menentukan warna latar belakang Anchor Mengatur posisi Label

Font Menentukan jenis tulisan Height Menentukan tinggi Label Width Menentukan lebar Label

4. Radiobutton

Radiobutton merupakan widget yang digunakan untuk memilih suatu opsi pada suatu kasus namun hanya salah satu opsi saja yang dapat dipilih. Pada aplikasi GUI Integer Programming, widget Radiobutton digunakan untuk menampilkan optimasi. Pengguna dapat memilih salah satu optimasi yaitu β€œMaksimum” atau β€œMinimum”.

Contoh kode untuk membuat Radiobutton dapat dilihat seperti gambar berikut.

Gambar 4.7 Contoh Penggunaan Widget Radiobutton

Berdasarkan Gambar 4.7 pernyataan self.radio = StringVar() digunakan untuk membuat variabel yang akan digunakan dalam Radiobutton. Kelas variabel yang digunakan adalah StringVar() yang menghasilkan objek dengan variabel string atau teks. Untuk memberi nilai ke dalam variabel tersebut, metode set() perlu digunakan seperti pada pernyataan self.radio.set("A"). Nilai β€œA” akan membuat tombol radio yang memiliki value=”A” dalam keadaan terpilih. Pada

pernyataan self.radio1 = Radiobutton(self.second_frame, text="Maksimum", variable=self.radio, value="A"), radio1 akan merujuk pada objek Radiobutton. Variabel radio digunakan pada tombol radio melalui variable=self.radio. Atribut text digunakan untuk memberikan teks pada tombol radio yaitu β€œMaksimum”, sedangkan value=”A” menyatakan nilai yang diwakili oleh tombol radio ini. Pernyataan self.radio2 = Radiobutton(self.second_frame, text="Minimum", variable=self.radio, value="I") menyerupai pernyataan pembuatan tombol radio yang pertama namun teks yang diberikan adalah β€œMinimum” dan diwakili oleh nilai value="I".

Beberapa atribut yang terdapat pada widget Radiobutton dapat dilihat pada Tabel 4.8 berikut.

Tabel 4.8 Atribut pada Radiobutton

Atribut Keterangan

Foreground (fg) Menentukan warna teks dalam keadaan normal

Background (bg) Menentukan warna latar belakang dalam keadaan normal Activeforeground Menentukan warna teks ketika kursor berada pada widget Activebackground Menentukan warna latar belakang ketika kursor berada pada

widget

Font Menentukan jenis tulisan

State Mengatur bisa atau tidaknya tombol diklik

5. Scrollbar

Widget Scrollbar digunakan untuk menggulung canvas, entry, listbox, dll. Scrollbar dapat dibuat vertikal atau horizontal. Pada aplikasi GUI Integer Programming, widget Scrollbar akan digunakan secara vertikal dan horizontal. Scrollbar vertikal akan diletakkan disisi kanan, sedangkan Scrollbar horizontal akan diletakkan disisi bawah.

Contoh kode untuk membuat Scrollbar dapat dilihat seperti gambar berikut.

Gambar 4.8 Contoh Penggunaan Widget Scrollbar

Berdasarkan Gambar 4.8, skrip tersebut merupakan contoh penggunaan Scrollbar vertikal. Pernyataan self.my_scrollbarVer = ttk.Scrollbar(self.main_frame, orient=VERTICAL, command=self.my_canvas.yview) digunakan untuk membuat widget Scrollbar. Scrollbar tersebut ditampilkan ke jendela melalui pernyataan self.my_scrollbarVer.pack(side=RIGHT, fill=Y). Pada perintah side=RIGHT digunakan untuk meletakkan Scrollbar disisi kanan jendela, sedangkan perintah fill=Y digunakan untuk membuat Scrollbar menempati seluruh ruang vertikal.

6. Combobox

Widget Combobox digunakan untuk menampilkan sebuah daftar pilihan. Pengguna hanya dapat memilih satu opsi pilihan dari semua opsi yang disediakan. Pada aplikasi GUI ini, combobox digunakan untuk menampilkan pilihan operator perbandingan pada fungsi kendala. Operator tersebut yaitu ≀, β‰₯, dan =. Contoh kode untuk membuat Combobox dapat dilihat seperti gambar berikut.

Gambar 4.9 Contoh Penggunaan Widget Combobox

Berdasarkan Gambar 4.9 pernyataan self.komparator = StringVar() digunakan untuk membuat variabel yang akan digunakan dalam Combobox. Kelas variabel yang digunakan adalah StringVar() yang menghasilkan objek dengan variabel string atau teks. Pada pernyataan self.komp = ttk.Combobox(self.second_frame, textvariable=self.komparator), komp akan merujuk pada objek Combobox. Pernyataan self.komp['values'] = ("<=", ">=", "=") digunakan untuk memberi opsi atau pilihan pada Combobox yaitu ≀ , β‰₯, dan =.

Beberapa atribut yang terdapat pada widget Combobox dapat dilihat pada Tabel 4.9 berikut.

Tabel 4.9 Atribut pada Combobox

Atribut Keterangan

Value Menentukan daftar pilihan yang akan ditampilkan Justify Menentukan letak combobox dalam widget Height Menentukan ketinggian widget combobox Width Menentukan lebar widget combobox

State Mengatur bisa atau tidaknya combobox diklik

Langkah selanjutnya adalah penyusunan fungsi untuk menyelesaikan masalah Integer Programming. Fungsi pertama yang didefinisikan adalah fungsi untuk mendapatkan atau menampung bilangan-bilangan hasil masukan pengguna. Fungsi tersebut dapat dilihat pada gambar berikut.

Gambar 4.10 Fungsi hasilinput()

Berdasarkan Gambar 4.10 pernyataan def hasilinput(self): digunakan untuk mendefinisikan fungsi dengan nama hasilinput. Pernyataan variabel = int(self.jumlahVariabel.get()) digunakan untuk mendapatkan nilai masukan pengguna mengenai jumlah variabel dalam model Integer Programming. Penyataan kendala = int(self.jumlahKendala.get()) digunakan untuk mendapatkan nilai masukan pengguna mengenai jumlah kendala dalam model Integer Programming. Selanjutnya perlu dideklarasikan beberapa List untuk menampung nilai-nilai masukan dari pengguna. List merupakan variabel yang menyimpan lebih dari satu data.

Pernyataan konstanta = [[]for i in range (kendala)] merupakan List untuk menampung nilai-nilai konstanta dari setiap kendala. Pernyataan tanda = [[] for i in range (kendala)] digunakan untuk menampung operator komparasi. Pernyataan batas = [[] for i in range (kendala)] untuk menampung batas atau kapasitas suatu kendala. Pernyataan obj = [[] for i in range (variabel)] untuk menampung nilai konstanta dari fungsi objektif. Pernyataan fungsi_kendala = [[0] for i in range (kendala)]

digunakan untuk menampung seluruh kendala pada model Integer Programming. Pernyataan fungsi_objektif = [[0] for i in range (variabel)]

untuk digunakan menampung fungsi objektif pada model Integer Programming.

Fungsi selanjutnya yang perlu didefinisikan yaitu fungsi prosesIP().

Fungsi tersebut digunakan untuk menentukan penyelesaian dari model Integer Programming. Skrip fungsi prosesIP() dapat dilihat pada gambar berikut.

Gambar 4.11 Fungsi prosesIP()

Berdasarkan Gambar 4.11 pernyataan if self.radio.get() == "A" :, optimasi = LpProblem("Z", LpMaximize), else:, dan optimasi = LpProblem("Z", LpMinimize) merupakan kondisi untuk menentukan permasalahan optimasi. Jika pengguna memilih β€œMaksimum” pada Radiobutton maka permasalahan optimasi yang akan dilakukan adalah memaksimumkan atau pada kelas LpProblem parameter sense yang dipilih adalah LpMaximize. Jika pengguna tidak memilih β€œMaksimum”

pada Radiobutton atau dengan kata lain pengguna memilih β€œMinimum”

maka permasalahan optimasi yang akan dilakukan adalah

meminimumkan atau pada kelas LpProblem parameter sense yang dipilih adalah LpMinimize. Pernyataan var = [LpVariable(f'X{i}', lowBound=0, cat="Integer") for i in range (1, variabel+1)] digunakan untuk menentukan variabel keputusan pada model Integer Programming. Pada kelas LpVariable parameter name akan diisi dengan π‘₯1, π‘₯2, π‘₯3, dst sesuai dengan banyaknya variabel yang diinginkan pengguna. Pada masalah Integer Programming, nilai untuk setiap variabel harus lebih dari atau sama dengan 0, sehingga pada parameter lowBound diberi nilai 0. Selain itu, seluruh nilai umtuk setiap variabel harus bilangan bulat atau integer sehingga pada parameter cat diberi nilai β€œInteger”. Pernyataan for i in range(variabel): dan obj[i] = float(obj[i][0].get()) digunakan untuk mengambil atau mendapatkan nilai-nilai konstanta dari fungsi objektif.

Pernyataan fungsi_objektif = lpSum([i*j for i, j in zip(obj, var)]) digunakan untuk membentuk suatu fungsi objektif dengan menggabungkan variabel obj dan var. Pernyataan optimasi +=

fungsi_objektif digunakan untuk menambahkan fungsi objektif ke model Integer Programming optimasi. Pernyataan konstanta[i][j] = float(konstanta[i][j].get()) digunakan untuk mengambil atau mendapatkan nilai-nilai konstanta tiap fungsi kendala. Pernyataan fungsi_kendala[i] = lpSum([k*l for k,l in zip(konstanta[i], var)]) digunakan untuk untuk membentuk fungsi-fungsi kendala dengan menggabungkan variabel konstanta dan var. Pernyataan tanda[i] = tanda[i][0].get() digunakan untuk mendapatkan atau mengambil operator

komparasi yang telah dipilih oleh pengguna. Pernyataan batas[i] = float(batas[i][0].get()) digunakan untuk mendapatkan nilai batas atau kapasitas pada tiap fungsi kendala. Pernyataan if tanda[i] == "<=" : dan optimasi += fungsi_kendala[i] <= batas[i], "Kendala "+str(i+1) artinya jika pengguna memilih operator komparasi β€œ<=” maka model Integer Programming optimasi akan ditambah dengan fungsi_kendala <= batas.

Pernyataan elif tanda[i] == ">=" : dan optimasi += fungsi_kendala[i]

>= batas[i], "Kendala "+str(i+1) artinya jika pengguna memilih operator komparasi β€œ>=” maka model Integer Programming optimasi akan ditambah dengan fungsi_kendala >= batas. Pernyataan else : dan optimasi += fungsi_kendala[i] == batas[i], "Kendala "+str(i+1) artinya jika pengguna tidak memilih operator β€œ<=” dan β€œ>=” atau dengan kata lain pengguna memilih operator β€œ=” maka model Integer Programming optimasi akan ditambah dengan fungsi_kendala == batas. Pernyataan hasil = optimasi.solve() digunakan untuk menentukan hasil dari proses optimasi Integer Programming. Penyelesaian optimasi pada program ini menggunakan class bawaan dari pustaka PuLP yaitu CBC atau COIN-OR Branch-and-Cut. Penyelesaian CBC tersebut menggunakan metode percabangan dan bidang potong. Hal tersebut dilakukan karena metode bidang potong memiliki beberapa keterbatasan, salah satunya yaitu jumlah keseluruhan iterasi yang mungkin terlalu banyak untuk mendapatkan solusi bulat optimal sehingga perlu digabungkan dengan metode percabangan (python-mip.readthedocs.io).

Hasil dari proses perhitungan optimasi Integer Programming akan ditampilkan pada jendala GUI yang kedua. Hasil yang ditampilkan adalah nilai dari fungsi objektif dan nilai dari setiap variabel keputusan. Skrip untuk menampilkan hasil optimasi dapat dilihat pada gambar berikut.

Gambar 4.12 Hasil optimasi

Berdasarkan Gambar 4.12 pernyataan self.statusZ = Label(self.second_frame) digunakan untuk menampilkan status hasil perhitungan Integer Programming sesuai dengan pernyataan self.statusZ.configure(text=LpStatus[hasil]). Pernyataan self.hasilZ.configure(text=(f"Z: {optimasi.objective.value()}")) digunakan untuk menampilkan hasil dari nilai optimal fungsi objektif.

Pernyataan self.hasilX.configure(text=(f"{var.name}: {var.value()}")) digunakan untuk menampilkan hasil dari nilai-nilai tiap variabel keputusan hasil optimasi. Namun pada aplikasi GUI ini belum dapat menampilkan setiap iterasi yang dilakukan pada proses pengolahan model Integer Programming.

4.4.2 Tampilan Aplikasi GUI Integer Programming

Tampilan awal aplikasi GUI Integer Programming yang telah disusun dapat dilihat pada gambar berikut.

Gambar 4. 13 Tampilan Awal

Berdasarkan Gambar 4.13, pengguna dapat memasukkan jumlah variabel, jumlah kendala, dan memilih optimasi yang diingkan. Setelah pengguna memilih tombok β€œOK”, tampilan akan menjadi seperti pada gambar berikut.

Gambar 4.14 Tampilan untuk Memasukkan Fungsi Objektif dan Fungsi Kendala

Berdasarkan Gambar 4.14, pengguna dapat memasukkan koefisien-koefisien dan konstanta pada fungsi objektif dan fungsi kendala ke widget Entry yang telah disediakan. Setelah pengguna memilih tombok β€œHitung”

maka tampilan akan menjadi seperti gambar di bawah ini.

Gambar 4.15 Tampilan Hasil Optimasi

Berdasarkan Gambar 4.15, tampilan tersebut merupakan tampilan hasil optimasi penyelesaian permasalahan Integer Programming. Tampilan tersebut meliputi status penyelesaian, nilai fungsi objektif, dan nilai variabel-variabel keputusan.

4.4.3 Cara Penggunaan Aplikasi GUI Integer Programming

Berikut cara menggunakan aplikasi β€œKalkulator Integer Programming”.

1. Buka aplikasi β€œKalkulator Integer Programming”.

2. Isikan jumlah variabel pada kolom β€œJumlah Variabel” dan jumlah kendala pada kolom β€œJumlah Kendala”.

3. Pada pilihan Optimasi, pilihlah β€œMaksimum” atau β€œMinimum” sesuai dengan fungsi objektif yang akan dioptimalkan.

4. Klik tombol β€œOK”.

5. Isikan masing-masing kolom dengan koefisien-koefisien dan konstanta fungsi objektif dan fungsi kendala.

6. Klik tombol β€œHitung”.

7. Hasil optimasi akan muncul.

Dokumen terkait