Koneksi Matlab dengan ArcGIS/ArcView

Sempet juga saya kelabakan ketika menerima hibah penelitian tentang spatial data yang diintegrasikan dengan algoritma tertentu. Karena kepepet, waktu itu saya menggunakan GUI matlab untuk membuat peta seperti arcgis dan juga bantuan aplikasi google map/earth yang ditempel di web berbasis ruby on rails, karena waktu kuliah web technology saya diajarkan bahasa pemrograman ruby on rails. Hasilnya kira-kira berikut ini:

Meneruskan riset yang sederhana tentang optimasi lokasi, untuk optimasi landuse tentu saja tidak bisa dengan cara seperti optimasi spbu yang memang terletak di pinggir jalan. Landuse akan mencari areal dua dimensi yang luas sekali, terutama untuk kasus kota bekasi yang luasnya sekitar 200 km persegi. Ternyata rumit juga terutama criteria/objective function untuk suitability. Ditambah lagi constraint untuk candidate locations, weh. Untuk sementara hasilnya seperti ini, semoga lancar ke depannya.

Iklan

Optimasi Landuse dengan Matlab

Saatnya mulai membuat kode program matlab untuk mengoptimasi lokasi landuse dan landcover dengan data dari arcview/arcgis. Banyak algoritma yang digunakan oleh riset-riset optimasi saat ini, dua yang terkenal yaitu dengan Particle Swarm Optimization (PSO) dan Genetic Algorithms (GAs). Karena masing-masing memiliki kelemahan dan kelebihan, banyak yang berusaha melakukan hybrid antara satu metode dengan metode lainnya yang ternyata menghasilkan efisiensi dan akurasi yang baik.

Gambar di atas memperlihatkan hasil optimasi landuse tipe lingkaran. Di sini kode masih agak error, dan belum menerapkan algoritma untuk constraint (terlihat result berwarna hijau kabur melewati batas wilayah), tapi untuk sementara cukup menggembirakan karena dapat menghubungkan antara matlab dengan arcview/arcgis untuk menampilkannya. Setiap selesai melakukan optimasi, untuk melihat hasilnya kita harus merefresh Arcview dengan menekan tombol layer .

Menjawab Problem Data type “Struct” di Matlab

Menjawab permasalahan yang dijumpai ketika membuat kode program dengan bahasa Matlab adalah dengan cara: 1) membaca help, 2) situs www.matworks.com, 3) komunitas di internet, dengan bantuan google, dan 4) youtube. Permasalahan muncul karena karakter bahasa matlab yang sedikit berbasis objek. Buku yang beredar di pasaran pun tidak sanggup menjawab seluruh pertanyaan yang beredar. Pertanyaan-pertanyaan liar selalu bermunculan baik melalui komentar ataupun email. Salah satu yang bikin ribet adalah masalah struktur data, karena Matlab memiliki struktur data yang agak banyak. Banyaknya struktur data mungkin dikarenakan kemudahan-kemudahan yang matlab berikan melebihi bahasa induknya yaitu c++ dan fortran.

Beberapa kata kunci yang melibatkan struktur data di matlab dan dapat diakses di fasilitas help antara lain: num2str, cellstr, num2cell, dan sebagainya. Untuk mengetahui tata caranya secara cepat dengan cara mengetik di command window, misalnya: >>help num2str.

Yang menarik di sini, kita dapat mengetahui pula fungsi-fungsi yang berhubungan dengannya lewat informasi “See also”. Untuk mengetahui secara detail dalam bentuk GUI yang rapi dapat mengganti help dengan doc sebelum kata fungsi yang ingin kita ketahui lebih lanjut. Atau menekan tulisan doc num2str.

Untuk situs resmi matlab, sepertinya formatnya tidak jauh berbeda dengan help, yang memaksa kita untuk membaca luas yang terkadang jadi lupa dengan masalah utamanya. Sepertinya andalan utama untuk saat ini adalah searching di internet dengan search engine tercanggih di dunia, google (www.google.com). Untuk bahasa pemrograman, biasanya google mengarahkan ke situs resmi dan komunitas programming, seperti misalnya stackoverflow (www.stackoverflow.com). Perhatikan jawaban di bawahnya oleh para senior, misalnya pertanyaan untuk kasus saya di muka berikut ini:

