Genetik algoritmaların / genetik programlama çözümlerinin iyi örnekleri nelerdir? [kapalı]


227

Genetik algoritmalar (GA) ve genetik programlama (GP) ilginç araştırma alanlarıdır.

GA / GP kullanarak çözdüğünüz belirli sorunları ve kendiniz dönmediyseniz hangi kitaplıkları / çerçeveleri kullandığınızı bilmek istiyorum.

Sorular:

  • Çözmek için GA / GP'yi hangi sorunları kullandınız?
  • Hangi kütüphaneleri / çerçeveleri kullandınız?

İlk elden deneyimler arıyorum, bu yüzden lütfen sahip olmadığınız sürece cevap vermeyin.


28
@ Jason: Google’ı önerdiğiniz için teşekkürler. Biraz yararlı gibi görünse de, özellikle GA / GP deneyimine sahip SO kullanıcılarına hitap ettiği için bu soruya nasıl cevap verebileceğini göremiyorum.
knorv


13
"Yanıtların ... özel uzmanlık tarafından desteklenmesini bekliyoruz ...." Kontrol edin! "[T] sorusu muhtemelen tartışma, tartışmalar, oylama veya genişletilmiş tartışma talep edecektir." Yanlış. Birçok cevap var, ancak bir anket yok ve yorumlarda çok fazla yorum veya tartışma yok. Bu neden kapatıldı?
Adrian McCarthy

Eureqa programı genetik programlama için çok iyidir: nutonian.com/products/eureqa
Simon

Yanıtlar:


146

Ödev değil .

Profesyonel bir programcı olarak ilk işim (1995) S & P500 vadeli işlemleri için genetik algoritma tabanlı otomatik ticaret sistemi yazmaktı. Uygulama Visual Basic 3'te yazılmış [!] Ve VB3 dersleri bile olmadığından o zamanlar nasıl bir şey yaptığımı bilmiyorum.

Uygulama, her biri S & P500 vadeli işlemlerinin dakika dakika fiyat verilerinde belirli bir şekle ve belirli bir düzene karşılık gelen, rastgele oluşturulmuş sabit uzunlukta dizelerden ("gen" kısmı) oluşan bir popülasyonla başladı. (alış veya satış) ve stop-loss ve stop-kâr tutarları. Her dize (veya "gen"), kar performansını 3 yıllık geçmiş verilerle değerlendirdi; belirtilen "şekil" geçmiş verilerle eşleştiğinde, karşılık gelen alış veya satış emrini aldım ve ticaretin sonucunu değerlendirdim. Her genin sabit miktarda para ile başladığı ve böylece potansiyel olarak kırılabileceği ve gen havuzundan tamamen çıkarılabileceği uyarısını ekledim.

Bir popülasyonun her değerlendirmesinden sonra, kurtulanlar rastgele bir şekilde melezlendi (sadece iki ebeveynden bitleri karıştırarak), bir genin üretildiği kârla orantılı bir ebeveyn olarak seçilme olasılığı. Ayrıca şeyleri biraz baharatlamak için nokta mutasyonları olasılığını da ekledim. Bunun birkaç yüz neslinden sonra, ölüm / kırılma şansı olmadan (yaklaşık olarak tarihsel verilerde) ortalama 5000 $ 'a dönüşebilen bir gen popülasyonu ile sonuçlandım.

Ne yazık ki, bu sistemi canlı olarak kullanma şansım olmadı, çünkü patronum geleneksel şekilde 3 aydan kısa bir sürede 100.000 dolara yakın kaybetti ve projeye devam etme isteğini kaybetti. Geriye dönüp bakıldığında, sistemin büyük kazançlar elde edeceğini düşünüyorum - zorunlu olarak doğru bir şey yaptığım için değil, ürettiğim gen popülasyonunun yaklaşık 5 oranında satın alma emirlerine karşı önyargılı olduğu için: 1 oran. Ve 20/20 gezimizle bildiğimiz gibi, pazar 1995'ten sonra biraz yükseldi.


9
"Bence sistem büyük karlar olurdu" - evet bahse girerim backtesting ortamında mükemmel çalıştı ;-)
Joel

30
@Joel: Tabii ki öyle, ama bu yüzden karlı olacağını düşünüyorum. Satış yapmak yerine satın almaya yönelik ağır önyargı nedeniyle para kazanırdı. 1995 ve 1999 yılları arasında rastgele zamanlarda S & P500 vadeli işlemleri satın alan bir sistem (herhangi bir GA saçmalık olmadan) tonlarca para kazanırdı, ama bunu sadece geçmişe baktığımızda biliyoruz.
MusiGenesis

10
Joel muhtemelen "fazla takmaya" atıfta bulunuyordu.
Eric Normand

10
Test için geçmiş verilerinizin bir kısmını ayırmanız gerekir. Çapraz katlama doğrulaması yapmak en iyisidir.
Eric Normand

"Biçim" ile ne demek istiyorsun each of which corresponded to a specific shape in the minute-by-minute price data?
CodyBugstein

89

Bu küçük dünyada yaşayan küçük bir yaratık yaptım. Dünyadan bazı girdiler alan sinir ağı beyinleri vardı ve çıktı diğer eylemler arasında hareket için bir vektördü. Onların beyinleri "genler" dir.

Program rastgele beyinli rastgele bir yaratık popülasyonu ile başladı. Girişler ve çıkış nöronları statikti, ancak aralarında olan şey değildi.

Çevre yiyecek ve tehlikeleri içeriyordu. Yiyecekler enerjiyi arttırdı ve yeterli enerjiniz olduğunda çiftleşebilirsiniz. Tehlikeler enerjiyi azaltacak ve eğer enerji 0 olsaydı öldüler.

Sonunda yaratıklar dünyayı dolaşmak ve yiyecek bulmak ve tehlikelerden kaçınmak için evrimleşti.

Daha sonra küçük bir deney yapmaya karar verdim. Yaratık beyinlerine "ağız" adı verilen bir çıkış nöronu ve "kulak" adı verilen bir giriş nöronu verdim. Başladı ve alanı en üst düzeye çıkarmak için evrimleştiklerini ve ilgili her yaratığın kendi bölümünde kalacağını (sürpriz olarak yerleştirildi) bulmak şaşırdı. Birbirleriyle işbirliği yapmayı ve birbirlerinin yoluna girmemeyi öğrendiler. Her zaman istisnalar vardı.

