"Trafik AI" nasıl oluşturulur?


21

Şu anda üzerinde çalıştığım bir proje, yollar boyunca hareket eden arabalar, bir apronun etrafında hareket eden uçaklar vb. Anlamında birçok "trafik" içeriyor.

Şu andan itibaren mevcut yollar önceden hesaplanmıştır, bu nedenle kendileri kenarlarla birbirine bağlanan geçişler için düğümler otomatik olarak üretilir. Bir karakter / ajan dünyaya dönüştüğünde bir düğümde başlar ve basit bir A * algoritması ile bir hedef düğüme giden yolu bulur. Temsilci yolu takip eder ve nihayetinde varış noktasına ulaşır. Şimdiye kadar sorun yok.

Şimdi ajanların çarpışmalardan kaçınmasını ve karmaşık trafik durumlarını ele almasını sağlamalıyım. Yapay zeka alanında yeni olduğum için, direksiyon davranışı hakkında birkaç makale / makale aradım, ancak bunların çok düşük düzeyde olduğunu gördüm. Benim sorunum, gerçek çarpışmadan kaçınma (bu durumda ajanlar kesinlikle tanımlanmış yolları takip ettiği için oldukça basit) ama bir ajan çıkmazdan ayrılırken diğeri de tamamen aynı olanı girmek istiyor. Veya bir darboğazda buluşan iki ajan bir seferde sadece bir ajanın geçmesine izin verir, ancak her ikisinin de onu geçmesi gerekir (daha önce bulunan en uygun yola göre) ve diğerinin önce geçmesine izin vermenin bir yolunu bulmaları gerekir. Yani temelde sorunun ana yönü, kilitlenmeleri önlemek için trafik hareketini tahmin etmek olacaktır.

Tarif etmek zor, ama ne demek istediğimi anladın sanırım. Nereden bakmaya başlayacağım konusunda bana tavsiyen var mı? Beni başlatabilecek herhangi bir makale, örnek proje veya benzeri şeyler var mı?

Yardımın için minnettarım!


İşbirlikçi difüzyon size bir şeylerde yardımcı olabilir. Aynı anda birden fazla aracıyı arama yolunu + kendilerinden kaçınan aracıları çözmenin basit bir yoludur. Lütfen, deneyiminizi bir yerde onunla paylaşın, teşekkürler. ;)
user712092

Yanıtlar:


12