Terkadang kita tidak mengenal fungsi-fungsi tertentu, karena memang jumlahnya sangat banyak dan tidak mungkin dihapal semuanya. Nah, di sini karena yang ikut terlibat adalah programmer-programmer dengan latar belakang yang beragam, bagi programmer tertentu mungkin banyak memakai fungsi tertentu yang khas di bidangnya yang bagi orang di bidang lain masih dianggap asing. Contoh di atas adalah fungsi setfield yang masih asing bagi pemula atau yang menggunakan matlab untuk komputasi yang tidak berhubungan dengan database. Ikuti di command window saran di atas, dan berhasil. Tentu saja andalan utama kita adalah help yang resmi dari Matlab. Berikut ini trik untuk mengupdate nilai field dari data jenis struct.

Misalkan kita punya data landtype:

  • landtype =
  • 4134884 7681103
  • 9275435 3020821
  • 2063774 5498421
  • 5850328 1631791
  • 5932021 1324960
  • 4557209 2641519
  • 1531668 5462547
  • 2804685 2757848
  • 7250245 6744421
    • ……….

Akan dimasukan ke variabel struktur “data” untuk variabel X dan Y di dalam data tersebut.

  • data =
  • 17×1 struct array with fields:
  • Geometry
  • X
  • Y
  • ID

Dengan mengetikan instruksi ini, fields X dan Y akan berisi landtype.

  • for i=1:17
  • data(i).X=landtype(i,1)
  • data(i).Y=landtype(i,2)
  • end

Kita uji, misalnya untuk data pertama.

  • >> [data(1).X data(1).Y]
  • ans =
  • 4134884 7681103

Bernilai sama dengan landtype pada data di atas yang dicetak tebal. Berikutnya akan kita ekspor hasilnya menjadi shapefile agar bisa dibuka di arcview / arcgis.

>> shapewrite(data,’result’)

Doctoral-Thessis Proposal

Entah sudah berapa kali saya membuat proposal, baik saat studi lanjut ataupun saat mengajukan dana hibah penelitian. Alhamdulillah, seluruh proposal yg saya ajukan, termasuk proposal disertasi, diterima. Kalaupun tidak itu karena masalah administrasi seperti tidak boleh menerima dana hibah lebih dari satu dalam tahun yang sama dan sebagainya. Berbeda dengan proposal-proposal sebelumnya, proposal disertasi merupakan proposal terberat yang pernah saya buat karena membutuhkan ilmu-ilmu yang telah saya pelajari sebelumnya. Selain itu, mencari temuan baru, walaupun hanya secuil ternyata membutuhkan usaha yang besar dari mempelajari riset-riset terkini hingga menganalisa bahwa temuan yang akan kita teliti memang bisa dikerjakan dalam range waktu yang sudah ditentukan.

Memang tidak ada salahnya jujur terhadap diri sendiri, sampai di mana kemampuan kita. Setelah mencoba nekat mengambil jurusan ilmu computer, saya nyerah juga akhirnya. Ketika saya pertama kali kuliah di jurusan computer science, kira2 dua tahun yang lalu, ada pertemuan mahasiswa-mahasiswa Indonesia di gedung Remote Sensing and Geographic Information Systems (RS-GIS) dan ketika melewati lorong-lorongnya, entah mengapa di hati saya berdesir suatu kekaguman terhadap bidang itu ketika melihat foto-foto yang dipajang di dinding lorong itu. Dengan blackberry, saya foto-foto di situ. Foto-foto tersebut masih tersimpan dan saya anggap angin lalu. Dan saya terkejut ketika beberapa waktu yang lalu membuka-buka file lama berisi foto-foto backup blackberry saya, tampak foto “iseng” tersebut yang seolah-olah mengingatkan saya bahwa saya dulu “pernah” terketuk hatinya dengan bidang GIS yang saat ini menjadi bidang disertasi saya. Lebih “ganas”nya lagi, saya harus membahas juga aspek environment/lingkungan seperti yang pernah saya foto juga. “There is no accident”, kata si guru kura2 dalam film kungfu panda,  semua ada yang ngatur.

Kembali ke masalah salah jurusan. Untung saya hobi main catur, saya teringat tiap kali melakukan kesalahan, yang harus saya kerjakan adalah mengurangi dampak dari kesalahan yang telah saya buat itu. Demikian pula, ketika saya tidak sanggup melanjutkan jurusan berat tersebut, saya langsung beralih ke jurusan information management yang sedikit fleksibel. Seluruh kekuatan saya data, termasuk hibah penelitian yang saya peroleh tiga tahun berturut-turut (akan saya lanjutkan menjadi disertasi), walaupun sulit saya anggap kekuatan karena secara logika menghemat tiga tahun. Bedanya hanya cakupan ilmu yang harus diperketat dengan tambahan temuan-temuan baru (research gap).

