Jalankan semut. Lari

Artikel ini membahas proses pembuatan model simulasi perilaku koloni semut (dapat dibaca di Wikipedia ) di lingkungan simulasi "AnyLogic". Artikel ini praktis. Ini akan mempertimbangkan penggunaan algoritma semut untuk menyelesaikan masalah salesman keliling (Anda bisa baca di sini ).



Secara singkat tentang esensi


Inti dari masalah salesman keliling adalah bahwa salesman keliling (penjual) harus mengunjungi N kota setelah mengunjungi masing-masing kota hanya sekali di sepanjang rute terpendek. Karena masalah ini NP-complex dan jumlah opsi untuk semua rute yang mungkin antara N kota dihitung sebagai "N!", Waktu pencarian rute terpendek akan meningkat secara eksponensial dengan peningkatan N. Dengan demikian, rute pencarian (solusi) waktu terpendek menggunakan algoritma “Pencarian lengkap” (yang memberikan solusi tepat) dengan jumlah kota N> 16 meningkat tajam (eksponensial). Oleh karena itu, kami tidak akan mencari rute terpendek panjangnya, tetapi menutup (rasional) untuk itu dalam waktu yang terbatas menggunakan "algoritma semut".

Beberapa kata tentang AnyLogic adalah alat yang ampuh yang memungkinkan Anda untuk membuat model simulasi dengan berbagai kompleksitas. Ini mengimplementasikan berbagai pendekatan simulasi. Kami hanya akan menganalisis salah satu pendekatan, yaitu pemodelan "Agen". Ini diimplementasikan dalam bahasa pemrograman Java, yang melengkapi alat yang ada. Kelemahan utama "AnyLogic" adalah keterbatasan versi gratis pada jumlah agen yang dibuat, jumlah mereka tidak dapat melebihi 50.000. "Agen" adalah unit dasar dari sistem simulasi AnyLogic. Informasi lebih lanjut dapat ditemukan di situs web www.anylogic.ru

Alat


1. Anylogic - unduh versi gratis dari sini www.anylogic.ru/downloads
kenalan awal

AnyLogic : antarmuka AnyLogic ditunjukkan pada Gambar 1. Ini termasuk:
  • area hijau adalah ruang agen di mana kita akan membuat;
  • area merah - properti objek yang menjadi fokus;
  • palette - alat yang dapat Anda gunakan saat membuat model;
  • proyek - struktur model yang dikembangkan.



Ara. 1- Jendela sembulan AnyLogic

Pembuatan proyek


Semuanya sederhana di sini. Klik pada item menu "File" di sebelah "Buat" dan kemudian "Model", masukkan nama model dan klik pada tombol "Finish" (Gbr. 2).


Ara. 2- Membuat model

Buat kota


Baiklah, mari kita mulai. Hal pertama yang akan kita lakukan adalah menciptakan apa yang disebut kota (puncak grafik) yang akan dikunjungi semut. Mengapa kita membuka tab "Agen" di palet dan menyeret lingkaran merah dengan pria kecil ke agen "Utama" dari sana, seperti yang ditunjukkan pada Gambar 3.


Gambar. 3- Membuat kota

Setelah Anda melepaskan tombol mouse, kotak dialog muncul ("Langkah 1"), meminta Anda untuk membuat agen. Di mana akan perlu untuk memilih item "Populasi Agen" dan klik tombol "Next".


Ara. 4- Membuat kota

Kotak dialog berikut ini muncul (Langkah 2) di mana Anda harus memasukkan nama jenis agen baru dan nama populasi agen. Masukkan tipe "MyTown" dan nama populasi "myTowns" dan klik tombol "Next".


Ara. 4a - Masukkan nama agen baru

Maka jendela berikut akan muncul (Langkah 4.). Di sini kita memilih "Animasi Agen 2D" dan ikon dengan tulisan "Tanam" dan klik tombol "Selesai" (Gbr. 5).


Ara. 5- Menambahkan animasi untuk agen

Sekarang buat variabel yang akan menentukan jumlah awal kota dalam model kami. Mengapa, dari "Palette", seret ikon dengan tulisan "Variable" ke agen "Main" dan masukkan namanya "numberTown". Selanjutnya, klik ikon variabel kita dan di tab Properties, masukkan nilai awalnya sama dengan, misalnya, 10 dan pilih jenisnya "int" (Gbr. 6).


Ara. 6- Membuat variabel