Bu sorunu ele almanın pek çok yolu var, burada iyi ve kapsamlı bir cevap vermek için mücadele ediyorum. Ancak işte bazı üst düzey tasarım noktaları.

  • Burada bir temsilci simülasyonu yapıyorsunuz. Yol bulma sadece sisteme tek bir girdidir - aracının bir hedefi vardır ve yol bulma bu hedefe ulaşmanın bir yoludur. Aslında, bunu gerçek anlamda düşünen ajanın iki hedefi vardır: bir sürücünün en başta gelen hedefi "çarpışma", ikincisi ise "gitmek istediğim yere git".
  • Sistemleriniz gerçek dünya paralelleri üzerine inşa edilmelidir. Çoğu yolun iki veya daha fazla şeridi olmasının nedeni, bu sistemle trafiği organize etmenin çok daha kolay olması, kimsenin çok fazla düşünmesi gerekmemesidir. Tek şeritli bir senaryoda, sürücüler çeşitli sorunları çözmek zorundadır:

    algılama - birbirinizden kaçınmadıkça sizin ve yaklaşan arabanın çökeceğini bilmek

    tepki - yavaşlama ve bir müzakere aşamasına girme.

    müzakere - sürücülerden biri öncülük etmek zorunda, diğeri vermek zorunda. Buna nasıl karar verileceğine dair kurallar belirsizdir, ancak temelde bir sürücünün keyfi olarak (veya diğer yöne kaç arabanın geldiği konusunda sezgisel bir temel üzerine) öncelik almaya karar verdiği bir şey istersiniz. Örneğin A, 1. sırada öncelik kazanır, B, A'nın öncelik aldığını görür ve verir (yoldan çekilip durdurarak). Hem A hem de B öncelik almaya çalışırsa, ikisi de durmalı, rastgele bir süre beklemeli (veya birbirlerine sinyal vermeli) ve tekrar denemelidir. Sonunda biri diğerine verilecektir.

    Bu uygulamanın güzelliği, yapay kuyrukları veya diğer sahte yapıları koruma ihtiyacını ortadan kaldırmasıdır. Müzakere, gerçek dünya algıları açısından yapılır - her iki taraf da müzakere aşamasındayken, önemli bir ileriye doğru hareket öncelik kazanma çabası olarak kolayca tespit edilir. Ayrıca, iyi sürüş kurallarına uymayacak olan kullanıcıya uygun şekilde tepki vermelidir.

  • En kötüsünü varsayın. Mükemmel bir sistemde bile, garip durumlar ortaya çıkabilir ve aktörleriniz mantıklı davranmalıdır. Bu, oyuncunun müdahale edebilmesi durumunda (yapay olarak alanları kapatabilir, vb.) Daha da olasıdır. Çoğu zaman, tamamen durmak tek mantıklı yanıttır (gridlock!) Yerinde dönme veya açık bir şekilde kırık bir durumda olmak AI'nın başarısızlığıdır. Tamamen durdurmak, en azından gerçek dünya açısından akla yatkındır.

    Aktörünüzün AI'sini basit gerçek dünya mantığına ne kadar yakın modellerseniz, ikna edici AI oluşturmak o kadar kolay olacaktır. Gerçek insanlar hedeflerine ulaşamazlarsa durmazlar ve ileri geri hareket etmezler. AI'nın hedefine giden tek yol engellenirse, bunu tanımalı ve bir yanıt seçmelidirler (tamamen durun, vazgeçip eve sürün, vazgeçip başka bir yere sürün).

  • İstediğinizi elde etmek için katman davranışları. Unutmayın, ilk hedef çökmek değil. Bu nedenle kaçınma (yönlendirme) mantığı sürücünün eylemlerine her zaman hakim olmalıdır. Katman bulma yolundan gelen yönlü mantığın üstünde ('Bir sonraki kavşakta sağa gitmek istiyorum'). Katmanların, daha yüksek düzey mantığı ile yolların ara sıra yeniden değerlendirilmesinin üstünde ('ileri gitmeyi tercih ederim, ancak ilerleme kaydedemezsem, U dönüşü içeren yeni bir yola izin verin').

  • Yol bulma bellekten gelir, ancak durumsal farkındalık algılamaya dayanır. Temsilcilerinizi mükemmel yapmaya çalışmayın. Evlerinden ofise giden yolu biliyorlar, bu yüzden hangisinin dönüş yapacağını biliyorlar. Ama 2 mil ötedeki sokağın engellendiğini bilmiyorlar. Temsilcilerinizi mükemmel bir yol çizmeye çalışmayın, çünkü hiçbiri yoktur - mükemmel başlasa bile, diğer faktörler yollarını engelleyebilir. Temsilcilerin gittikleri yere sadece birkaç sokak planlaması gerekir.

  • Bilgi kalitesi. Davranışlarınız basit olmalı, ancak bunu başarmak için iyi bir sorgu işlevselliğine ihtiyacınız vardır. "Yaklaşan araba şeridimi işgal ediyor mu?", "Kaç araba yaklaşıyor?", "Arkamda herhangi bir araba var mı?", "U dönüşü yapabilir miyim?" .


Ayrıntılı cevabınız için teşekkür ederim. Düzenli karayolu trafiğine geldiğimde tavsiyeleriniz gerçekten yardımcı olacaktır. Ama muhtemelen ilk yazımda iki önemli hususu not etmeyi özledim: 1. Oyuncu trafiğin kendisine katılmıyor. Daha çok bir iş sim'i gibidir ve ağı kurar. 2. Tek yönlü yollar özellikle havalimanlarında meydana gelir, ancak havalimanlarında acenteler "kendi başlarına" değildir, ancak nereye gideceklerini söyleyen bir kuleye sahiptir. Kule zor durumları tanımlamak zorundadır, ama aynı zamanda toplam bilgiye de sahiptir Bu yüzden açıkladığınız durumların / davranışların bir katmanı olduğunu düşünüyorum.
Lunikon