Sonra ilginç bir şey denedim. Ölü yaratıklar yiyecek olurdum. Ne olduğunu tahmin etmeye çalışın! İki tür yaratık evrimleşti, bunlar sürülerde olduğu gibi saldıranlar ve yüksek kaçınma olanları.

Peki buradaki ders nedir? İletişim işbirliği demektir. Bir başkasına zarar vermek bir şey kazandığınız anlamına gelir getirmez, o zaman işbirliği yok edilir.

Bunun serbest piyasalar ve kapitalizm sistemine nasıl yansıdığını merak ediyorum. Demek istediğim, eğer işletmeler rekabetlerine zarar verebilir ve ondan kurtulabilirlerse , rekabeti incitmek için ellerinden gelen her şeyi yapacakları açıktır.

Düzenle:

Hiçbir çerçeve kullanarak C ++ yazdım. Kendi sinir ağı ve GA kodumu yazdım. Eric, bunun mantıklı olduğunu söylediğin için teşekkür ederim. İnsanlar genellikle GA'nın güçlerine inanmazlar (sınırlamalar açık olmasına rağmen), onunla oynayana kadar. GA basit ama basit değil.

Şüpheliler için, sinir ağlarının birden fazla katmanı varsa herhangi bir işlevi simüle edebildiği kanıtlanmıştır. GA, yerel ve potansiyel olarak küresel minimumları bulan bir çözüm alanında gezinmenin oldukça basit bir yoludur. GA'yı sinir ağlarıyla birleştirdiğinizde, genel sorunlara yaklaşık çözümler bulan işlevleri bulmanın oldukça iyi bir yoluna sahipsiniz. Sinir ağları kullandığımız için, bazı girişler için işlevi optimize ediyoruz, bazıları GA kullandığından bir işleve bazı girişler değil

Hayatta kalma örneği için demo kodu: http://www.mempko.com/darcs/neural/demos/eaters/ Yapım talimatları:

  • Darcs, libboost, liballegro, gcc, cmake, make yükleyin
  • darcs clone --lazy http://www.mempko.com/darcs/neural/
  • cd neural
  • cmake .
  • make
  • cd demos/eaters
  • ./eaters

Önizleme Oyun Yiyenler


10
Ve bu hikayeyle birlikte Turing ödülünüz nerede? RoadRunner'dan başka bir şey üzerinde bile böyle bir denemenin yapılabilmesi için bilimde çılgın ilerlemeler yapmış olmalısınız.
San Jacinto

1
Eric ile aynı fikirde. Basit bir NN'yi bir saatten az bir sürede yazabilirsiniz (ve aslında, bir sınavda yaptım) ve temel bir GA mutlaka bir veya iki günden fazla çalışma gerektirmez. Bu bir genetik algoritmadan ziyade bir A-Life algoritmasıdır, ancak hala burada çok basit ve uygulanabilir şeyler konuşuyoruz.
Kylotan

2
Bu en ufak bir sahte değil ... Birinci sınıfımdan sonra, C # 'da XNA kullanarak buna benzer eğlenceler için bir proje yaptım, sinirsel ağları, GA'ları ve sayısız değişken özellikli bir yaratık popülasyonunu ekledim . Örneğin, bir gen görme-kontrol ettikleri daha yüksek görme, daha düşük görme, daha geniş görme yarıçapı anlamına geliyordu. Engeller ve yiyecekler rastgele yerleştirilecek ve yaratıklar yiyecekleri yiyerek enerjilerini dolduracaklardı. Özellikler, rastgele evrimleşmiş Gauss sayıları eklenerek mutasyona uğrayarak normal evrimde olduğu gibi normal olarak dağılmış genlerle sonuçlanır.
Philip Guin

2
Bu tür bir şeyin (ALife) insanların her gün yaptığı şey olduğu bir araştırma grubunda çalışıyorum. Hikayeniz tamamen inandırıcı ve dürüst olmak gerekirse, herkesin bunun sahte olduğunu düşündüğünü görmek için biraz şok oldum. Sonra tekrar, genellikle bunları yapmanın amacı, karmaşık davranışın çok basit sistemlerden kaynaklanabileceğine işaret etmektir - sanırım bu nokta yeterince iyi yapılmamıştır.
Lucas

1
Web sitesinde bazı kanıtlar buldum: www.mempko.com/darcs/neural "Küçük bir dünyada hayatta kalmak için evrimleşen küçük adamlara temiz bir örnek verdim." Örnek kod şöyledir
guerda

51

Ocak 2004'te, ilk ticari e-mürekkep için elektronik üreten Philips Yeni Ekran Teknolojileri, Amazon Kindle ve diğerleri ABD'de pazara girmeden yıllar önce Japonya'da piyasaya sürülen Sony Librie ile iletişime geçtim. bir Avrupa.

Philips mühendislerinin büyük bir sorunu vardı. Ürünün pazara girmesinden birkaç ay önce, sayfaları değiştirirken hala ekranda gölgeleniyorlardı. Sorun elektrostatik alanı yaratan 200 itici güçtü. Bu sürücülerin her birinin, sıfır ile 1000 mV arasında bir değere ayarlanması gereken belirli bir voltajı vardı. Fakat bunlardan birini değiştirirseniz, her şeyi değiştirir.

Bu nedenle, her bir sürücünün voltajını ayrı ayrı optimize etmek söz konusu değildi. Olası değer kombinasyonlarının sayısı milyarlarca idi ve özel bir kameranın tek bir kombinasyonu değerlendirmesi yaklaşık 1 dakika sürdü. Mühendisler birçok standart optimizasyon tekniğini denemişlerdi, ancak hiçbir şey yaklaşmayacaktı.

Baş mühendis benimle temasa geçti çünkü daha önce açık kaynak topluluğuna bir Genetik Programlama kütüphanesi yayınlamıştım. GP / GA'ların yardımcı olup olmayacağını ve katılıp katılamayacağımı sordu. Yaptım ve yaklaşık bir ay boyunca birlikte çalıştık, GA kütüphanesini sentetik veriler üzerine yazıp ayarladım ve onu sistemlerine entegre ettim. Sonra, bir hafta sonu gerçek şeyle canlı yayınlamasına izin verdiler.