Sekarang kita menetapkan nilai awal populasi kota kita "myTowns", yang kita klik ikonnya dan di tab "Properties" di bidang "Jumlah agen awal" tulis nama variabel yang kita buat sebelumnya (Gbr. 7).


Ara. 7 - Mengubah properti populasi "myTowns" Selanjutnya,

kita akan menggambar kesimpulan kota-kota kita di agen "Utama" di tempat acak. Ruang terbatas hingga kuadrat 400x400 piksel. Mengapa, di tab "Proyek", pilih agen "Utama" dengan mouse dan di tab "Properti", di bidang "Saat Startup", tambahkan kode Java berikut (Gbr. 7a):
for (int i=0; i<myTowns.size(); i++) {
	myTowns.get(i).setXY(uniform(0,400), uniform(0,400));
}

Dimana:
  • myTowns.size () - jumlah kota yang dibuat;
  • myTowns.get (i) .setXY (uniform (0.400), uniform (0.400)) - mengatur koordinat X dan Y untuk kota ke-i;
  • uniform (0,400) - fungsi yang mengembalikan angka acak dalam rentang dari 0 hingga 400 sesuai dengan hukum distribusi yang mungkin sama dari variabel acak. Lingkungan AnyLogic memiliki toolkit yang luas untuk bekerja dengan berbagai distribusi variabel acak. Ada built-in constructor dari distribusi probabilitas, tersedia di toolbar.

Dimana:
  • myTowns.size () - jumlah kota yang dibuat;
  • myTowns.get (i) .setXY (uniform (0.400), uniform (0.400)) - mengatur koordinat X dan Y untuk kota ke-i;
  • uniform(0,400) – , 0 400 . AnyLogic . .



Ara. 7a - Kita mengatur kota,

lalu kita sudah bisa melihat apa yang kita lakukan dan mulai model kita Untuk melakukan ini, gunakan tombol "F5", klik dan jendela untuk meluncurkan percobaan diluncurkan seperti yang ditunjukkan pada Gambar 8.


Gambar. 8 - Mulai percobaan

Selanjutnya, klik tombol "Jalankan" di sudut kiri bawah jendela dan percobaan dimulai. Anda harus mendapatkan jendela dengan konten di layar seperti yang ditunjukkan pada Gambar 9.


Gambar. 9 - Hasil percobaan

Jadi, pada langkah ini kami membuat 10 kota dan menempatkannya di tempat acak (stokastik) di layar kami. Sekarang mari kita beralih ke penciptaan "semut" kita

Buat semut


Jadi, unit tempur utama model kita akan menjadi semut. Pertama-tama kita harus menciptakannya, dan kemudian membuat model perilakunya.

Membuat semut mirip dengan menciptakan kota. Di "Palette" pilih "Agent" dan seret ke "Main". Pilih "Populasi agen", lalu "Saya ingin membuat jenis agen baru", lalu masukkan "Nama tipe baru" dan "Nama populasi" "MyAnt" "myAnts" dan klik "Next". Setelah itu kita memilih animasi "2D" dan, misalnya, ikon dengan tulisan "Fighter" klik "Finish" dan itu akan berubah seperti yang ditunjukkan pada Gambar 10.


Gambar. 10 - Buat semut

Setuju, pesawat tidak terlihat seperti semut, jadi kami akan memperbaikinya. Kami masuk ke mesin pencari mencari gambar yang menggambarkan seekor semut dan mengubah pesawat menjadi semut. Mengapa kita klik dua kali pada lingkaran merah di dekat "myAnts". Setelah itu tab "myAnt" akan terbuka di mana Anda harus menghapus pesawat dan menempatkan semut di tempatnya (Gbr. 11).


Ara. 11 - Tab MyAnt

Pilih pesawat dengan mouse dan tekan "Del". Selanjutnya, buka tab "Presentasi" dan seret elemen "Gambar" dari sana. Setelah itu, dialog akan terbuka secara otomatis untuk memilih file. Pilih file dengan semut kami (Gbr. 12) dan klik OK.


Ara. 12 - Tab MyAnt dengan semut dan sudah tanpa pesawat terbang

Berpindah. Skala semut dan pindahkan ke tempat pesawat dulu. Itu harus berubah seperti yang ditunjukkan pada Gambar 12a. Semua operasi ini dilakukan dengan menggunakan mouse.


Ara. 12a - Tab MyAnt dengan semut