Mata kuliah-mata kuliah pendukung saya ambil, dari GIS hingga Artificial Intelligent & Neuro-Fuzzy, karena akan saya kombinasikan keduanya menjadi domain riset saya. Yah, begitulah, namanya orang kepepet.

http://alumni.ugm.ac.id/simponi/?page=adir_prf&niu=103361

Mungkin kalau dipikir-pikir aneh juga seorang insinyur mesin, mengambil jenjang tertinggi bidang informatika. Banyak juga yang seperti itu kok, Rano Karno juga, insinyur mesin sekarang jadi plt walikota .. (itu kan insinyurnya di film he he .. 🙂 ).

Pareto Front Optimal

Belajar sesuatu terkadang lebih mudah dengan langsung mempraktekannya. Kata pepatah experience is the best teacher. Matlab menyediakan fasilitas help baik yang terselip di programmnya atau di situs resminya, www.mathworks.com.

Buka matlab, buat fungsi objective yang akan diminimisasi. File – New – Function, atau saya lebih suka langsung mengetik di command window nama M-file yang akan saya buat >>edit simple_multi. Tekan enter ketika Matlab mengkonfirmasi bahwa M-file yang dimaksud tidak ada dan apakah kita akan membuatnya.

Ada dua fungsi di dalam satu fungsi pada M-file di atas. Tugasnya adalah mencari nilai X yang membuat dua fungsi itu minimum. Tidak ditentukan di awal bobot antara fungsi 1 dan fungsi 2 karena kalau bobotnya sudah ditentukan tentu saja langsung bisa ketemu jawabannya. Bobot yang kita gunakan bobot standar yang jika dijumlahkan = 1, misalnya w1=0.3 dan w2=0.7. Ikuti saja instruksi dari www.mathworks.com untuk memperoleh nilai x beserta bobotnya.

  • F = simple_multi(t);
  • t = linspace(-0.5,1.5);
  • plot(t,F, ‘LineWidth’ ,2)
  • hold on
  • plot([0,0],[0,8], ‘g–‘ );
  • plot([1,1],[0,8], ‘g–‘ );
  • plot([0,1],[1,6], ‘k.’ , ‘MarkerSize’ ,15);
  • text(-0.25,1.5, ‘Minimum(f_1(x))’ )
  • text(.75,5.5, ‘Minimum(f_2(x))’ )
  • hold off
  • legend( ‘f_1(x)’ , ‘f_2(x)’ )
  • xlabel({‘x’ ; ‘Tradeoff region between the green lines’ })
  • edit pickindex
  • k = 1;
  • [min1,minfn1] = fminbnd(@(x)pickindex(x,k),-1,2);
  • k = 2;
  • [min2,minfn2] = fminbnd(@(x)pickindex(x,k),-1,2);
  • goal = [minfn1,minfn2];
  • nf = 2;
  • N = 50;
  • onen = 1/N;
  • x = zeros(N+1,1);
  • f = zeros(N+1,nf);
  • fun = @simple_multi;
  • x0 = 0.5;
  • for r = 0:N
  • t = onen*r; % 0 through 1
  • weight = [t,1-t];
  • [x(r+1,:),f(r+1,:)] = fgoalattain(fun,x0,goal,weight, …
  • [],[],[],[],[],[],[]);
  • End

Grafik pertama berisi grafik dua fungsi objective yang akan dioptimasi:

Kita harus mengkompromikan antara f1 dan f2 karena ketika f1 ke arah minimum, fungsi f2 naik nilainya. Pareto menggunakan prinsip nondominant dimana tidak boleh ada yg dominan antara f1 dan f2. Perhatikan grafik kedua dari instruksi di atas:

Grafik di atas adalah sebaran beberapa komposisi bobot w1 dan w2 terhadap kedua fungsi objective. Titik2 itu membentuk garis lengkungan yang menggambarkan nondominant. Titik terbaiknya dapat dilihat dari panduan di link ini, perhatikan gambarnya.

Mengetahui Id Scopus Beserta H-Index