Ertesi Pazartesi, GA'nın bulduğu muhteşem sonuçlara kimsenin nasıl inanamayacağı konusunda kendisinden ve donanım tasarımcılarından bu parlak e-postaları aldım. Bu oydu. O yılın ilerleyen saatlerinde ürün piyasaya çıktı.

Bunun için bir kuruş bile alamadım, ama 'övünme' haklarına sahibim. Başından beri zaten bütçenin üzerinde olduklarını söylediler, bu yüzden üzerinde çalışmaya başlamadan önce anlaşmanın ne olduğunu biliyordum. Ve GA'ların uygulamaları için harika bir hikaye. :)


23
"Bütçe üzerinde" bir şey phoney. Tabii ki size ödemek için para vardı ama değil seçti. Bu gerçekten de büyük işletmelerin nasıl güzel programcılardan faydalanabileceğini gösteriyor.
Martin Capodici

50

Düğün resepsiyonumda oturma atamalarını optimize etmek için bir GA kullandım. 10 masada 80 misafir. Değerlendirme işlevi, insanları tarihleriyle tutmaya, ortak bir şeyleri olan insanları bir araya getirmeye ve aşırı zıt görüşlere sahip insanları ayrı masalarda tutmaya dayanıyordu.

Birkaç kez koştum. Her seferinde dokuz iyi masa ve bir tane de tek tuhaf toplar aldım. Sonunda, eşim oturma ödevleri yaptı.

Gezgin satıcı optimize edicim, kromozomun rotasına yeni bir eşlemesi kullandı;

Güncelleme : Çünkü birkaç kişi nasıl olduğunu sordu ...

Bir dizi misafirle (veya şehirle), örneğin alfabetik olarak gelişigüzel ama tutarlı bir sıralamayla başlayın. Buna referans çözüm deyin. Bir konuğun dizinini koltuk numarası olarak düşünün.

Bu sıralamayı doğrudan kromozomda kodlamaya çalışmak yerine, referans çözeltiyi yeni bir çözüme dönüştürmek için talimatları kodlarız. Özellikle, kromozomları değiş tokuş edilecek dizideki dizin listesi olarak ele alıyoruz. Bir kromozomun kodunu çözmek için referans çözeltisi ile başlar ve kromozom tarafından belirtilen tüm swapları uygularız. Dizideki iki girişin değiştirilmesi her zaman geçerli bir çözümle sonuçlanır: her misafir (veya şehir) yine de tam olarak bir kez görünür.

Böylece kromozomlar rastgele üretilebilir, mutasyona uğrayabilir ve başkalarıyla çaprazlanabilir ve her zaman geçerli bir çözüm üretecektir.


ve bu yeni haritalama neydi?
Manuel Aráoz

4
@Manuel: Turu doğrudan "kromozom" içinde kodlamak yerine, bir referans turunu çözüme dönüştüren bir dönüşümü kodladım. Dönüşümler sadece endeksteki şehirler arasındaki değiş tokuşlardır. Böylece herhangi bir şekilde yeniden birleştirilebilirler ve yine de her şehri tam olarak bir kez ziyaret eden bir tur oluştururlar.
Adrian McCarthy

Teşekkürler! Takas yönü ile biraz kafam karıştı. Her kromozom, değiştirilecek bir indeks listesi kodlar - bu, bir indeksin kromozomda birden fazla görünebileceği anlamına gelmez mi?
user3019612

1
Kromozom c1, c2, c3, ..., cn dizinlerine sahiptir. "Çözüm" a dizisidir. Referans listenizle a başlatın. Daha sonra, kromozomdaki her bir indeks çifti için, çözelti ( temp = a[c1]; a[c1] = a[c2]; a[c2] = temp) içindeki iki elementi değiştirin . İki dizinin aynı olup olmadığı önemli değildir, çünkü her misafir (veya şehri) tam olarak bir kez içerecektir.
Adrian McCarthy

33

Altın çiftçilerinin MMO'ları ödemek için çalıntı kredi kartlarını kullanmalarını engellemeye çalışan bir risk yönetim sistemi için en iyi ayarları belirlemek için genetik algoritmalar (bazı ilgili teknikler) kullandım. Sistem "bilinen" değerlerle (dolandırıcılık ya da değil) birkaç bin işlem gerçekleştirecek ve çok fazla yanlış pozitif olmadan dolandırıcılık işlemlerini doğru bir şekilde tanımlamak için en iyi ayar kombinasyonunun ne olduğunu anlayacaktır.

Bir işlemin her biri bir değer verilen ve toplanan birkaç düzine (boolean) özellik hakkında verilerimiz vardı. Toplam bir eşik değerden yüksekse işlem sahtekarlıktı. GA, çok sayıda rastgele değer kümesi oluşturacak, bunları bilinen bir veri topluluğuna göre değerlendirecek, en iyi skorlananları seçecek (hem sahtekarlık tespiti hem de yanlış pozitiflerin sayısını sınırlandıracak), her nesil yeni nesil adaylar üretmek için. Belli sayıda neslin ardından en iyi puanlama değeri kazananı sayıldı.

Test etmek için bilinen verilerin birliğini oluşturmak, Aşil'in topuğu idi. Ters ibrazları beklediyseniz, dolandırıcılara yanıt vermeye çalışırken birkaç ay geride kaldınız, bu nedenle birisinin çok fazla beklemek zorunda kalmadan veri topluluğunu oluşturmak için çok sayıda işlemi manuel olarak incelemesi gerekir.

Bu, gelen sahtekarlığın büyük çoğunluğunu belirledi, ancak en dolandırıcılık eğilimli eşyalarda% 1'in altına düşemedi (gelen işlemlerin% 90'ının sahtekarlık olabileceği göz önüne alındığında, bu oldukça iyi gidiyordu).

Bütün bunları perl kullanarak yaptım. Oldukça eski bir linux kutusundaki yazılımın bir çalıştırılmasının çalışması 1-2 saat sürer (bir WAN bağlantısı üzerinden veri yüklemek için 20 dakika, geri kalan süre çatırdamak için). Herhangi bir jenerasyonun boyutu mevcut RAM ile sınırlıydı. Özellikle iyi bir sonuç kümesi arayan parametrelerde küçük değişiklikler yaparak tekrar tekrar çalıştırırdım.

Sonuçta, düzinelerce sahtekarlık göstergesinin göreli değerlerini elle ayarlamaya çalışırken gelen gaff'lardan bazılarından kaçındı ve sürekli olarak elle oluşturabildiğimden daha iyi çözümler üretti. AFAIK, hala kullanımda (yazdıktan yaklaşık 3 yıl sonra).