Kami menghidupkan kembali semut


Sekarang kita perlu mengajar semut kita yang baru dipanggang untuk merangkak di antara kota-kota. Benar, sejauh ini tanpa memperhitungkan model matematika, tetapi tetap membiarkannya berjalan. Maka, buka diagram "State diagram" di "Palette" dan lanjutkan. Kami mentransfer blok berikut dan menghubungkannya bersama:
  • Awal diagram keadaan adalah titik awal dari siklus hidup semut kita;
  • Status - blok ini akan mencirikan kondisi siklus hidup semut kita. Blok-blok seperti itu dibutuhkan dalam bentuk potongan.
  • Transisi - panah yang akan menghubungkan "Negara" kita satu sama lain dan melakukan transisi dari satu "Negara" ke "Negara" lain dalam kondisi tertentu.

Sebagai hasilnya, hasilnya akan menjadi seperti yang ditunjukkan pada Gambar 13.


Gambar. 13 - Logika perilaku semut

Sekarang mari kita menulis logika awal diagram semut. Kami memilih dengan mouse panah yang keluar dari blok di bawah nama "Pilih Kota" dan menambahkan kode berikut dalam bidang "Aksi" di tab "Properti" (Gbr. 14):
for (int i=0; i<main.myTowns.size(); i++) {
	if (randomTrue(0.5)) {
		this.moveTo(main.myTowns.get(i));
		break;
	} 
}

Di sini, semuanya sangat sederhana, kita melalui siklus di semua kota dan melemparkan koin (kita menghasilkan variabel acak dengan probabilitas. 0,5) jika nilainya benar (elang), maka kita mengirim semut ke kota ini meninggalkan siklus. Ekspresi "this.moveTo (main.myTowns.get (i))" adalah fungsi yang mengirim satu agen ke agen lain.


Ara. 14 - Tetapkan logika awal pergerakan semut.

Selanjutnya, klik panah yang meninggalkan blok "Gerak" dan di tab "Properti", di bidang "Terjadi", atur nilai "Setelah menerima pesan" dan pilih "Setelah menerima pesan yang ditentukan" di bidang "Terjadi". »Seperti yang ditunjukkan pada Gambar 15.


Gambar. 15 - Tetapkan logika untuk transisi antara "Gerakan" dan "Bypass semuanya"

Sekarang konfigurasikan panah terakhir yang keluar dari blok "Motion". Kami memilihnya dengan mouse dan di tab "Properti", di bidang transisi, set "Setelah kedatangan agen." Tampilan akhir dari "State diagram" harus seperti yang ditunjukkan pada Gambar 16.


Gambar. 16 - State diagram dengan transisi yang dikonfigurasi antar blok

Jadi, mari kita lihat bagaimana "State diagram" dari perilaku semut:
  1. Keadaan pertama yang dimiliki semut adalah “Vybor_city”, sejauh ini belum ada tindakan yang dijabarkan.
  2. Lalu ia pergi ke negara berikutnya setelah transisi. Dalam transisi ini, kami menambahkan kode yang memulai siklus melalui semua gunung dan membuat semut berjalan di sekitar kota.
  3. Blok "Gerakan" adalah tempat semut berada sampai tiba di kota yang dipilih sebelumnya.
  4. Lebih lanjut, dia memiliki dua cara. Pertama, dia kembali ke blok "City_Choice" dan semuanya diulang lagi. Di jalan kedua dia harus pergi ketika dia sudah mengunjungi semua kota. Sejauh ini, cara kedua tidak diatur dengan kami. Kami akan berurusan dengan mereka nanti.



Ara. 17 - Operasi diagram keadaan

Sekarang kita dapat menekan "F5" untuk melihat apa yang terjadi (Gbr. 18).


Ara. 18 - Kebangkitan semut

Tentukan kriteria


Jadi, apa kriteria (aturan) ini:
  1. Semut harus mengunjungi setiap kota hanya sekali.
  2. Semut, ketika dia mengunjungi semua kota berakhir gerakannya di kota terakhir.

Kriteria ini ditentukan oleh kami oleh kondisi masalah salesman keliling. Setiap semut akan bersama kita semacam salesman keliling yang bepergian melalui kota.