Salah satu tri darma perguruan tinggi adalah penelitian selain pengajaran dan pengabdian kepada masyarakat (lanjutan tulisan yg lalu). Terkejut juga ketika membuka kembali laman penelitian dikti (www.simlitabmas.dikti.go.id) yang tiba-tiba saat login dosen muncul kolom isian id scopus beserta h-index yang dimiliki. Saya hanya menduga mungkin pemerintah mulai mengarahkan dosen menjadi peneliti setelah terpisahnya kemendikbud menjadi kementerian pendidikan dan kementerian ristek – pendidikan tinggi. Sebelumnya memang muncul di sosial media berita ranking ilmuwan-ilmuwan Indonesia yang terindex scopus, yang dapat dilihat di link berikut ini.

Tampak nama, institution, h-index, dan citations. Pertanyaannya adalah dari mana memperoleh informasi tersebut? Dikti memberikan kolom isian di simlitabmas bahkan tanpa memberi penjelasan bagaimana menemukannya. Di google ada beberapa situs yang menjelaskan dengan baik, tapi sayangnya itu dari negara tetangga malaysia di link ini. Berikut langkah untuk memperolehnya:

  • Langkah pertama untuk memperoleh nomor identitas di scopus adalah mempublikasi paper yang terindeks di scopus. Tidak harus menjadi peneliti utama, co-author bisa langsung mendapat nomor ID. Tidak ada cara lain. (kalo ada cara lain, kasih tahu ya ..)
  • Buka situs scopus (www.scopus.com), dan klik Author search, ketik nama belakang Anda (family name) dilanjutkan dengan menekan simbol kaca pembesar (search). Untuk institusi yang tidak berlangganan scopus, sepertinya hanya bisa melihat Author saja. Ketika muncul peringatan untuk mendaftar/register scopus, di bawah ada link berwarna biru dengan tulisan “author preview” yang bisa diklik dan dilanjutkan dengan searching lewat nama Author.

  • Tunggu beberapa saat, jika tidak muncul memang nama Anda tidak ada, segera membuat publikasi ilmiah yang terindeks di level internasional, misalnya scopus, thomson, google scholar, dll. Jika terindeks maka akan muncul nama anda di scopus, thomson, google scholar, dan indexer lainnya. Untuk saat ini sepertinya dikti masih memakai Scopus, mungkin indexer yg lain segera menyusul.

  • Setelah muncul beberapa nama, cari nama yang sesuai dengan afiliasi dan paper-paper yang telah dipublish. Nama di atas saya itu Prof. Eko Handayanto dari Malang (nomor 71 di list). Di sini saya memakai bendera Asian Institute of Technology (AIT) Thailand setelah sebelumnya Islam 45 university karena memang saya sedang belajar di sana, juga alasan-alasan lain yg tidak dapat saya jelaskan di sini. Setelah itu klik nama Anda di kolom paling kiri.

  • Di sana tampak nama, institusi (affiliation), Author ID, serta h-index. Jika ingin melihat grafik h-index, bisa dengan menekan view h-graph. Untuk perhitungan lebih detil dapat disearching di google, atau menunggu postingan saya berikutnya. Maaf ya Prof. E. Handayanto, ijin menampilkan nama Anda di sini ya, semoga bisa seperti Anda.

  • Setelah itu isi di kolom simlitabmas ID Author saya di scopus dengan skor index yang baru satu.

Update:  7 Mei 2015

Ternyata kalau tidak login scopus tidak bisa dijalankancara di atas ya. Ok kita coba tanpa login. masuk ke http://www.scopus.com kemudian klik Author Preview.

Jika saya masukkan nama saya, akan muncul tulisan-tulisan saya, dan karena saya penulis utama, nama saya bisa diklik untuk melihat h-indexnya.

scopus-rahmadya

Sementara, untuk co-author saya, misalnya Samsiana. Tampak nama samsiana tidak bisa diklik, kemungkinan besar h-index masih nol. untuk mengisi id scopus bisa melihat di bawah (saya pake mozilla) untuk mengetahui nomor id scopus berikut ini:

scopus-rahmadya

Particle Swarm Optimization (PSO) – dengan Octave

Tulisan ini merupakan lanjutan dari tulisan sebelumnya yang menggunakan Matlab sebagai medianya. Ketika membuka Octave pertama kali, ada dua pilihan yaitu mode Command Line Interface (CLI) atau Graphical User Interface (GUI). Kita pilih yang mudah saja yaitu GUI. Tampak tampilan yang mirip dengan matlab. Untuk yang ingin menginstallnya, baca postingan saya yang lalu.