Ben parametre tweaking yapmak için bir sinir ağı kullanılmış olabilir düşünüyorum (ancak elle yapmaktan daha etkili olması daha uzun sürer).
alexpinho98

21

Futbol Bahşiş. AFL'deki (Aussie Rules Football) oyunların haftadan haftaya sonucunu tahmin etmek için bir GA sistemi oluşturdum.

Birkaç yıl önce standart çalışma futbol havuzundan sıkıldım, herkes çevrimiçi olmaya başladı ve basında bazı punditlerden seçti. Yani, bir sürü yayın gazeteciliği dalını yenmenin çok zor olmadığını düşündüm, değil mi? İlk düşüncem Massey Ratings'in sonuçlarını almak ve sezon sonunda şöhret ve zafer kazandıktan sonra stratejimi ortaya çıkarmaktı. Ancak Massey'i daha önce hiç keşfetmediğim nedenlerden dolayı AFL'yi izlemiyor. İçimdeki alaycı, bunun her AFL oyununun sonucunun temelde rastgele bir şans haline geldiğine inanıyor, ancak son kural değişiklikleriyle ilgili şikayetlerim farklı bir foruma ait.

Sistem temel olarak hücum gücü, savunma gücü, ana saha avantajı, haftadan haftaya iyileştirme (veya eksikliği) ve bunların her birindeki değişikliklerin hızını dikkate aldı. Bu, sezon boyunca her takım için bir dizi polinom denklemi yarattı. Belirli bir tarihteki her maçın kazananı ve skoru hesaplanabilir. Amaç, tüm geçmiş oyunların sonuçlarına en yakın eşleşen katsayıları bulmak ve gelecek hafta oyununu tahmin etmek için bu seti kullanmaktı.

Uygulamada, sistem geçmiş oyun sonuçlarının% 90'ından fazlasını doğru şekilde tahmin eden çözümler bulacaktır. Daha sonra, önümüzdeki hafta için oyunların yaklaşık% 60-80'ini seçecektir (bu, eğitim setinde olmayan haftadır).

Sonuç: paketin ortasının hemen üzerinde. Büyük bir para ödülü veya Vegas'ı yenmek için kullanabileceğim bir sistem yok. Gerçi eğlenceliydi.

Her şeyi sıfırdan inşa ettim, çerçeve kullanılmadı.


21

Gezgin Satıcı ve Roger Alsing'in Mona Lisa programındaki bir çeşitlilik gibi bazı ortak sorunların yanı sıra, evrimsel bir Sudoku çözücü de yazdım (bu da benim için sadece yeniden uygulamak yerine biraz daha orijinal bir düşünce gerektiriyordu) başka birinin fikri). Sudokus'u çözmek için daha güvenilir algoritmalar var, ancak evrimsel yaklaşım oldukça iyi çalışıyor.

Son birkaç gündür Reddit'teki bu makaleyi gördükten sonra poker için "soğuk güverte" bulmak için evrimsel bir programla oynuyorum . Şu anda pek tatmin edici değil ama sanırım geliştirebilirim.

Ben kendi çerçevesini ben evrimsel algoritmalar için kullandıkları.


17

Şirketimin 1992 yılında nakliye endüstrisi için geliştirdiği bir 3D lazer yüzey profil sistemi için bir ev demleme GA geliştirdim. Sistem 3 boyutlu üçgenleme dayanarak özel bir lazer çizgi tarayıcı, 512x512 kamera (özel yakalama hw ile) kullandı. Kamera ve lazer arasındaki mesafe hiçbir zaman kesin olmayacaktı ve kameraların odak noktası olmasını beklediğiniz 256,256 konumunda bulunamadı!

Kalibrasyon parametrelerini standart geometri ve simüle tavlama tarzı denklemi çözme kullanarak denemek ve çözmek kabustu.

Genetik algoritma bir akşam çırpıldı ve test etmek için bir kalibrasyon küpü oluşturdum. Küp boyutlarını yüksek doğrulukta biliyordum ve bu nedenle, GA'mın, her bir tarama birimi için üretim varyasyonlarını aşacak bir dizi özel üçgenleme parametresi geliştirebileceği fikriydi.

Hile bir tedavi yaptı. Az söylemek flabbergasted oldu! Yaklaşık 10 kuşak içinde benim 'sanal' küpüm (ham taramadan üretildi ve kalibrasyon parametrelerinden yeniden oluşturuldu) aslında bir küp gibi görünüyordu! Yaklaşık 50 nesil sonra ihtiyacım olan kalibrasyonu aldım.


11

Evinizi boyamayı planlarken tam bir renk kombinasyonu elde etmek genellikle zordur. Genellikle, aklınızda bir renk var, ancak renklerden biri değil, satıcı size gösteriyor.

Dün, GA araştırmacısı olan Prof., Almanya'daki gerçek bir hikayeden bahsetti (özür dilerim, başka referansım yok, evet, herhangi biri talep ederse öğrenebilirim). Bu adam (ona renk adamı diyelim ) , müşterinin aklındaki şeylerin dolabının tam renk kodunu ( RGB'de ) bulmalarına yardımcı olmak için kapı kapısından giderdi. İşte böyle yapardı:

Renk adam onunla GA kullanılan bir yazılım programı taşırdım. Her biri kodlanmış bir Kromozom olarak kodlanan 4 farklı renkle başlardı (kodu çözülen değeri RGB değeri olurdu). Tüketici 4 rengin 1'ini seçer (Aklındaki en yakın renktir). Program daha sonra o kişiye maksimum uygunluğu atayacak ve mutasyon / çaprazlama kullanarak bir sonraki nesle geçecektir . Yukarıdaki adımlar, tüketici tam rengi bulana ve renk adamına RGB kombinasyonunu söylemek için kullanılana kadar tekrarlanacaktır !

Renge maksimum uyum sağlayarak, tüketicinin aklında olana kapanır, renk adamının programı renge dönüşme şansını arttırır, tüketici tam olarak aklınızdadır. Oldukça eğlenceli buldum!

Şimdi -1'e sahibim, eğer daha fazla -1 planlıyorsanız, lütfen. bunun nedenini açıklayın!


6
Seni küçümsemeyeceğim, ama bunu kendin yapmadığın için tahmin ediyorum. OP özellikle sizin yaptığınız şeyleri sordu.
jprete

