Karınca kolonisi algoritması


13

Ben bir kurs projesi için bir karınca kolonisi simülatörü üzerinde çalışan bir öğrenciyim. Bunun için algoritma (açıkça) bir karınca kolonisi algoritmasıdır. Algoritmanın çeşitli biçimleri olduğunu biliyorum, ancak bunların hepsi bizim için çok matematiksel olarak ayrıntılıydı, bu yüzden sahip olduğumuz bir yaklaşımı aldık:

  • Bir karınca kolonide doğar ve koloniyi sürdürebilmek için bir kaynaktan yiyecek toplaması gerekir.
  • Bütün karıncalar benzer.
  • Karınca hareket ettiği alan 1000x1000 ızgaradır, bu nedenle her ızgara noktası bir karıncanın işgal etmesi için geçerli bir nokta görevi görür. Şimdi, karşılaştığım tüm algoritmalar köşeleri ve kenarları ayrı ayrı ele almayı içeriyor ama karıncaların hareketini sadece dört yöne (yukarı, aşağı, sol, sağ) kısıtladığımız için sanırım feromonu nereye koyduğumuz önemli değil.
  • Yukarıda belirtilen ızgara noktaları feromonu depolar.
  • Bir karınca feromonu sadece yiyecek taşıyorsa düşürür.
  • Bir pozisyondaki (i, j) bir karınca için, bitişik dört düğüm üzerindeki feromon miktarlarını basit bir olasılık formülünde dikkate alarak bir sonraki adımda nereye hareket edileceğine karar verir, yani bir düğüme seyahat etme olasılığı (özellikle bitişik düğümdeki feromon miktarı) / (bitişik 4 düğümdeki feromon miktarlarının toplamı).
  • Bir karınca, geldiği konuma geri dönemez. Bunu ancak yiyeceği olan bir yerde veya kolonisinde ise yapabilir.

Şimdi benim endişem (ve programımızda gerçekte ne oluyor), FIRST bir karınca yiyecek olan ve onu alan bir konuma ulaştığında, algoritmamızın çalışmasıyla, herhangi bir yere hareket edebileceğidir! Çünkü sadece bir feromon izi bırakacak, daha önce değil ve bir kez yiyecek olduğunda ve ilk karınca olduğu için mevcut bir iz yok.

Eğer karınca herhangi bir yere gidebiliyorsa, gıda kaynağına ulaştıktan sonra ulaşan karıncalar da çoğunlukla onu takip etme eğilimindedirler. EĞER koloniye doğru ilerlemiyorsa. Bu, tüm algoritmanın amacını yener.

Yani sorularım

  • Yukarıdaki endişe geçerli mi? Hayır ise neden? Evetse, bununla nasıl başa çıkılır?
  • Algoritmanın gerçekten çalışması için temel anlayışımızda bazı değişiklikler yapmamız gerekiyor mu?
  • Benim gibi yeni başlayanların bu durumda kaçırabileceği diğer ince ama önemli şeyler nelerdir?

1
Bir karınca kolonisi inşa ediyor olsaydım, iki tür feromon izim olurdu: "düzenli", her zaman bir karıncanın gittiği yerde bırakıldı ve "yiyecek", sadece yiyecek taşıyan bir karınca. Bir karınca yiyecek taşıyorsa daha fazla "normal" feromon konsantrasyonuna, aksi takdirde "gıda" işaretlerine doğru hareket eder. Ayrıca karıncaları "aç" ve "doymuş" yapardım; aç bir karınca "gıda" işaretlerine doğru ilerler, ancak yeni gıda kaynakları aramak için "normal" işaretlerden uzağa gider. (Ben de ızgara altıgen yapmak istiyorum, ama mesele bu değil.)
9000