Mari ajari semut untuk mematuhi aturan-aturan ini. Mengapa, dari "Palette", tab "Agent", transfer "Collection" dan "Variable" ke tab "MyAnt" dan beri nama mereka terlebih dahulu sebagai "isVisited" dan yang kedua sebagai "distance". Yang pertama akan mempertimbangkan kota-kota yang telah kita kunjungi, dan yang kedua jarak yang ditempuh semut.


Ara. 19 - Tambahkan Variabel

Mengatur koleksi isVisited. Mengapa kita memilihnya dengan mouse dan mengatur "Jenis" elemen "int" di tab "Properti" seperti yang ditunjukkan pada Gambar 20.
Untuk variabel "jarak" di propertinya, di bidang "Nilai awal", setel "0" dan jenis variabel "ganda" ".


Ara. 20 - Kumpulan tipe "int"

Sekarang pilih panah yang meninggalkan blok "City_block" dan ubah kode di bidang "Action" menjadi yang di bawah ini:
for (int i=0; i<main.myTowns.size(); i++) {
	if (randomTrue(0.9) && isVisited.indexOf(i)==-1) {
		this.moveTo(main.myTowns.get(i));
		distance=distance+this.distanceTo(main.myTowns.get(i));
		isVisited.add(i);
		break;
	} 
}

Dalam kode di atas, kami menambahkan tanda centang untuk kota-kota di mana kami telah berhasil mengunjungi, dan mempertimbangkan kota-kota yang kami kunjungi, dan juga mempertimbangkan jarak yang ditempuh. Kode ini cukup sederhana, saya pikir tidak akan sulit bagi Anda untuk mengerti.

Anda dapat mencoba meluncurkan "F5" model kami dan melihat apa yang terjadi. Sekarang semut akan melewati semua kota hanya sekali dan menyelesaikan gerakan mereka di blok.

Ubah penempatan semut awal


Pada langkah ini, kami akan menentukan untuk setiap semut, kami akan secara acak memilih kota dari mana ia akan memulai perjalanannya. Mengapa, pada tab "Proyek", pilih agen "Utama" dengan mouse dan kemudian pada tab "Properti" tambahkan kode berikut ke bidang "Saat Startup" (Gbr. 20a):
for (int i=0; i<myAnts.size(); i++) {
	//        
	int startTown = uniform_discr(0,myTowns-1);
	//     
	myAnts.get(i).setPosition(myTowns.get(startTown));
	//      
	myAnts.get(i).isVisited.add(startTown);
}



Ara. 20a - Mengatur semut berdasarkan kota

Saya menerapkan pemilihan acak dari kota awal. Pada awalnya Anda dapat mengidentifikasi semua semut hanya dalam satu kota.

Membuat semut tidak dapat diprediksi


Mari kita perkenalkan rumus berikut ini ke dalam model kita: di



mana Pi adalah probabilitas transisi di sepanjang jalur ke-i, li adalah panjang dari transisi ke-i, fi adalah jumlah feromon pada transisi ke-ke-i, q adalah nilai yang menentukan “keserakahan” dari algoritma, p - nilai yang menentukan "kawanan" algoritma, dengan q + p = 1.

Saya meminjam formula ini dari situs .

Secara sederhana, rumus ini memungkinkan Anda untuk menghitung probabilitas semut harus melakukan transisi ke kota tertentu.

Sekarang kita perlu menambahkan beberapa variabel yang tanpanya kita tidak bisa melakukannya. Mengapa kembali ke tab "Utama", gambar 21.


Gambar. 21 - Tab "Utama"

Jadi, kita tambahkan variabel "numberAnt", di mana kita akan menyimpan ukuran koloni semut. Kami mengatur tipenya menjadi "int" dan nilai awalnya adalah 100.


Gambar. 21 - Variabel "numberAnt"

Selanjutnya, pilih populasi "myAnts" dan setel bidang "Initial number of agents" ke "numberAnt".

Variabel "p", yang akan menentukan herdness dari algoritma. Jenisnya dua kali lipat dan nilai awalnya adalah 0,5.

Variabel "q", yang akan menentukan keserakahan algoritma. Jenisnya dua kali lipat dan nilai awalnya adalah 0,5.


Ara. 22 - Variabel "q dan p"

Jadi, sekarang kita akan menetapkan nilai feromon acak untuk setiap tepi (jalan) antara kota-kota. Mengapa membuat variabel (array dua dimensi) "matrixF". Setel pada tab “Properties” di bidang “Type”, pilih nilai “Other” dan tulis “double [] []” di bidang nilai awal “double baru [numberTown] [numberTown]” (Gbr. 23).