5

Yayınlanan oyunlarda bazı korkunç başarısızlıklar gördükten sonra birkaç önerim var:

1) Aksi takdirde iki şerit yapın ve AI amaçları için normal bir akış yönü için önceliğe sahip olmadıkça - iki yanlı seyahate izin verin, ancak bir şey başka bir şekilde geliyorsa yolun yanlış tarafındaki adam her zaman ona verir.

2) Trafik sıkışıklığını gidermek için bir tür mantık. Trafik sıkışıklığı taşımacılığının sadece birbirine girmeye çalışan ancak bir -> -> <- <- modeliyle karşılaştığında tamamen başarısız olduğu durumları izledim. Buna eğilimli bir haritayı hatırlıyorum - bu, AI üssüne saldırmayı zorlaştırmak için bir işaret noktasıydı, ancak bir saldırı grubu dışarı çıkarken er ya da geç iki kaynak toplayıcı içeri girecekti ve bu buydu. Temas halindeki birimler, bir yol bulmaya çalışırken dönecekti ancak hiçbir yasal hamlesi yoktu. Geri adım atmadı ve ilk önce başka bir birimin hareket etmesi gerektiğini anladı ve böylece AI, birlikte gösterim kaldırılana kadar yararlı bir işlem yapmadı. (Temas halindeki birimlerin etrafında döndüğünü ve başka hiçbir şey yapmadığını izleyebilirsiniz.)

Bunun, sıkışmış bir birimin komşu birimlere yoldan çıkmasını söyleyerek çözülebileceğine inanıyorum - bu, geri çekilebilen sökülmemiş bir birime ulaşana kadar yayılacaktır. Bu, sorun giderilinceye kadar onları uzak tutmak için bir tür mantık içermelidir.

Sadece alternatif bir yol aramanın genellikle kötü bir cevap olduğunu unutmayın. Bu tür bir canlı kilit durumu izledim - A birimi, B'nin önündeki yolu engellediğini ve farklı bir rota kullanmak için döndüğünü not ediyor. Bu artık geri dönen B'nin yolunu engelliyor - şimdi yolun engeli kaldırıldı, bu yüzden her ikisi de tekrar dönüyor. Her turda ileri ve geri hareket arasında geçiş yaparlar.

Aynı oyunun savaş sisi yüzünden farklı bir versiyonunu gördüm. Chokeppoint'te bir düşman birimi vardı. Otomatik hareket halinde, düşman birimini gerçekten hedeflemediği sürece yol bulma kavga etmezdi. İleri gidecek ve yolun tıkandığını görecekti. Daha sonra geri taşındı, artık engelleyiciyi göremiyordu ve tekrar ilerleyecekti. İnsan, gitmesi gereken yere ulaşmadığını fark edene kadar tekrarlayın.


2
İyi cevap - Dışarı çıkabilen herkesin çıkması için 'takılmış' mesajlar yayınlama fikrini seviyorum.
MrCranky

4

Trafik simülasyonları konusunda çok tecrübeli değilim, ama aklıma gelen birkaç şey var.

İlk olarak, darboğazları ilk etapta önlemek için, araçların zıt yönlerde hareket etmesini sağlayan iki şeridim olurdu. aynı "yolda".

İkinci olarak, oluşabilecek çarpışmalar için, sen gerektiğini büyük bir yığını önlemek için bir çarpışma önleyici direksiyon davranışı vardır. Direksiyon davranışları düşük seviyede olabilir, ancak gerçekçi görünen acil davranış yaratmada çok faydalıdır.

Birden fazla şeridiniz olmasını istemiyorsanız, grafikte daha fazla bilgi depolamanız gerekir. Madde A (bir grafiktir kenarı olarak gösterilen) ve ajan B ise, örneğin, A, ters yönde hareket eden aynı yolda daha sonra olacak çarpışır / kilitlenme / Bu davranış ile başa çıkmak için kodlanmış her neyse.

Ancak A aracısı bir yoldaysa, o yolun sahipliğini isteyebilir. Yola sahip olmak, başka hiçbir ajanın bu kenar boyunca hareket edemeyeceği anlamına gelir (bunu, A * bir yol hesaplarken yolu seçmediğinden emin olmak için kenar maliyetini büyük bir sayıya değiştirerek yapabilirsiniz). Daha sonra A ajanı bu yoldan kurtulduğunda, mülkiyeti terk eder.