Bu, Richard Dawkins'in biyomorflarının neredeyse basitleştirilmiş bir versiyonudur.
Nick Johnson

1
Renk hakkında komik olan şey, onu tek başına düşünemezsiniz. Renk danışmanları sadece bir renkle ortaya çıkmaz - paletler ve şemalar halinde gelirler. Tek başına bir renk seçmenin bir anlamı yok. Ben aldatmadım ama cevabınız GA tanımını genişletiyor. Bir rengi nasıl değiştirirsiniz / dönüştürürsünüz? Bu daha dürüst olmak gerekirse, sınırlı bir veri kümesini yinelemeli olarak daraltmanın bir göstergesidir.
Kirk Broadhurst

2
Bu belki downvotes açıklar: bu GA değil, tepe tırmanma gibi görünüyor.
Eric Normand

8

Birkaç hafta önce, grafik düzeni problemini çözmek için genetik algoritmalar kullanarak SO'ya bir çözüm önerdim. Kısıtlı optimizasyon problemine bir örnektir.

Ayrıca makine öğrenimi alanında, c / c ++ 'da sıfırdan GA tabanlı bir sınıflandırma kuralları çerçevesi uyguladım.
Ayrıca GA'yı ünlü backpropagation algoritmasını kullanmak yerine yapay sinir ağlarını (YSA) eğitmek için örnek bir projede kullandım .

Buna ek olarak ve lisansüstü araştırmamın bir parçası olarak, GA'yı Gizli Markov Modelleri eğitiminde EM tabanlı Baum-Welch algoritmasına ek bir yaklaşım olarak kullandım (tekrar c / c ++ 'da).


Merhaba Amro. Backprop ve GA ile elde edilen sonuçlar arasında tam bir karşılaştırma yaptınız mı? Eğer öyleyse, karşılaştırma sonuçlarını bizimle paylaşabilir misiniz? İki NN için geçiş adımını nasıl uyguladınız?
lmsasu

@lmsasu: süslü bir şey yok: popülasyondaki her bir dize veya kromozom, ağın ağırlık ve sapma değerlerini temsil eder ve basit bir 1 veya 2 noktalı çapraz operatör kullanılmıştır. Hatırladığım kadarıyla, ağın GA kullanarak eğitim alması uzun sürdü. Uygulamam her şeyden çok bir kavram kanıtıydı ( sanal mayın taramalarını kontrol etmek için oyuncak bir örnek için buraya bakın ) ... Her neyse, orada sadece ağırlıkları öğrenmek için değil, aynı zamanda gelişmek için GA'nın kullanımını tartışan çok sayıda makale olmalı. ağ yapısı.
Amro

8

Lisans CompSci derecemin bir parçası olarak, Jikes araştırma sanal makinesi için en uygun jvm bayraklarını bulma sorunu verildi. Bu, konsola bir süre döndüren Dicappo karşılaştırma paketi kullanılarak değerlendirildi. Sonuçları etkileyen donanım titremesini telafi etmek günler sürse de, karşılaştırma paketinin çalışma zamanını iyileştirmek için bu bayrakları değiştiren dağıtılmış bir gentic athmirms yazdım. Tek sorun, derleyici teorisini (ödevin amacı olan) düzgün bir şekilde öğrenmememdi.

Var olan varsayılan bayraklarla ilk popülasyonu tohumlayabilirdim, ancak ilginç olan şey, algoritmanın O3 optimizasyon seviyesine çok benzer bir konfigürasyon bulmasıydı (ancak birçok testte aslında daha hızlıydı).

Düzenleme: Ayrıca ödev için Python kendi genetik algoritma çerçeve yazdı ve değerlendirilen bir atama olmasaydı ben pyEvolve bakardı olsa da, sadece çeşitli kriterleri çalıştırmak için popen komutları kullanılır.


7

İlk olarak, Jonathan Koza'nın ( amazon'da ) "Genetik Programlama" hemen hemen birçok örnekle genetik ve evrimsel algoritma / programlama teknikleri kitabı. Kesinlikle kontrol etmenizi öneririz.

Kendi genetik algoritmamı kullanmama gelince, bir nesne toplama / imha senaryosu için bir sürü algoritması geliştirmek için (evde yetiştirilen) bir genetik algoritma kullandım (pratik amaç mayın tarlasını temizlemek olabilirdi). İşte makaleye bir bağlantı . Yaptığım şeylerin en ilginç kısmı, basit fitness fonksiyonları, genetik algoritmanın popülasyonun üyeleri arasında yeterince ayrılması için yeterli bilgi sağlamadığı için çok aşamalı fitness fonksiyonuydu.


Koza'nın GP'deki serisi çok yoğundur ve belki de GP'de yeni olan biri için değil. Riccardo Poli'nin Genetik Programlama Alan Kılavuzu (ücretsiz html kopyası olarak mevcuttur) veya Melanie Mitchell tarafından Genetik Algoritmalara Giriş
Kimse

7

Varolan programlardaki hataları otomatik olarak düzeltmek için Evrimsel Hesaplama (EC) kullanımını araştıran bir ekibin parçasıyım. Gerçek dünya yazılım projelerinde bir takım gerçek hataları başarıyla onardık ( bu projenin ana sayfasına bakın ).

Bu AT onarım tekniğinin iki uygulaması var.

  • Birincisi ( proje sayfasında mevcut olan kod ve çoğaltma bilgileri ) mevcut C programlarından ayrıştırılan soyut sözdizimi ağaçlarını geliştirir ve Ocaml'de kendi özel EC motorumuz kullanılarak uygulanır.

  • İkincisi ( proje sayfasından ulaşılabilen kod ve çoğaltma bilgileri ), projeye kişisel katkım, bir dizi programlama dilinde yazılmış programlardan derlenen x86 derlemesini veya Java bayt kodunu geliştirir. Bu uygulama Clojure'da uygulanır ve ayrıca kendi özel inşa edilmiş EC motorunu kullanır.

Evrimsel Hesaplamanın güzel bir yönü, tekniğin basitliği, kendi özel uygulamalarınızı çok fazla zorluk çekmeden yazmanızı mümkün kılmasıdır. Genetik Programlama hakkında serbestçe kullanılabilen iyi bir giriş metni için Genetik Programlama Alan Kılavuzu'na bakınız .


6