Ara. 23 - Membuat array dua dimensi "matrixF". Matriks Pheromone

Selanjutnya, kita perlu menginisialisasi matriks ini. Dengan kata lain, isi dengan nilai acak. Kami mengambil nilai feromon secara acak dalam kisaran 0,1 hingga
1. Untuk ini, pada tab "Proyek", pilih agen "Utama" dengan mouse dan kemudian di tab "Properti" tambahkan kode berikut ke bidang "Saat Memulai" (Gbr. 23a):
for (int i=0; i<myTowns.size(); i++) {
	for (int j=0; j<myTowns.size(); j++) {
		matrixF[i][j]=uniform(0.1,1);
	}
} 



Ara. 23a - Kode inisialisasi matriks pheromone

Sekarang kita kembali ke tab "MyAnt" dan melanjutkan untuk menghitung probabilitas transisi sesuai dengan rumus di atas. Pilih transisi antara "City_Choice" dan "Motion" dan ubah kode di bidang Tindakan ke yang berikut (Gbr. 24):
//       
double denominator=0; 
//          
for (int i=0; i<main.myTowns.size(); i++) {
	if (isVisited.indexOf(i)==-1) {	//     
	    //  i   
		denominator=denominator+(Math.pow(this.distanceTo(main.myTowns.get(i)), main.q)*Math.pow(main.myTowns.get(i).f, main.p));
	} 
}
//      i 
double Pi=0;
//    
double probility=uniform(0,1);
for (int i=0; i<main.myTowns.size(); i++) {
	//        Pi
	if (isVisited.indexOf(i)==-1) {
		//     i-      
		Pi=Pi+(Math.pow(this.distanceTo(main.myTowns.get(i)), main.q)*Math.pow(main.myTowns.get(i).f, main.p))/denominator;
	}
	//      Pi      probility
	if (probility<Pi && isVisited.indexOf(i)==-1) {
		//       i  
		this.moveTo(main.myTowns.get(i));
		//     
		distance=distance+this.distanceTo(main.myTowns.get(i));
		//           
		isVisited.add(i);
		break;
	} 
}



Ara. 24 - Kami mengatur perilaku semut berdasarkan ekspresi analitik di atas.

Jadi sekarang saya akan menjelaskan sedikit apa itu:
  • li - this.distanceTo (main.myTowns.get (i)), nilai panjang antara posisi semut saat ini dan kota "i";
  • fi - main.matrixF [currentPos] [i], nilai level feromon antara kota saat ini dan kota "i";
  • penyebut - penyebut + (Math.pow (this.distanceTo (main.myTowns.get (i)), main.q) * Math.pow (main.matrixF [currentPos] [i], main.p));, penyebut Pi
  • Pi - Pi + (Math.pow (this.distanceTo (main.myTowns.get (i)), main.q) * Math.pow (main.myTowns.get (i) .f, main.p)) / penyebut, probabilitas semut bergerak dari kota saat ini ke kota "i".

Selanjutnya, kita memilih transisi antara blok "Gerak" dan "Semua-dilewati" dengan mouse dan pilih "Ketika kondisi terpenuhi" di bidang "Terjadi", dan dalam bidang kondisi kita menulis kondisi agar semut berhenti "isVisited.size () == main.myTowns.size ()" (gbr. 25).


Ara. 25 - Tentukan kondisi untuk menghentikan semut.

Kemudian Anda dapat menjalankan model "F5" dan melihat apa yang terjadi. Semut akan melakukan perjalanan antar kota dengan probabilitas yang dihitung berdasarkan ekspresi analitik di atas.

Memperbarui nilai feromon


Sekarang mari kita lakukan dua hal. Tindakan pertama adalah meningkatkan nilai feromon di tepi antara kota-kota yang dilalui semut. Yang kedua adalah penguapan feromon di tepi antara kota-kota, yang terdiri dalam mengurangi nilai feromon relatif terhadap waktu simulasi.

