
Bu loyiha nima qiladi
self-driving-car — oddiy JavaScript’da yozilgan ixcham avtonom haydash simulyatsiyasi. Kichik neyron tarmoq evolyutsiya orqali egri uch polosali avtomagistralda haydash, o‘z polosasi markazida qolish, transport vositalari oldida tormozlash, burilish signalini yoqish, sekinroq avtomobillarni quvib o‘tish va kerak bo‘lganda o‘ng polosaga qaytishni o‘rganadi.
To‘g‘ri xatti-harakatni ko‘rsatadigan namunaviy haydovchi mavjud emas. Buning o‘rniga, har bir avlod neyron tarmoqlar populyatsiyasini bir xil yo‘lga chiqaradi. Eng uzoq masofani bosib o‘tgan tarmoqlar yuqoriroq moslashuv ballarini oladi va keyingi avlodning ota-onalariga aylanadi.
Loyiha yo‘l, transport vositasi fizikasi, idrok, transport oqimi, neyron tarmoq, genetik algoritm, rejalashtirish, tasvirlash va foydalanuvchi interfeysini qamrab oluvchi taxminan 1 300 qator ES modullaridan iborat. Ishlash vaqtida hech qanday bog‘liqlik talab qilinmaydi va bir xil simulyatsiya modullari brauzer hamda Node.js’da ishlaydi.
Oldindan o‘qitilgan haydovchini kuzatish, brauzerda populyatsiyani rivojlantirish yoki avtomobilni o‘zingiz boshqarish uchun jonli demoni ochishingiz mumkin.
Haydash tizimi qanday ishlaydi
Simulyatsiya sekundiga 60 qadamlik belgilangan tezlikda ishlaydi. Har bir qadamda avtomobil yaqin polosalarni skanerlaydi, kuzatuvlarni neyron tarmoqning 19 ta kirish signaliga aylantiradi va ikkita chiqish hosil qiladi: pedal buyrug‘i hamda so‘ralgan yo‘lak.
Idrok va neyron tarmoq
Tarmoq kamera piksellari yoki xom masofa nurlarini qayta ishlamaydi. U haydash rejalashtiruvchisiga idrok tizimi taqdim etishi mumkin bo‘lgan ma’lumotlarga o‘xshash tuzilgan axborotni qabul qiladi:
- Chap, joriy va o‘ng polosalar mavjud yoki mavjud emasligi.
- Tegishli har bir polosa bo‘yicha oldinda va orqada joylashgan eng yaqin avtomobil.
- Har bir oraliq qanchalik tez qisqarayotgani.
- O‘rganuvchi avtomobilning joriy tezligi.
- Keyingi 100 metrdagi eng keskin burilish.
- Polosa almashtirish rejalashtiruvchisining joriy holati.
Arxitektura 19 · 12 · 8 · 2 ko‘rinishida, tanh aktivatsiyalaridan foydalanadi va 362 ta vaznni o‘z ichiga oladi. Bir chiqish pedalni boshqaradi. Ikkinchisi polosa tanlaydi: +0.5 dan yuqori qiymat chapdagi polosani, -0.5 dan past qiymat esa o‘ngdagi polosani so‘raydi.
Rejalashtiruvchi va transport vositasi modeli
Neyron tarmoq qachon va qayerga harakatlanishni hal qiladi, ammo u to‘g‘ridan-to‘g‘ri rulni boshqarmaydi. Qo‘lda yozilgan rejalashtiruvchi polosa so‘rovini xavfsiz va ravon manyovrga aylantiradi. U 0,7 soniya davomida signal beradi, nishon polosani tekshiradi, 2,6 soniya davomida kvintik S-egri chizig‘i bo‘ylab harakatlanadi va rejalashtirilgan yo‘lni kuzatish uchun sof ta’qib boshqaruvidan foydalanadi.
Agar boshqa transport vositasi avtomobil bilan yonma-yon bo‘lsa yoki uning ko‘r nuqtasiga kirish arafasida turgan bo‘lsa, rejalashtiruvchi signal berishda davom etadi va oraliq ochilishini kutadi. Signal berish bosqichida so‘rovni bekor qilish manyovrni to‘xtatadi.
Avtomobilning o‘zi SI birliklaridagi kinematik velosiped modelidan foydalanadi. Uning parametrlari oilaviy xetchbekka o‘xshaydi: uzunligi 4,4 metr, 0 dan 100 km/soatgacha 9,8 soniyada tezlashadi, maksimal tezligi 115 km/soat va tormozlanishi 8 m/s² gacha. Mavjud burilish ilashishi uning burilishni qanchalik tez bosib o‘tishini cheklaydi.
Transport oqimi, moslashuv va evolyutsiya
Fon transporti Intelligent Driver Model modeliga amal qiladi. Avtomobillarning istalgan tezligi 61 dan 94 km/soatgacha bo‘ladi, ular chap tomondan quvib o‘tadi, quvib o‘tgach o‘ngga qaytadi, polosa almashtirishdan oldin signal beradi va o‘rganuvchi avtomobilga munosabat bildiradi.
Moslashuv asosan bosib o‘tilgan metrlar soni bilan belgilanadi. Avtomobil to‘qnashsa yoki yo‘l bo‘ylab harakatlanayotgan sekin qatorga tushib qolsa, 300 ball yo‘qotadi. Shuningdek, o‘ng tomonidagi polosa aniq bo‘sh bo‘lgan paytda chap polosada o‘tkazgan har bir soniya uchun to‘rt metr jarima oladi. Quvib o‘tish uchun bevosita mukofot berilmaydi; quvib o‘tish foydali bo‘ladi, chunki u avtomobilga ko‘proq masofa bosib o‘tish imkonini beradi.
Evolyutsiyada to‘rtta asosiy usuldan foydalaniladi:
- Elitizm: buyruq satrida o‘qitishda eng yaxshi to‘rtta tarmoq o‘zgartirilmagan holda keyingi avlodga o‘tadi.
- Turnir tanlovi: kuchliroq tarmoqlarning ota-ona bo‘lish ehtimoli yuqoriroq.
- BLX-0.25 krossoveri: avlod hosil qilish uchun ota-ona vaznlari aralashtiriladi.
- Gauss mutatsiyasi: mutatsiya darajasi va kattaligi 40 avlodlik yarim yemirilish davri bilan kamayadi.
O‘rnatish va mahalliy sozlash
Repozitoriyani klonlang va uning mahalliy statik serverini ishga tushiring:
git clone https://github.com/Stxqq/self-driving-car.git
cd self-driving-car
npm run serve
serve buyrug‘i 5101-portda Python HTTP serverini ishga tushiradi. Brauzeringizda http://localhost:5101 manzilini oching.
O‘rnatiladigan paketlar yo‘q. Istalgan statik veb-server loyihani joylashtira oladi, ammo sahifani to‘g‘ridan-to‘g‘ri file:// orqali ochish ishlamaydi, chunki brauzerlar bu kontekstda ES modullarini cheklaydi.
Test va buyruq satri skriptlarini ishga tushirish uchun Node.js 22 yoki undan yangiroq versiyasi talab qilinadi. Testlar to‘plamini quyidagicha ishga tushiring:
npm test
Brauzer interfeysidan foydalanish
Oldindan o‘qitilgan haydovchini kuzatish
Transport oqimi orasida harakatlanayotgan taqdim etilgan tarmoqni kuzatish uchun kuzatuv rejimidan foydalaning. Sahifa uning kirishlari, chiqishlari, rejalashtirilgan yo‘nalishi, polosa almashtirish holati va transport vositasi statistikasini ko‘rsatadi. Ko‘k tasma rejalashtiruvchi hosil qilgan yo‘lni bildiradi.
Qo‘lda haydash
Drive rejimida xuddi shu rejalashtiruvchini saqlab qolgan holda neyron tarmoqni almashtirasiz. Transport vositasi kruiz nazorati 70 km/soatga o‘rnatilgan holda boshlanadi.
- Belgilangan tezlikni oshirish uchun
↑tugmasini bosib turing. - Tormozlash va belgilangan tezlikni pasaytirish uchun
↓tugmasini bosing. - Chapga polosa almashtirishni so‘rash uchun
←tugmasini bosing. - O‘ngga polosa almashtirishni so‘rash uchun
→tugmasini bosing.
Tarmoq kartasida oldindan o‘qitilgan miya qanday harakat qilgan bo‘lardi, degan ma’lumot ko‘rsatilishda davom etadi. Shu sababli bu rejim qarorlaringizni uning qarorlari bilan taqqoslash uchun foydalidir.
Brauzerda o‘qitish
Train rejimi tasodifiy tarmoq og‘irliklariga ega 60 ta avtomobilni ishga tushiradi. Har bir avlod davomida barcha avtomobillar bitta yo‘ldan foydalanadi va transport oqimi dastlabki 15 avlodda asta-sekin kuchayadi. Dastlabki bosqichlar 45 soniyadan boshlanadi. Avtomobil oxirigacha omon qolsa, keyingi bosqichlar davomiyligi besh daqiqalik maksimal chegaraga yetguncha yarim baravarga oshadi.
Brauzerdagi trening yo‘lakda harakatlanish va oldindagi avtomobilga ergashish xatti-harakatlarini tezda kashf etadi, ammo quvib o‘tish ancha qiyin. Loyiha tavsifidagi testlarga ko‘ra, tasodifiy ishga tushirilgan populyatsiyalar 15-avlodgacha odatda har kilometrga atigi 0,1–0,5 marta yo‘lak almashtirgan. Dastlabki oldindan o‘qitilgan haydovchiga yo‘lak almashtirish foydali bo‘la boshlashidan oldin 200 ta avtomobildan iborat populyatsiyalar bilan taxminan 170 avlod kerak bo‘lgan.
Tasodifiy og‘irliklardan boshlash o‘rniga yuborilgan miya modelining ehtiyotkor mutatsiyalarini rivojlantirmoqchi bo‘lsangiz, From pretrained variantini tanlang. Sahifada o‘qitilgan miya modellarini JSON sifatida eksport qilish va keyinroq Import boshqaruvi orqali yuklash mumkin.
Buyruq satridan trening
Buyruq satri orqali trening worker oqimlarida boshga ko‘rinmaydigan rejimda ishlaydi. Quyidagi misol 120 ta tarmoqdan iborat populyatsiyani 10 avlod davomida o‘qitadi va har bir tarmoqni 60 soniyalik epizodlarda urug‘langan uchta yo‘lda baholaydi:
node scripts/train.mjs --generations 10 --population 120 --seeds 3 --seconds 60
Odatiy holatda hosil bo‘lgan miya modeli runs/brain.json fayliga yoziladi. Bu tajribalarni src/brains/pretrained.json dagi yuborilgan tarmoqdan alohida saqlaydi.
Trener eng yaxshi va o‘rtacha masofa, omon qolgan avtomobillar soni, mutatsiya darajasi hamda o‘tgan vaqt kabi statistikalarni ko‘rsatadi. Nol avlodda ham rejalashtiruvchi avtomobillarni yo‘laklarining markazida ushlab turgani sababli qisqa epizodni to‘liq bosib o‘tadigan avtomobillar bo‘lishi mumkin. Shu sababli taraqqiyotni bitta eng yaxshi natijadan ko‘ra populyatsiya o‘rtacha ko‘rsatkichining oshishida ko‘rish ko‘pincha osonroq.
Foydali trening parametrlari
--densitytransport miqdorini o‘zgartiradi.--resume--outorqali ko‘rsatilgan yo‘ldagi miya modelidan boshlaydi va yumshoqroq mutatsiyadan foydalanadi.--generationsevolyutsion bosqichlar sonini belgilaydi.--populationhar bir avlodda nechta miya modeli baholanishini belgilaydi.--seedsnechta yo‘l urug‘idan foydalanilishini belgilaydi.--secondshar bir epizod davomiyligini belgilaydi.
Yuborilgan miya modeli uchun foydalanilgan trening jarayoni scripts/curriculum.sh faylida qayd etilgan. U to‘liq transport oqimidagi ikki daqiqalik epizodlardan boshlanib, ko‘proq yo‘llarda besh daqiqalik epizodlargacha boradi, so‘ng o‘ng tomonda yurishni nozik sozlash bosqichi bilan yakunlanadi. Loyiha hujjatlariga ko‘ra, bu o‘quv dasturi 14 yadroli noutbukda taxminan bir soat davom etgan.
O‘qitilgan miya modelini baholash
Baholash miya modelini treningda ko‘rilmagan deterministik yo‘llarda o‘lchaydi. Baholovchini yo‘l urug‘lari ro‘yxati bilan ishga tushiring:
node scripts/evaluate.mjs --seeds 9001,9002,9003,9004,9005
Natija masofa, o‘tgan vaqt, o‘rtacha tezlik, yo‘lak almashtirishlar soni va har bir urinish vaqt tugagani yoki avtomobil halokatga uchragani sababli yakunlanganini ko‘rsatadi. Shuningdek, o‘rtacha va median masofa kabi umumiy qiymatlarni ham hisoblaydi.
Yuborilgan miya modeli o‘rniga eksport qilingan yoki yangi o‘qitilgan tarmoqni baholash uchun uning JSON faylini --brain bilan ko‘rsating:
node scripts/evaluate.mjs --brain runs/brain.json --seeds 9001,9002,9003
Rasmiy natijalarni quyidagi buyruq bilan qayta yaratish mumkin:
npm run evaluate -- --write
Bu buyruq scripts/results.json faylini yozadi; brauzer interfeysi ham shu fayldan foydalanadi.
E’lon qilingan natijalarni tushunish
Yuborilgan 362 og‘irlikli tarmoq to‘liq transport oqimida, treningda ishlatilmagan 30 ta urug‘da besh daqiqa davomida sinovdan o‘tkazildi. U 6,90 km o‘rtacha masofa, 7,23 km median masofa va 87 km/soat o‘rtacha tezlikka erishdi. 30 ta urinishdan 28 tasida avtomobil besh daqiqadan keyin ham harakatda edi va har kilometrga o‘rtacha 5,1 marta yo‘lak almashtirdi.
Loyiha bu tizimni 14 ta nur sensori asosida to‘g‘ridan-to‘g‘ri boshqargan avvalgi versiya bilan taqqoslaydi. Eski tarmoq o‘rtacha 4,05 km va 56 km/soat natija ko‘rsatgan, 30 ta urinishdan 20 tasida avtomobil besh daqiqadan keyin ham harakatda qolgan. Bu nazorat qilinadigan benchmark emas, chunki transport modeli ham o‘zgargan, biroq u o‘rganilgan qarorlarni rejalashtirilgan boshqaruvdan ajratish nega quvib o‘tishni kashf etishni osonlashtirganini ko‘rsatadi.
Tarmoq pedal va maqsadli yo‘lakni tanlaydi; rejalashtiruvchi burilish signalini, oraliq tekshiruvlarini va silliq boshqaruvni bajaradi.
Ilg‘or maslahatlar
Haddan tashqari moslashishni kamaytirish uchun bir nechta urug‘dan foydalaning
Bitta yo‘lda yaxshi ishlaydigan miya modeli boshqasida muvaffaqiyatsiz bo‘lishi mumkin. Trening urug‘lari sonini oshiring va tekshirish hamda yakuniy baholash uchun alohida urug‘larni ajrating. Boshga ko‘rinmaydigan trener har bir miya modelini o‘z yo‘lida alohida baholaydi, chunki transport o‘rganayotgan avtomobilga munosabat bildiradi; bu bir nomzod xatti-harakatining boshqasiga beriladigan ballni o‘zgartirishiga yo‘l qo‘ymaydi.
Qaytadan boshlashdan oldin davom ettiring
Agar o‘qitilgan miya modeli yo‘laklarda harakatlanib, transportdan qochayotgan bo‘lsa, --resume yoki brauzerdagi oldindan o‘qitilgan variantdan foydalaning. Tasodifiy og‘irliklardan boshlash evolyutsiyani boshidan kuzatish uchun mos, ammo murakkab quvib o‘tish xatti-harakatlarini shakllantirish uchun ko‘proq avlodlar va kattaroq populyatsiyalar talab qilinishi mumkin.
Qiyinchilikni asta-sekin oshiring
Omborning o‘quv dasturi yondashuviga amal qiling: boshqarish oson bo‘lgan epizod davomiyliklaridan boshlang, keyin davomiylik, yo‘l xilma-xilligi va baholash chuqurligini oshiring. Uzunroq epizodlar barqaror boshqaruv haqida yaxshiroq dalil beradi, ammo har bir avlodni qimmatroq qiladi.
Deterministiklikni saqlang
Simulyatsiya belgilangan vaqt qadamlarigacha deterministik: bir xil urug‘lar va miya modellari bir xil trayektoriyalarni hosil qiladi. Tezlik boshqaruvlari fizika qadamini o‘zgartirmaydi, balki har bir chizilgan kadrda ko‘proq 1/60 soniyalik simulyatsiya qadamlarini bajaradi. Bu natijani o‘zgartirmagan holda tezlashtirilgan treningni amalga oshirish imkonini beradi.
Loyihada nimani o‘zgartirish kerakligini biling
src/sim/DOM bog‘liqliklarisiz yo‘l, avtomobil, idrok, rejalashtirish, tirbandlik, dunyo, miya va evolyutsiya kodlarini o‘z ichiga oladi.src/render/canvas sahnasi, tarmoq vizualizatsiyasi, anatomiya ko‘rinishi va diagrammani o‘z ichiga oladi.src/ui/kuzatish, o‘qitish va boshqarish seanslari, xotira hamda klaviatura bilan ishlashni o‘z ichiga oladi.src/brains/oldindan o‘qitilgan tarmoqni o‘z ichiga oladi.scripts/o‘qitish, o‘quv dasturi, baholash va natijalar fayllarini o‘z ichiga oladi.test/Node.js testlarini, jumladan, ajratib qo‘yilgan replay tekshiruvlarini o‘z ichiga oladi.
Xulosa
Bu loyiha juda kichik neyron tarmoq an’anaviy rejalashtiruvchi aniq boshqaruv va qator almashtirishni bajarishni zimmasiga olganida, yuqori darajadagi haydash qarorlarini qanday o‘rganishi mumkinligini namoyish etadi. Avval brauzer demosini ishga tushiring, qo‘lda va neyron tarmoq asosidagi qarorlarni taqqoslang, so‘ngra Node.js skriptlaridan foydalanib, o‘z neyron tarmoqlaringizni o‘qiting va baholang. Bog‘liqliklarsiz amalga oshirilgani va deterministik simulyatsiyasi tufayli bu kod bazasi evolyutsion o‘rganish, transport vositalari modellari, tirbandlik xatti-harakati va rejalashtirishni o‘rganish uchun ham amaliy vositadir.