Bir iş arkadaşı ve ben, şirketimizin ihtiyaç duyduğu çeşitli kriterleri kullanarak kamyonlara yük yüklemek için bir çözüm üzerinde çalışıyoruz. Agresif budama ile Branch And Bound kullanırken Genetik Algoritma çözümü üzerinde çalışıyorum. Hâlâ bu çözümü uygulama sürecindeyiz, ancak şu ana kadar iyi sonuçlar alıyoruz.


5

Birkaç yıl önce daha iyi tanıma oranları için ASR (otomatik konuşma tanıma) gramerlerini optimize etmek için ga'ları kullandım. Oldukça basit seçenek listeleriyle başladım (burada ga, her yuva için olası terimlerin kombinasyonlarını test ediyordu) ve daha açık ve karmaşık gramerlere kadar çalıştım. Uygunluk, bir tür fonetik mesafe fonksiyonu altında terimler / sekanslar arasındaki ayrımın ölçülmesi ile belirlenmiştir. Ayrıca, daha kompakt bir temsile derlenmiş olanı bulmak için bir gramer üzerinde zayıf eşdeğer varyasyonlar yapmayı denedim (sonunda doğrudan bir algoritma ile gittim ve uygulamalarda kullanabileceğimiz "dilin" boyutunu önemli ölçüde artırdı) .

Daha yakın zamanlarda bunları çeşitli algoritmalardan üretilen çözümlerin kalitesini test etmek için varsayılan bir hipotez olarak kullandım. Bu, büyük ölçüde kategorileştirmeyi ve farklı türden uyuşma problemlerini içermektedir (yani, bir veri seti (ler) üzerinde gözden geçirenler tarafından yapılan bir dizi seçeneği açıklayan bir "kural" oluşturmak).


4

Birçok sorunu çözmek için "GALAB" adlı eksiksiz bir GA çerçevesi yaptım:

  • çakışma ve boş yerleri azaltmak için GSM ANT'lerinin (BTS) bulunması.
  • Kaynak kısıtı proje çizelgelemesi.
  • Evrimsel resim yaratma. ( Evopic )
  • Gezgin satıcı sorunu.
  • N-Queen ve N-Color sorunları.
  • Knight'ın turu ve sırt çantası problemleri.
  • Sihirli kare ve Sudoku bulmaca.
  • Süper sicim problemine dayalı dize sıkıştırma.
  • 2D Ambalaj sorunu.
  • Küçük yapay yaşam APP.
  • Rubik bulmaca.

Evet, kaynağı GA kitabımda yayınlandı .
MShams

4

Bir keresinde bellek adresleri için bir karma işlevini optimize etmek için bir GA kullandım. Adresler 4K veya 8K sayfa boyutundaydı, bu nedenle adresin bit deseninde bazı öngörülebilirlik gösterdiler (en az önemli bitlerin hepsi sıfır; orta bitler düzenli olarak artar, vb.) Orijinal karma işlevi "tıknaz" idi - küme isabetlerine eğilimliydi her üçüncü karma kovasında. Geliştirilmiş algoritma neredeyse mükemmel bir dağılıma sahipti.


3

Ödevlerin önemli olup olmadığını bilmiyorum ...

Çalışmalarım sırasında Gezgin Satıcı sorununu çözmek için kendi programımızı uyguladık.

Fikir, çeşitli kriterler (problemi haritalamakta güçlük, performans vb.) Bir karşılaştırma yapmaktı ve Simüle tavlama gibi diğer teknikleri de kullandık .

Oldukça iyi çalıştı, ancak 'üreme' aşamasının doğru bir şekilde nasıl yapılacağını anlamamız biraz zaman aldı: Eldeki problemi Genetik programlama için uygun bir şeye modellemek gerçekten en zor kısım olarak beni etkiledi ...

Sinir ağları ve benzerleriyle de uğraştığımız için ilginç bir kurstu.

Kimse bu tür bir programlama 'üretim' kodu kullanıp kullanmadığını bilmek istiyorum.


3

Müziğin çalındığı sırada frekans spektrumundan faydalı kalıpları çıkarmak için basit bir GA oluşturdum. Çıktı bir winamp eklentisinde grafik efektleri çalıştırmak için kullanıldı.

  • Giriş: birkaç FFT çerçeve (2 boyutlu bir dizi yüzen düşünün)
  • Çıktı: 0,0 veya 1,0 eşik değerinde tekli şamandıra değeri (girdilerin ağırlıklı toplamı)
  • Genler: giriş ağırlıkları
  • Fitness fonksiyonu: mantıklı aralıkta görev döngüsü, darbe genişliği ve BPM kombinasyonu.

Spektrumun farklı kısımlarına ve farklı BPM sınırlarına ayarlanmış birkaç GA'm vardı, bu yüzden aynı kalıba yaklaşma eğilimi göstermediler. Her popülasyondan ilk 4'ten gelen çıktılar oluşturma motoruna gönderildi.

İlginç bir yan etki, popülasyondaki ortalama uygunluğun müzikteki değişiklikler için iyi bir gösterge olmasıydı, ancak bunu anlamak genellikle 4-5 saniye sürdü.


3

Tezimin bir parçası olarak evrimsel kavramları kullanan bir GA olan çok amaçlı optimizasyon algoritması mPOEMS (evrimleşmiş iyileştirme adımlarıyla çok amaçlı prototip optimizasyonu) için genel bir java çerçevesi yazdım. Tüm problemden bağımsız parçaların probleme bağlı parçalardan ayrıldığı bir şekilde jeneriktir ve bir arayüz sadece probleme bağlı parçaların eklenmesiyle çerçeveyi kullanacak şekilde temin edilir. Böylece algoritmayı kullanmak isteyen kişinin sıfırdan başlaması gerekmez ve çalışmayı çok kolaylaştırır.

Kodu burada bulabilirsiniz .

Bu algoritma ile bulabileceğiniz çözümler, bilimsel bir çalışmada, en son teknoloji SPEA-2 ve NSGA algoritmaları ile karşılaştırılmıştır ve algoritmanın, sizin ölçümlerinize bağlı olarak karşılaştırılabilir veya daha iyi performans gösterdiği kanıtlanmıştır performansı, özellikle de aradığınız optimizasyon problemine bağlı olarak ölçün.

Burada bulabilirsiniz .