Jadi, untuk memulai dengan tindakan pertama, kami akan memperbarui nilai feromon dari tulang rusuk antara kota di mana semut berada dan di mana ia akan pergi. Nilai dengan mana kita akan meningkatkan nilai saat ini dari tepi feromon antar kota akan dihitung sangat, sangat sederhana. Kami mengambil nilai awal maksimum kami dari nilai feromon = 1 cu dan membaginya dengan jarak antara kota di mana semut berada dan kota di mana dia akan pergi. Dengan demikian, semakin kecil jarak, antara kota-kota akan semakin besar nilai di mana tingkat feromon tulang rusuk akan meningkat. Mengapa memilih agen MyAnt di tab Projects, gunakan mouse untuk memilih transisi antara blok "City_title" dan "Movement" dan tambahkan kode berikut ke bidang tindakan: "main.matrixF [currentPos] [i] = main.matrixF [currentPos] [i ] +1 / this.distanceTo (main.myTowns.get (i); ".Hasilnya harus seperti yang ditunjukkan pada Gambar 26


Ara. 26 - Memperbarui nilai tingkat feromon dari tulang rusuk yang dilewati semut.

Sekarang kita lanjutkan ke tindakan No. 2 dan membuat acara yang akan mensimulasikan penguapan feromon di tepi antara kota-kota. Mengapa, pada tab proyek, pilih agen "Utama" dan buat beberapa variabel lagi di sana. Yang pertama adalah "intensitas" - itu akan menentukan tingkat (intensitas) penguapan feromon (Nilai awal "0,5", ketik "ganda"). "Bagian" kedua - akan mencirikan fraksi di mana nilai feromon di tepi akan berkurang (Nilai awal "0,9", ketik "ganda").


Ara. 27 - Buat variabel "intensitas" dan "Bagian"

Selanjutnya, kita ambil elemen "Event" dari "Palette" dari tab "Agent" dan mentransfernya ke agen "Main" dan menyebutnya "evaporation" - elemen ini akan mensimulasikan penguapan feromon di tepinya. Kami mengkliknya dengan mouse dan di "Properti" di bidang "Jenis Acara", pilih nilai "Dengan intensitas yang diberikan" di bidang "Intensitas", tulis nama variabel yang menyimpan nilai "intensitas". Waktu respons adalah detik. Selanjutnya, tambahkan kode di bawah ini ke tindakan:
for (int i=0; i<myTowns.size(); i++) {
	for (int j=0; j<myTowns.size(); j++) {
		matrixF[i][j]=matrixF[i][j]*Part;
		if (matrixF[i][j]<0.1) matrixF[i][j]=0.1;
	}
}

Ketika acara "evaporasi" dipicu, level feromon dalam matriks matrixF akan diperbarui. Akibatnya, Anda harus dapat melakukan seperti yang ditunjukkan pada Gambar 28.


Gambar. 28 - Buat acara "penguapan"

Tentukan pemenangnya


Pada langkah ini, kami akan menambahkan kode yang akan menentukan pemenang maraton semut kami. Pemenangnya adalah semut yang menjalankan rute terpendek. Selain segalanya, setelah akhir maraton, kami menggambar rute ini di layar. Untuk mencapai ini, kita akan membuat tiga variabel "bestAnt", "bestDistance" dan "numberFinish" di agen "Main". Dalam variabel "bestAnt" kita akan menyimpan indeks semut "tercepat", jenis variabelnya adalah "int" dan nilai awal akan ditetapkan ke "-1". Dalam variabel "bestDistance" kita akan menyimpan nilai saat ini dari panjang rute terbaik antar kota, jenis variabel akan "ganda" dan nilai awal akan ditetapkan hingga tak terbatas "tak terbatas". Dalam variabel "numberFinish" kita akan menyimpan jumlah semut yang telah selesai dalam maraton kita,tipe variabelnya adalah "int" dan nilai awalnya adalah "0" (Gbr. 29).


Ara. 29 - Buat acara variabel