Seperti pada Matlab, Octave juga membutuhkan direktori kerja dimana M-file yang telah kita buat berada. Di sini saya harus menempatkan dua file yaitu file algoritma PSO, simplepso.m dan fungsi2.m yang merupakan fungsi tujuan (objective function) yang akan dioptimalkan.

Tampak hasil optimasi untuk 4 iterasi dengan fungsi pause yang saya sisipkan untuk melihat perjalanan program tiap operasi. Di sini sedikit berbeda, ketika Octave menjumpai fungsi pause ternyata ada pesan agar kita menekan huruf f yang artinya forward (maju).

Grafik di atas merupakan hasil plot yang kecanggihannya ga jauh beda dengan Matlab. Harga Octave pun tidak terlalu mahal, hanya Rp. 0,- alias gratis, dibanding harga lisensi Matlab versi stand alonenya (individual price) sekitar Rp. 34 juta dengan harga 1 dollar yang saat ini melambung Rp. 13.000,-.

Particle Swarm Optimization (PSO)

PSO jika diterjemahkan berarti optimasi segerombolan partikel. Partikel di sini adalah makhluk hidup seperti burung, ikan, atau lebah yang sedang mencari makanan. Mengapa mengikuti prinsip pergerakan segerombolah makhluk-makhluk tersebut? Jawabannya sederhana, karena makhluk-makhluk tersebut berhasil menemukan makanannya. PSO pertama kali dicetuskan oleh kennedy dan Eberhart pada tahun 1995 yang membahas mengenai perilaku kerumunan makhluk hidup.

Menurut beberapa paper, misalnya Sathya, yang melakukan optimasi terhadap segmentasi gambar, PSO memiliki beberapa kelebihan di antaranya:

  • Mudah diimplementasikan dan hanya sedikit parameter yang dibutuhkan.
  • Tidak ada evolusi pada operatornya, misalnya mutasi dan crossover pada Genetic Algorithms (GAs).
  • Di GAs kromosom membagi informasi sehingga pergerakan mengikuti group-nya sendiri, berbeda dengan PSO yang berkelompak, dan menurut Sathya PSO lebih robust. Sepertinya saya kurang setuju dengan pendapat yang ini, apa boleh buat kita rujuk saja.
  • PSO lebih efisien karena membutuhkan sedikit komputasi.
  • Dibanding GAs dan metode heuristik lainnya, PSO lebih fleksibel dalam menjaga keseimbangan antara pencarian global dan lokal terhadap search space-nya.

Salah satu point menarik yang dibahas oleh kennedi et al. adalah masalah collision karena jika setiap partikel menganggap ada partikel lain yang lebih “optimum” tentu saja dia akan mengarah ke sana dan terjadi tuburukan/collision. Tetapi kenyataannya tidak ada tabrakan saat burung terbang, ikan berenang, lebah menari-nari dan sebagainya.

Untuk menerapkan algoritma PSO, di sini kita coba dengan menggunakan matlab atau octave. Kita coba terlebih dahulu dengan matlab. Sebagai referensi, Anda dapat mendownload materi budi santoso dari ITS di link berikut, kemudian coba jalankan kode yang ada di dalamnya. Di sana dijelaskan dua jenis PSO dengan dan tanpa inersia. Agar lebih mudah memahami alur instruksi programnya, di bawah instruksi yang akan saya selidiki biasanya saya sisipkan instruksi pause dan titik kemo di belakang kode yang dibuat saya hilangkan titik koma-nya agar muncul di layar command window. Saya coba jalankan dengan jumlah partikel 3 dan iterasi maksimum 4.

Variabel v,x,f yang menyatakan nilai awal kecepatan, swarm, dan nilai fitness-nya dimunculkan dalam variabel yang saya lingkari di atas. Untuk menampilkan nilai minimum minftot saya hapus titik komanya agar muncul di command window ketika berhenti sejenak di tiap iterasi karena instruksi pause yang saya sisipkan. Hasilnya tampak di bawah ini dimana fitness yang terbaik adalah pada swarm ketiga (34.8627) dengan swarm 105.9045. Ini tentu saja masih belum optimal karena masih iterasi pertama.

Setelah iterasi keempat dijalankan dengan menekan sembarang tombol untuk melanjutkan akibat instruksi pause tersebut diperoleh grafik dan hasil akhir. Kita coba dengan octave, di tulisan selanjutnya