Ayrıca tezimin ve çalışma kanıtımın bir parçası olarak bu çerçeveyi portföy yönetiminde bulunan proje seçim problemine uyguladım. Bu, şirkete en fazla katma değer sağlayan, şirketin stratejisinin çoğunu destekleyen veya diğer herhangi bir keyfi hedefi destekleyen projeleri seçmekle ilgilidir. Örneğin, belirli bir kategoriden belirli sayıda projenin seçilmesi veya proje sinerjilerinin en üst düzeye çıkarılması, ...

Bu çerçeveyi proje seçim problemine uygulayan tezim: http://www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf

Bundan sonra, servet 500'den birinde bir portföy yönetimi bölümünde çalıştım ve burada proje seçim problemine / portföy optimizasyonuna GA uygulayan ticari bir yazılım kullandılar.

Diğer kaynaklar:

Çerçevenin belgeleri: http://thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf

mPOEMS sunum kağıdı: http://portal.acm.org/citation.cfm?id=1792634.1792653

Aslında biraz coşkuyla, herkes genel çerçevenin kodunu keyfi çok amaçlı bir optimizasyon problemine kolayca uyarlayabilir.


2

İş yerinde şu sorun yaşadım: M görevleri ve N DSP'ler verildiğinde, DSP'lere görev atamanın en iyi yolu neydi? "En iyi", "en yüklü DSP'nin yükünü en aza indirme" olarak tanımlandı. Farklı görev türleri vardı ve çeşitli görev türlerinin atandıkları yere bağlı olarak çeşitli performans sonuçları vardı, bu yüzden işten DSP'ye atama kümesini "DNA dizesi" olarak kodladım ve sonra "üremek" için genetik bir algoritma kullandım yapabileceğim en iyi atama dizesi.

Oldukça iyi çalıştı (her olası kombinasyonu değerlendirmek olan önceki yöntemimden çok daha iyi ... önemsiz olmayan sorun boyutlarında, tamamlanması yıllar alacaktı!), Tek sorun, anlatmanın bir yolu olmadığıydı optimal çözüme ulaşılıp ulaşılmadığı. Sadece mevcut "en iyi çabanın" yeterince iyi olup olmadığına karar verebilir veya daha iyisini yapıp yapamayacağını görmek için daha uzun süre çalışmasına izin verebilirsiniz.


2

Çözülemeyen bir sudoku çözmesi gereken codechef.com'da (bu arada harika bir site, aylık programlama yarışmaları) bir rekabet vardı (mümkün olduğunca az sayıda yanlış sütun / satır / vb. İle mümkün olduğunca yakın gelmelidir).

Yapacağım şey, önce mükemmel bir sudoku üretmek ve sonra verilen alanları geçersiz kılmaktı. Bu oldukça iyi temelden çözümümü geliştirmek için genetik programlama kullandım.

Bu durumda belirleyici bir yaklaşım düşünemedim, çünkü sudoku 300x300 idi ve arama çok uzun sürecekti.


2

İkili bir dize olarak temsil edilen bir dalganın sinyal / gürültü oranını optimize etmek için basit bir genetik algoritma kullandım. Bitleri birkaç milyon nesil boyunca belirli şekillerde çevirerek, o dalganın daha yüksek sinyal / gürültü oranıyla sonuçlanan bir dönüşüm üretebildim. Algoritma ayrıca "Simüle Tavlama" olabilirdi, ancak bu durumda kullanılmadı. Özünde, genetik algoritmalar basit ve bu gördüğüm bir kullanım örneği kadar basitti, bu yüzden nesil oluşturma ve seçim için bir çerçeve kullanmadım - sadece rastgele bir tohum ve Sinyal-Gürültü Oranı eldeki işlev.


2

Okuldaki bir seminerde, müzik moduna dayalı müzik üretmek için bir uygulama geliştiriyoruz. Program Java ile oluşturuldu ve çıktı şarkı ile bir midi dosyası oldu. Müziği oluşturmak için GA'nın farklı yaklaşımlarını kullanıyoruz. Bu programın yeni besteleri araştırmak için yararlı olabileceğini düşünüyorum.


Harika Benzer bir şey denedim: bağlantı
Todor Balabanov

2

lisansta, NERO'yu (sinir ağı ve genetik algoritmanın bir kombinasyonu) akıllı kararlar almak için oyun içi robotları öğretmek için kullandık. Çok güzeldi.


2

Gıda kaynakları ve madenlerin bir dizi randomize ızgara arazisi aracılığıyla çok yönlü bir salınım tabanlı robot navigasyonu simülasyonu geliştirdim ve robotik bir kromozom için robotik davranışın optimizasyonunu ve en uygun genlerin hayatta kalmasını araştırmak için genetik algoritmaya dayalı bir strateji geliştirdim. Bu, her bir yineleme döngüsünün grafiği ve haritalaması kullanılarak yapıldı.

O zamandan beri daha da fazla oyun davranışı geliştirdim. Son zamanlarda kendim için oluşturduğum bir örnek uygulama, başlangıç ​​ve hedef durumlarının yanı sıra bir / birden fazla bağlantı noktası, gecikme, iptal, inşaat işleri, acele saati, kamu grevleri, en hızlı ve en ucuz güzergahlar arasında düşünün. Ardından, belirli bir günde rotanın izlenmesi için dengeli bir öneri sunar.

Genel olarak benim stratejim POJO tabanlı genlerin temsilini kullanmak, daha sonra seçim, mutasyon, geçiş stratejileri ve kriterler için belirli arayüz uygulamaları uyguluyorum. Fitness fonksiyonum, temelde sezgisel bir önlem olarak uygulamak zorunda olduğum strateji ve kriterlere göre oldukça karmaşık bir hale geliyor.

Ayrıca, algoritmanın mantığı anladığı ve kod düzeltmeleri için öneriler içeren bir hata raporu belirlemeye çalıştığı sistematik mutasyon döngülerini kullanarak kod içindeki otomatik teste genetik algoritma uygulanmasına baktım. Temel olarak, kodumu optimize etmenin ve iyileştirme önerilerinin yanı sıra yeni programatik kodun bulunmasını otomatikleştirmenin bir yolu. Diğer uygulamaların yanı sıra müzik üretimine genetik algoritmalar da uygulamaya çalıştım.