Dürüst olmak gerekirse, özellikle sevmediğim hacky bir çözüm ve çok şeritli bir yaklaşım kullandığımı gördüğüm çoğu trafik simülasyonu (hepsi değilse de?).


Evet, iki şerit kullanılmalıdır (çünkü sadece iki şerit vardır) ancak bu, yol verme ile ilgili herhangi bir sorunu çözmez (
askerin

4

Direksiyon davranışı hakkında birkaç makale aradığınızı söylediniz, ancak her ihtimale karşı, aşağıdakine baktınız mı?

http://www.red3d.com/cwr/steer/

Değilse, adlandırdığınız bazı sorunları, örneğin darboğaz problemini (Queuing) kapsadığı için size bazı cevaplar sağlayabilir.


0

Sanırım yapmanız gereken bir yol bulma algoritması uygulamak.

Haritanızı olabildiğince küçük parçalara ayırın (kareler söyleyin), ancak yalnızca trafiğin seyahat edeceği geçerli yerler için. Daha sonra aracın nerede ve nereye gittiğini belirlersiniz ve belki de en kısa ya da en doğrudan yolu bulursunuz. Yol, hedefe giden yolun her adımı olan bir dizi kare olacaktır. Daha sonra sadece araçların mevcut pozisyonlarını değil, gelecekte birkaç adım için araçların gelecek pozisyonlarını da hesaplamak istersiniz. Gelecekte iki araç aynı meydanda olacaksa, bunlardan birinin veya her ikisinin hızını değiştirmeniz gerekir.

A * (Bir yıldız), wikipedia'daki psuedo kodunu kolayca dilinize çevirebileceğiniz çok basit bir yol bulma algoritmasıdır ve çalışacaktır: http://en.wikipedia.org/wiki/A*_search_algorithm


4
İlk yazımda bahsettiğim gibi, zaten bir A * algoritması uyguladım ve eşleşen veri yapıları da var. Ayrıca, ajanlardan herhangi birinin hızını azaltmak bana biraz "kolay" geliyor.
Lunikon

Bu bir yol bulma sorunu değil, bir aracı simülasyon sorunu. Yol bulma, aktörlerin uygulamak için ihtiyaç duyduğu en düşük zeka seviyesidir.
MrCranky

Çok kolay? haha. Sürüş sırasında yaptığım şey bu! Mevcut yolumla çarpışmayı tahmin edebilirsem hızımı değiştiririm.
justin.m.chase

Ya trafik ışıkları? Ve yolunuz başka bir araç tarafından engellendiğinde ne yapmalı? Yolunuz ileri gittiğinde ne yapmalı, ancak bir çarpışmayı önlemek için hızınız sıfırdır. Yolunun ileriye doğru gittiğini (sizin aracılığınızla) söylediği ve hızlarının da sıfır olduğu başka bir araba ile çarpışma?
MrCranky

Tek şeritli bir senaryoda, ilk araba çarpışmayı tespit edip durduğunda diğer arabaların hızını gelecek hedeflerini hesaplamak için kullanırsanız, ilk araba hızı şimdi 0 olduğundan diğer arabanın da durması gerekmeyecektir. Uzun şeritli yollarda arabalarla çarpışmaları görmek için yeterince ileriye bakabileceksiniz. Bir arkadaşım, A * algoritmanıza da bir STOP düğümü eklemenizi önerir. Bununla, herhangi bir arabanın bakış açısından, diğer arabaları bir engel olarak görürsünüz. Eğer yeterince uzun yapılırsa durmak yolunuzun engelini kaldırabilir.
justin.m.chase

0

Düşman Milletler'i uyguladığımda son düşüşüm, bir araç 2 saniyeden fazla bir süre sıkışmışsa, onu yolunda ileri atladığımdı. Yani sıkışıp kaldıklarında temelde taşınan bir birim. Hiç kimse şikayet etti, bu yüzden birkaç kez kimsenin izlemediğini ve görmediğini anladım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.