Model Predator-Prey di Node.js

Baru-baru ini, gelombang referensi ke permainan Life telah melewati jaringan , terutama karena fakta bahwa penciptanya meninggal.

Sekarang adalah waktunya, semua orang menjadi tertarik pada biologi, di mana-mana jadwal kelangsungan hidup ini, yah, tiba-tiba saya keluar dari kotak memori model yang menarik, yang menurutnya saya pernah menulis makalah.

Model ini mirip dengan Kehidupan dalam hal itu adalah proses siklus yang sama yang dapat dilihat sebagai api, bermeditasi tanpa akhir dan merefleksikan yang abadi.

Ini adalah korban Predator , model yang sangat serius dari matematika terapan (Predator-mangsa di dunia berbahasa Inggris).

Inti dari proses ini adalah bahwa di hutan tertentu hidup kawanan rusa (dalam versi alternatif - kelinci, tetapi bukan intisari), yang memakan ke alam liar dan berkembang biak dengan liar, cepat atau lambat memenuhi seluruh wilayah.

Namun, di hutan yang sama ada juga predator yang memakan rusa ini (serigala, tetapi untuk kelinci, biasanya rubah).

Sepasang predator yang mendapati diri mereka di hutan yang berlimpah ini berlipat ganda secara eksponensial sesuai dengan hukum Malthus , tetapi pada titik tertentu, sumber daya rusa mulai mengering, serigala mulai kelaparan dan mati, peserta pameran dengan cepat terbang turun dan hanya yang paling gigih bertahan di sana.

Rusa yang terpojok mengangkat kepala, menghidupkan peserta pameran dan mulai mendominasi hutan, tetapi serigala-serigala yang hidup dengan daging segar menemukan kekuatan dalam diri mereka sendiri untuk gelombang kesuburan baru ... dan seterusnya dalam lingkaran dan hingga tak terbatas.

Berikut ini adalah grafik (diseret dari Wikipedia):



Model matematika dari proses ini dijelaskan pada awal abad ke-20 oleh Lotka dan Volterra dan diberi nama setelah mereka.

Mengapa model ini sudah ada selama seratus tahun dan masih relevan?

Ada dua alasan utama: sangat sederhana dan menggambarkan prosesnya dengan cukup realistis.

Model hanya memiliki empat parameter:

  • alpha) tingkat pengembangbiakan rusa
  • beta) kecepatan makan rusa oleh serigala
  • gamma) tingkat kepunahan serigala lapar
  • delta) tingkat pengembangbiakan serigala yang cukup makan

Model ini mengandung nonlinier minimal dan dianggap analitis. Dengan parameter yang dipilih dengan baik, ia stabil (baik rusa maupun serigala tidak mati sampai akhir) dan secara realistis menggambarkan dinamika fluktuasi populasi.

Lebih dari seratus tahun, ada banyak upaya untuk membuat sesuatu yang lebih realistis - tetapi setiap peningkatan kompleksitas mengarah pada sistem nonlinier dari tingkat yang lebih tinggi dan kemudian semuanya bertumpu pada persamaan integral yang tidak dapat ditembus yang hanya dapat diselesaikan dengan metode numerik.

Ada metode lain - hanya program proses ini sebagai permainan.

Bahkan, pendekatan ini disebut pemodelan multi-agen dan cukup cocok untuk lulus kursus.

Memilih Teknologi


Saya ingin program memiliki visualisasi, tidak hanya pada mesin penulis, tetapi pada audiens sebanyak mungkin, dan bahwa itu harus semua dengan sendirinya, dengan sedikit usaha dan semua itu.
Adalah logis bahwa solusinya adalah menjalankan program di browser dan, oleh karena itu, Anda harus menulisnya dalam javascript.

Nah, agar tidak menghasilkan kebun binatang teknologi, kami juga akan menulis server di atasnya.

Langkah-langkah standar untuk menginstal node.js dan semua yang Anda butuhkan dijelaskan di github .

Model pertumbuhan rusa


Kami melewati yang paling menarik - reproduksi. Tanpa predator, kita memiliki model Malthus dalam kondisi sumber daya yang terbatas (dalam dunia matematika digambarkan oleh fungsi logistik atau persamaan Verhulst ), sekarang entah bagaimana harus diterapkan pada agen.

Dimungkinkan untuk memilih koefisien probabilistik untuk setiap rusa dan semuanya harus berhasil.
Tetapi pemodelan agen agen bagus - Anda dapat menentukan perilaku tanpa membatasi diri Anda pada beberapa faktor.

Secara umum, model kehidupan rusa terlihat seperti ini:

  • rusa harus bergerak. Seekor rusa yang tidak bisa bergerak per unit waktu mati (dan dia tidak bisa bergerak hanya karena semua kandang tetangga ditempati oleh teman-temannya).
  • , , .

  breed(u) {
    var spots = MapUtil.get_adj(u.point, this.W, this.H)
    if (!spots || spots.length < 1)
      return false
    var free = spots.filter(p => !this.GM.get(p))
    if (free.length < spots.length)
      return false
    var spot = _.sample(spots)
    if (!spot)
      return false
    var born = new Wild(u.kind)
    born.move(spot)
    this.add_wild(born)
    this.born.push(born)
  }

Selanjutnya, kita akan membuat aplikasi uji ringan yang menciptakan dunia hutan 20x20, berjalan ke tengah-tengah rusa, dan menjalankan 100 siklus, setiap kali mencetak status dalam csv.

Kami akan mengarahkan file csv yang dihasilkan ke Google Spreadsheet dan menghasilkan grafik:



Ini cukup eksponen. Kami melihat bahwa jumlahnya stabil untuk 200+ rusa, ini dapat dengan mudah dijelaskan oleh fakta bahwa kebutuhan untuk pergerakan membutuhkan setidaknya dua kandang untuk rusa, dan luas keseluruhan hutan adalah 400.

Pertumbuhan maksimum terjadi cukup awal - saat bergerak 14-15, dan 20 gerakan terakhir berdiri diam dengan sedikit fluktuasi.

Secara umum, saya ingin menekankan bahwa model agen paling sederhana berperilaku sangat realistis, sangat mirip dengan kurva logistik yang diencerkan dengan sedikit noise.

Tapi kami datang ke sini bukan untuk angka, tapi untuk gambar yang bisa Anda lihat dan bersantai.

Jadi, inilah saatnya membuat halaman dengan peta dan grafik, dan mentransfer model yang dijalankan ke server.

Kami meletakkan express dan socket.io, dan kami akan menggambar langsung di kanvas HTML5 (saya tidak terbiasa dengan mesin js, dan tugasnya tidak terlalu sulit).

Kami melihat dan merasa gugup tentang bagaimana rusa benar-benar membanjiri hutan dalam beberapa iterasi, dan kemudian secara asimptot berfluktuasi di sekitar titik maksimum.



Di satu sisi, ini hanya model, tetapi di beberapa tempat ini adalah masalah nyata - hanya google rusa yang kelebihan populasi dan akan terkejut dengan banyaknya materi tentang topik ini.

Model ini tidak memperhitungkan degradasi hutan, tetapi kenyataannya rusa adalah konsumen yang agak rakus - mereka memakan rebung, menginjak-injak bumi dan umumnya menghancurkan hutan mereka.

Apa yang harus dilakukan pemilik hutan dalam kasus ini?

Dia membeli serigala, menggantung sensor GPS pada masing-masing dan berdoa agar mereka tidak menghilang.

Serigala


Sudah waktunya untuk memperkenalkan serigala ke dalam model kami.

Dua hal perlu diputuskan - bagaimana serigala makan dan berkembang biak.

Sangat mudah untuk berburu ketika ada seseorang - jika ada rusa di kandang tetangga - makan saja.

Jika tidak ada rusa, maka Anda bisa bertahan untuk jangka waktu tertentu.

Untuk memulainya, katakanlah bahwa bisa ada serigala setiap gerakan, tetapi jika dalam dua gerakan itu tidak mungkin - ke sisi evolusi.

Dengan penggandaan lebih banyak opsi.

Untuk mulai dengan - kami menghapus kelezatan, biarkan serigala berlipat ganda selalu ketika ada ruang kosong.

Dan tambahkan batasan - serigala yang lapar tidak berkembang biak.

Panekuk pertama


Biarkan rusa berkembang biak sedikit dan lempar serigala ke kerumunan:



Model itu ternyata, untuk membuatnya lebih halus, tidak stabil - serigala langsung memangkas semua rusa dan dengan cepat mati.

Satu frustrasi, tidak ada zen.

Usaha kedua


Sesuatu perlu diubah.

Itu menyakitkan mata pada bagaimana ledakan serigala berkembang biak.

Mari kita sedikit menyulitkan hidup mereka - kita menetapkan kondisi bahwa adalah mungkin untuk berkembang biak hanya jika ada lebih banyak rusa daripada serigala di sel-sel rusa tetangga.

    var preys = spots.map(p => this.GM.get(p)).filter(u => u && u.kind == Wilds.DEER)
    var preds = spots.map(p => this.GM.get(p)).filter(u => u && u.kind == Wilds.WOLF)
    if (preys.length <= preds.length)
      return false

Dan meninggalkan serigala ketika populasi rusa mencapai maksimum.

Upaya ini berhasil jauh lebih baik.

Keseimbangan predator dan korban terus bergerak, populasi rusa telah sangat menurun dan sekarang bahkan tidak mendekati batas maksimum.



Namun, apa pun bisa terjadi, dan hampir setiap kali itu terjadi, serigala berhasil mati, dan rusa dengan penuh kemenangan mengisi belukar lagi.

Dalam perjalanan ini, serigala bertahan lama:



Lingkaran ketiga


Kita harus mengencangkan kacang pembibitan lebih keras.

Kami sekarang menyatakan kondisinya: harus ada rusa di dekatnya, tetapi tidak boleh ada serigala.
Serigala lembut seperti itu tidak mentolerir persaingan.

Sistem lebih stabil.

Dibandingkan dengan grafik sebelumnya, puncak dihaluskan oleh rusa dan serigala.



Secara umum, jelas ke mana harus pindah untuk mendapatkan jadwal mulus yang sama seperti di Wikipedia.
Akibatnya, kita sampai pada kesimpulan dangkal - kita harus mereproduksi secara sadar, dan tidak secara maksimal.
Kedengarannya seperti iklan hedonisme, tetapi Anda dapat lebih jauh mengurangi kesuburan serigala dengan harapan "meningkatkan kualitas dan durasi hidup mereka" ...



Penyebaran


Sebagai epilog, instruksi penempatan.

Ini sangat singkat:

1. Kami menulis file buruh pelabuhan sederhana:

FROM node:14
ADD https://github.com/tprlab/predator-prey/archive/master.zip /
RUN unzip /master.zip
WORKDIR /predator-prey-master
RUN npm install
EXPOSE 8081
CMD ["node", "server.js"]

2. buruh pelabuhan membangun. -t predator-prey

3. docker run -p 8081: 8081 predator-prey

Untuk yang paling malas, saya mengumpulkan dan mengunggah gambar ke Docker Hub.

Jika Anda tidak ingin mengacaukan docker, ada instruksi pemasangan dari awal pada halaman repo (tautan di bawah).

Referensi



All Articles