Genel olarak, çoğu meta-sezgisel / küresel optimizasyon stratejisi gibi evrimsel stratejiler buluyorum, ilk başta öğrenmeye yavaşlar, ancak çözümler hedef duruma yaklaştıkça ve fitness fonksiyonunuz ve sezgisel yöntemler üretmek için iyi hizalandıkça toparlanmaya başlıyorlar. arama alanınızdaki yakınsama.


1

Bir zamanlar Go'nun oyunu için sadece genetik programlamaya dayanan bir bilgisayar oynatıcı yapmaya çalıştım. Her program, bir dizi hamle için bir değerlendirme fonksiyonu olarak ele alınacaktır. Üretilen programlar, oldukça küçültücü bir 3x4 kartında bile çok iyi değildi.

Perl'i kullandım ve her şeyi kendim kodladım. Bugün işleri farklı yapardım.


1

Kör Saatçi'yi okuduktan sonra Dawkins, zaman içinde evrilebilecek organizma modelleri oluşturmak için geliştirdiğini söyledi. Swarm kullanarak kendi yazımı yazacak kadar ilgimi çekmişti . Yaptığı tüm süslü yaratık grafiklerini yapmadım, ama 'kromozomlar' organizmaların hayatta kalma yeteneğini etkileyen özellikleri kontrol ediyordu. Basit bir dünyada yaşıyorlardı ve birbirlerine ve çevrelerine karşı sökerlerdi.

Organizmalar kısmen şans nedeniyle yaşadılar ya da öldüler, aynı zamanda yerel ortamlarına ne kadar etkili bir şekilde adapte olduklarına, besinleri ne kadar iyi tükettiklerine ve ne kadar başarılı bir şekilde çoğaldıklarına bağlı olarak. Eğlenceli, ama aynı zamanda eşim için bir inek olduğumu daha fazla kanıt.


1

Bir süre önceydi, ancak Hubble Uzay Teleskobu (HST) görüntülerinden kozmik ışın izlerini kaldırmak için gerçekte görüntü işleme çekirdeklerini geliştirmek için bir GA yuvarladım. Standart yaklaşım, Hubble ile birden fazla poz almak ve yalnızca tüm görüntülerde aynı olan şeyleri tutmaktır. HST zamanı çok değerli olduğundan, ben bir astronomi tutkunuyum ve son zamanlarda Evrimsel Hesaplama Kongresi'ne katıldım, tek pozlamaları temizlemek için bir GA kullanmayı düşündüm.

Bireyler, giriş olarak 3x3 piksel alan alan, bazı hesaplamalar yapan ve merkez pikselin değiştirilip değiştirilmeyeceği ve nasıl değiştirileceği hakkında bir karar vermiş ağaçlar şeklindeydi. Uygunluk, çıktıyı geleneksel yolla temizlenen bir görüntü ile karşılaştırarak değerlendirildi (örn. Pozlama istifleme).

Aslında bir çeşit işe yaradı, ancak orijinal yaklaşımı önleyecek kadar iyi değil. Eğer tezim tarafından zaman kısıtlamamış olsaydım, algoritmanın kullanabileceği genetik parça kutusunu genişletmiş olabilirdim. Önemli ölçüde geliştirebileceğime eminim.

Kullanılan kütüphaneler: Doğru hatırlıyorsam, astronomik görüntü veri işleme ve I / O için IRAF ve cfitsio.


1

GA ile gençliğimde denemeler yaptım. Python'da şu şekilde çalışan bir simülatör yazdım.

Genler, bir sinir ağının ağırlıklarını kodladılar.

Sinir ağının girişleri dokunuşları algılayan "antenler" dir. Yüksek değerler çok yakın ve 0 dokunmama anlamına geliyordu.

Çıkışlar iki "tekerleğe" aitti. Her iki tekerlek de ileri giderse, adam ileri gitti. Tekerlekler zıt yönlerde olsaydı, adam döndü. Çıktının gücü, tekerleğin dönüş hızını belirledi.

Basit bir labirent oluşturuldu. Gerçekten basitti - aptalca bile. Ekranın alt kısmında başlangıç ​​ve üstte iki duvar arasında bir hedef vardı. Her duvarın rastgele bir alanı vardı, bu yüzden her zaman bir yol vardı.

Başlangıçta rastgele çocuklar (onları böcek olarak düşündüm) başladım. Bir adam hedefe ulaşır ulaşmaz veya bir süre sınırına ulaşılır ulaşmaz uygunluk hesaplanır. O sırada hedefe olan mesafeyle ters orantılıydı.

Daha sonra onları eşleştirdim ve bir sonraki nesli yaratmak için "yetiştirdim". Yetiştirilmek üzere seçilme olasılığı uygunluğu ile orantılıydı. Bazen bu, çok yüksek bir nispi uygunluğa sahip olması durumunda kendisinin tekrar tekrar yetiştirildiği anlamına geliyordu.

Bir "sol duvara sarılma" davranışı geliştireceklerini düşündüm, ama her zaman daha az optimal bir şey izlediler. Her deneyde, böcekler spiral bir şekle dönüştü. Sağdaki bir duvara değene kadar dışarı doğru sarmal olurlardı. Bunu takip ederlerdi, sonra boşluğa vardıklarında aşağı doğru (boşluktan uzağa) ve etrafta sarılırlardı. 270 derece sola dönerler, sonra genellikle boşluğa girerlerdi. Bu onları duvarların çoğundan ve çoğu zaman hedefe götürür.

Eklediğim bir özellik, bireyler arasındaki ilişkiyi izlemek için genlere bir renk vektörü koymaktı. Birkaç nesil sonra, hepsi aynı renkte olacaktı, bu da bana daha iyi bir yetiştirme stratejisine sahip olmam gerektiğini söylüyor.

Daha iyi bir strateji geliştirmelerini sağlamaya çalıştım. Sinir ağını karmaşıklaştırdım - bir bellek ve her şeyi ekledim. Yardım etmedi. Hep aynı stratejiyi gördüm.

Sadece 100 kuşak sonra yeniden bir araya gelen ayrı gen havuzlarına sahip olmak gibi çeşitli şeyler denedim. Ama hiçbir şey onları daha iyi bir stratejiye itemez. Belki imkansızdı.

Bir başka ilginç şey de zaman içindeki zindeliği grafikle çizmektir. Yukarı çıkmadan önce aşağı inen maksimum fitness gibi kesin desenler vardı. Hiç bir evrim kitabının bu olasılık hakkında konuştuğunu görmedim.

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.