Selanjutnya, kita membuat fungsi yang, setelah menyelesaikan semua semut, akan menggambar garis rute terbaik antara kota-kota. Kenapa dari "Palette" kita seret ke agen "Main" elemen dengan fungsi nama. Atur nama fungsi menjadi drawPath, dan di tab Properties, di bidang fungsi, tambahkan kode berikut:
//        
for (int i=0; i<myAnts.get(bestAnt).isVisited.size()-1; i++) {
	//    
	ShapeLine myLine = new ShapeLine();
	//            i
	myLine.setX(myTowns.get(myAnts.get(bestAnt).isVisited.get(i)).getX());
	myLine.setY(myTowns.get(myAnts.get(bestAnt).isVisited.get(i)).getY());
	//            i+1
	myLine.setEndX(myTowns.get(myAnts.get(bestAnt).isVisited.get(i+1)).getX());
	myLine.setEndY(myTowns.get(myAnts.get(bestAnt).isVisited.get(i+1)).getY());
	//    ""
	myLine.setColor(blue);
	//   
	myLine.setLineStyle(LINE_STYLE_SOLID );
	//   
	myLine.setLineWidth(1);
	//    
	presentation.add(myLine);	
}
	//           
	ShapeLine myLine = new ShapeLine();
	myLine.setX(myTowns.get(myAnts.get(bestAnt).isVisited.get(myAnts.get(bestAnt).isVisited.size()-1)).getX());
	myLine.setY(myTowns.get(myAnts.get(bestAnt).isVisited.get(myAnts.get(bestAnt).isVisited.size()-1)).getY());
	myLine.setEndX(myTowns.get(myAnts.get(bestAnt).isVisited.get(0)).getX());
	myLine.setEndY(myTowns.get(myAnts.get(bestAnt).isVisited.get(0)).getY());
	myLine.setColor(blue);
	myLine.setLineStyle(LINE_STYLE_SOLID );
	myLine.setLineWidth(1);
	presentation.add(myLine);

Akibatnya, Anda harus dapat melakukan seperti yang ditunjukkan pada Gambar 29a.


Ara. 29a - Buat fungsi "drawPath"

Sekarang kita kembali ke semut kita dan menambahkan kode yang akan menentukan semut pemenang, panjang rute terbaik dan menggambar rute ini antar kota. Mengapa, di tab "Projects", pilih agen "MyAnt", lalu pilih blok "All Bypassed" dan tambahkan kode berikut ke bidang "Logon Action":
//    
main.numberFinish++;
//      
if (main.bestDistance>distance) {
	//           
	//      
	main.bestDistance=distance;
	//    
	main.bestAnt = this.getIndex();
}
//         Main   
if (main.numberFinish==main.myAnts.size()) main.drawPath();

Itu harus berubah seperti yang ditunjukkan pada Gambar 30.


Gambar. 30 - Menambahkan logika ke blok "All Bypassed".

Kemudian Anda dapat menekan "F5" dan menjalankan model. Semut akan berlarian mencari rute, dan ketika kota selesai, garis biru akan terhubung, yang merupakan rute terbaik.

Tambahkan histogram ke model


Agar model menjadi lebih ilmiah, Anda harus menambahkan grafik. Oleh karena itu, kami akan menambahkan tidak hanya grafik dan histogram yang akan menunjukkan kepada kita distribusi panjang rute yang telah dilewati semut. Mengapa di tab "Proyek" pilih agen "Utama" dan pergi ke ruangnya. Selanjutnya, dalam "Palette" kita pergi ke tab "Statistics" dan dari sana ke agen "Main" kita mentransfer elemen "Data Histogram" dan langsung "Histogram" itu sendiri. Kemudian kita memilih histogram dengan mouse dan di tab "Properti", di bidang "Data", tentukan nama "Data Histogram" kami yaitu. "Data".

Itu harus berubah seperti yang ditunjukkan pada Gambar 31


. 31 - Membuat jadwal

Setelah itu kita kembali harus kembali ke semut dan membuatnya mengisi "Histogram" dengan nilai-nilai panjang rute. Mengapa, di tab proyek, pilih agen "MyAnt" dan pergi ke ruangnya. Selanjutnya, pilih blok "Semua Bypass" dan tambahkan satu baris ke dalamnya "main.data.add (jarak);". Itu harus berubah seperti yang ditunjukkan pada Gambar 32.


Gambar. 32 - Membangun grafik

Selanjutnya, tekan "F5" dan lanjutkan untuk mempelajari perilaku algoritma semut. Seharusnya menghasilkan sesuatu, seperti yang ditunjukkan pada Gambar 33.


Gambar. 33 - Pemodelan

Kesimpulan


Dan pada akhirnya, saya sarankan menambahkan lebih banyak ketidakpastian untuk model. Mengapa, pada tab “Proyek”, pilih elemen “Simulasi: Utama” dengan mouse dan pada tab properti atur parameter “Keacakan” ke “Angka awal acak (bilangan unik)” - ini akan membuat setiap peluncuran model unik (Gbr. 34).


Ara. 34 - Melakukan lari acak

Terima kasih atas perhatian Anda! Kode sumber dapat diunduh dari GitHub

All Articles