Birçok varyasyon olsa da, karınca kolonisi algoritmalarının çoğunun karıncanın eve geri döndüğünü hatırlayabileceğini düşünüyorum. IOW, daha önce ziyaret ettiği düğümleri biliyor. Feromon rastgele seyahat eden karıncalar için devreye giriyor.
Dunk

Hiç simant oynadın mı?

"Orada algoritmanın çeşitli formları vardır ama biz sahip olduğu bir yaklaşım aldı çok matematiksel olarak bizim için ayrıntılı edildi olanların hepsi ... biliyorum" Çünkü edemezdim olmadığından emin aslında sana verilen görevi yapıyoruz Are t algoritmaları anlamak?
Doval

@ Doval: Sadece bizim seçtiğimiz bir proje yapmak zorundayız. Herhangi bir şekilde bir alanla sınırlı değildik. Elbette C ++ 'da giriş niteliğindedir. Eğitmenlerimiz sadece yazılım geliştirmede deneyim sahibi olmamızı istiyor.
transistör

Yanıtlar:


6

ACO böyle çalışmaz. ACO feromonları ancak karıncalar ızgaradaki tüm noktalara geçtikten sonra düşürür. Daha sonra bir şeyi değerlendirirsiniz (belki de toplam seyahat süresi) ve sonra iyi karıncalar için feromonları düşürür ve tekrarlarsınız.

Genelde aynı tepe noktasına iki kez geçmezler, ancak bunu uygulama özgüllüğü için özelleştirebilirsiniz.

Feromonlar her hareket için düşürülmez, her yere taşındıktan sonra düşer ve hangi karıncaların daha iyi olduğunu belirlemek için bir şey değerlendirilir . Daha iyi olan karıncalar phereomonları düşürürler (belki de en iyi% 25 performans gösteren karıncalar).


ACO - Katılmıyorum olabilir hedefi sorunların çözümü için bir karınca kolonisi (ACO algoritmaları taklit etmektir, özellikle pheremone her adımı bırakarak çalışmak diğer algoritma daha verimli hale getirmeye adımlar atması "Bu karınca kolonisi yok şeydir" den, fakat ille de gerçek karıncalar gibi değil).
Logan Pickup

1

Başkalarından gördüğüm uygulamalar ve kendim için yazdıklarım, karıncaların her zaman yiyeceklere ulaştıktan sonra, yiyecek almak için seyahat ettikleri yol boyunca feromonları serbest bırakmasını sağladı. Yani, karıncalar rastgele bir yürüyüşten sonra kolonilerinden yiyeceklere yürürler; koloniden yiyeceğe giden karıncaların izlediği yollar, ancak karıncalar yemeğe ulaşmada başarılı olduktan sonra feromonlar kullanılarak işaretlenir . Dönüş yolculuğu açıkça simüle edilmemiştir. Genel olarak, birden fazla karınca mevcut iterasyon için herhangi bir feromon biriktirilmeden önce kendi yollarını çalıştırır. Feromonlar başarılı yollar için konuşlandırılır ve yeni bir tur başlar.

Genellikle, karıncanın belirli bir düğüme adım atma oranları, feromon sürelerinin bir miktar "iyilik" ölçüsü tarafından ağırlıklandırılır. Örneğin, iyilik ölçüsü, karınca ve yiyecek arasındaki mesafenin tersi gibi bir şey olabilir - bu, karıncaların önceki feromon tortularına bakılmaksızın yiyeceklere doğru hareket etmeye çalışmasını sağlayacaktır. İyilik diğer faktörleri de hesaba katarak daha da ağırlıklandırılabilir, örneğin bazı düğümlerin içinden geçmek diğerlerinden daha kolay olabilir. Ve enderland'ın işaret ettiği gibi, tipik olarak tüm karıncalar derslerini başarılı bir şekilde yürüttükten sonra "en iyi" yolların sadece bir kısmının feromon birikimi için seçildiği bir yol "seçimi" vardır. Ancak, seçim yapmadan bile makul yollar edinmelisiniz,

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.