Gelen bu soruya bir oyun oyuncuları, tutsak ikilemi içinde çifti tarafından çifti kapalı birbirlerine karşılaşacağı diğerlerine karşı en yüksek puanı iteratif hangi stratejinin belirlenmesi için hangi icat edildi.
Gelen bu soruya , ben birden fazla kişi aynı anda birbirlerine karşı Tutsaklar Dilemma oynamak için bir yolunu buldular. Bu varyasyonda, getiri matrisi gereksizdir, her iki oyuncu çifti arasındaki her sonuç fonksiyonel olarak bağımsız iki kararın toplamıdır.
Göreviniz, çok oyunculu Mahkum'un İkileminin mümkün olan en yüksek puanı elde edecek bu simetrik, genelleştirilmiş versiyonunu oynamak için bir yapay zeka inşa etmektir.
Oyunun kuralları
Bu çok oyunculu, çok turlu Mahkum'un İkileminin her turunda, bir oyuncu A
başka bir oyuncudan "1" almaya karar verebilir B
. Bu durumda, A
puanı 1 artarken puanı 2 artar B
. Bu kararın sipariş edilen her bir oyuncu çifti arasında olmasına izin verilir.
Bu, her oyuncu için, sırasıyla kaçma ve işbirliğine homolog olan "1 almak" veya birbirinden "1 almak" için verilen tek karardır. İki oyuncu arasında etkili ödeme matrisi P1
ve P2
görünüm şöyle:
P1/P2 P1 Take1 P1 Don't
P2 Take1 -1/-1 -2/+1
P2 Don't +1/-2 0/ 0
Turnuva Prosedürü
Oyun , katılan oyuncuların sayısı olan P * 25
turlardan oluşacaktır P
. Tüm oyuncular bir puanla başlar 0
. Her tur aşağıdaki prosedürden oluşacaktır:
Bir turun başlangıcında, her programa standart girdiden önceki formatta aşağıdaki formatta bir geçmiş verilecektir :
3 Sayı içeren bir satır,
P
,D
, veN
.P
oyundaki toplam oyuncu sayısıdır. Her oyuncu rastgele bir kimlik numarası atanır1
içinP
oyunun başında.D
geçerli oynatıcının kimliği.N
oynanan turların sayısıdır.
N
her tur bir turun sonuçlarını temsil eder. Hattak
, boşluklarla ayrılmış, kimliğine sahip oyuncunun o turda kimliğine sahip oyuncudan "1" aldığını gösteren birN
dizin_k
sıralı çift olacaktır .(a, b)
a
b
Bir homojen rasgele sayı
R
gelen0
için18446744073709551615
(2 64 - 1), bir yalancı rasgele tohum olarak işlev görmek için. Bu numaralar, insanların sonuçları kendileri için doğrulayabilmeleri için turnuvanın sonunda yayınlanacak olan önceden oluşturulmuş bir dosyadan okunacaktır.Programınız önceki turda böyle bir çıktı ürettiyse, programınıza okunacak bir durum biçimini temsil eden ekstra bir satır. Oyunun başında, bu çizgi her zaman boş olacaktır. Bu satır, puanlama kodu veya diğer programlar tarafından değiştirilmez.
Her program daha sonra standart çıktıya aşağıdakileri üretmek için stratejisini kullanır :
K
Bu turdan "alacağı" programların kimlikleri olan bir sayı listesi . Boş bir çıktı hiçbir şey yapmayacağı anlamına gelir.İsteğe bağlı olarak, sonraki turlara geçecek bir durum biçimini temsil eden ekstra bir satır. Bu kesin çizgi bir sonraki turda programa geri beslenecektir.
Aşağıda, 3
4 kişilik bir oyunda bir kimlik oyuncusu için oyunun başlangıcı için örnek bir giriş bulunmaktadır :
4 3 0
4696634734863777023
Aşağıda, aynı oyun için birkaç tur daha önce oynanmış bir örnek giriş verilmiştir:
4 3 2
(1, 2) (1, 3) (1, 4) (4, 2)
(1, 3) (2, 1) (2, 4) (3, 1) (4, 1)
4675881156406346380
Her program için D
benzersiz olan kimlik numarası haricinde , her program bir raunt için aynı girişle beslenir .
Aşağıda, oyuncunun 3
diğer herkesten 1 aldığı örnek bir çıktı yer almaktadır:
1 2 4
Gerekli tüm turların sonunda, en yüksek final skoruna sahip oyuncu kazanır.
Zaman çizelgesi
Bu turnuvanın kodlaması toplam 7 gün sürecek. Başvurular için son tarih 2014-05-09 00:00 UTC
.
Bu tarihten önce gerçek programları yayınlamayın - programınızın kaynak kodunun SHA256 karmasını taahhüt olarak gönderin. Bu karmayı son tarihten önce istediğiniz zaman değiştirebilirsiniz, ancak son tarihten sonra gönderilen taahhütler yargı için kabul edilmeyecektir. (Doğrulama programım 64 tabanını tükettiğinden ve daha kompakt bir gösterim olduğundan, lütfen karmalarınız için taban 64 gösterimini kullanın.)
Son başvuru tarihi geçtikten sonra, 2014-05-10 00:00 UTC
gönderiminiz için programınızın gerçek kaynak kodunu yayınlamak için 1 gününüz ( sonrasına) sahip olacaksınız . Gönderilen kaynak kodunuzun SHA256 karma değeri, son başvuru tarihinden önce gönderdiğiniz hiçbir karma ile eşleşmezse, kodunuz turnuvaya kabul edilmez.
Bundan sonra, tüm başvuruları kendi bilgisayarıma indireceğim ve bu savaş rotasında tüm turnuva girişlerini çalıştıracağım, umarım sonuçları 2 gün içinde o zamana kadar gönderirim 2014-05-12 00:00 UTC
.
En yüksek puana sahip cevabı kabul edeceğim ve final skoru daha büyükse bu cevaba +100 ödül vereceğim 0
.
Turnuva bittikten sonra, yarışmayı yürütmek için kullanılan rastgele tohum dosyasını yayınlayacağım ve insanlar turnuvada kullanılanların üstesinden gelmek için başka çözümler yayınlamaya başlayabilirler. Ancak, kabul veya lütuf için sayılmazlar.
Ana Makine
Bu çözümleri bilgisayarımdaki bir sanal makinede çalıştıracağım. Bu sanal makine, 2 gigabayt RAM ile Ubuntu Linux 14.04'ü çalıştıracak. Temel makinemde 3.40 GHz hızında çalışan bir Intel i7-2600K işlemci var.
Gereksinimler
Programınız, derleyiciyi veya programınızı derleyecek bir tercümanın mevcut olduğu ve Ubuntu Linux'un en son sürümü için hazır olduğu bir dilde yazılmalıdır, böylece tüm gönderimleri çalıştırabilir ve sanal bir makinede yargılayabilirim.
Programınızın 2.000 seconds
her turu çalıştırmaktan fazlasını almaması gerekir . Programınız zaman aşımına uğrarsa veya bir hata üretirse, çıktısı o tur için boş sayılacaktır.
Programınız deterministik olmalıdır; yani, aynı girdi için her zaman aynı çıktıyı döndürmelidir. Yalancı çözümlere izin verilir; ancak, rastgelelikleri girdi olarak verilen rastgele tohuma bağlı olmalı ve başka bir şey olmamalıdır. Tohum dosyası Python'lar kullanılarak oluşturuldu os.urandom
. Toplam 500 satır içerir (gerekirse daha fazla üretilecektir) ve SHA256 karmasıdır K+ics+sFq82lgiLanEnL/PABQKnn7rDAGmO48oiYxZk=
. Turnuva bittikten sonra buraya yüklenecek.
Bitkiler
İşleri başlatmak için ilk naif stratejileri temsil eden dört "bitki" olacaktır. Bunlar, gönderilerinizle birlikte turnuvada oynanacak. Ancak, bunlardan birinin kazanması durumunda, bir tesis dışında bir oyuncunun aldığı en yüksek puan kazanan sayılır.
Her bitkinin dosyasının karmasını hesaplamak için, buradaki biçimlendirici sekme karakterlerini beğenmediği için 4 boşluktan oluşan her grubu bir sekme ile değiştirin.
Tembel - hiçbir şey yapmaz.
n1bnYdeb/bNDBKASWGywTRa0Ne9hMAkal3AuVZJgovI=
pass
Açgözlü - her zaman herkesten 1 alır.
+k0L8NF27b8+Xf50quRaZFFuflZhZuTCQOR5t5b0nMI=
import sys
line1 = sys.stdin.readline()
n = [int(i) for i in line1.split()]
for i in range(n[0]):
if i+1 != n[1]:
print i+1,
print
Öfkeli - ilk turda diğer herkesten 1 alır ve daha sonra bir önceki turda 1 alan herkesten 1 alır.
Ya2dIv8TCh0zWzRfzUIdFKWj1DF9GXWhbq/uN7+CzrY=
import sys
import re
line1 = [int(i) for i in sys.stdin.readline().split()]
players = line1[0]
pid = line1[1]
rounds = line1[2]
lines = []
if rounds == 0:
for i in range(players):
if i+1 != pid:
print i+1,
print
else:
for i in range(rounds):
lines.append(sys.stdin.readline())
lastline = lines[-1]
takes = re.findall(r'\([0-9]+, [0-9]+\)', lastline)
for take in takes:
sides = [int(i) for i in re.findall(r'[0-9]+', take)]
if sides[1] == pid:
print sides[0],
print
Kıskanç - yuvarlama yaparak kendisi hariç mevcut en yüksek puanı alan oyuncuların% 50'sinden 1 alır.
YhLgqrz1Cm2pEcFlsiIL4b4MX9QiTxuIOBJF+wvukNk=
import sys
import re
line1 = [int(i) for i in sys.stdin.readline().split()]
players = line1[0]
pid = line1[1]
rounds = line1[2]
lines = []
scores = [0] * players
if rounds == 0:
for i in range(players):
if i+1 != pid:
print i+1,
print
else:
for i in range(rounds):
takes = re.findall(r'\([0-9]+, [0-9]+\)', sys.stdin.readline())
for take in takes:
sides = [int(i) for i in re.findall(r'[0-9]+', take)]
scores[sides[0] - 1] += 1
scores[sides[1] - 1] -= 2
score_pairs = [(i+1, scores[i]) for i in range(players)]
score_pairs.sort(key=lambda x:(x[1], x[0]))
score_pairs.reverse()
taken = 0
j = 0
while taken < (players) / 2:
if score_pairs[j][0] != pid:
print score_pairs[j][0],
taken += 1
j += 1
Bu dördü arasında 100 turluk bir turnuvada, puanları:
Lazy: -204
Greedy: -100
Wrathful: -199
Envious: -199
Değerlendirme Programı
Github'da kullanacağım hakim programını yayınladım . İndirin ve test edin. (Ve belki bir tane bulursanız bir veya iki hatayı düzeltin.: P)
Şu anda Python'dan başka bir şey için derleme seçenekleri yok. Bunları daha sonra dahil edeceğim - eğer insanlar diğer diller için derleme veya yorumlama senaryolarına katkıda bulunabilseydi, çok zorlanırdım.
Aşama 2: Kaynak Kod Gönderme
tournament
Yarışma için Github deposuna pd_rand dosyasını ve diğer bitki girdilerini içeren yeni bir şube gönderdim . Kaynak kodunuzu buraya gönderebilir veya bir çekme isteği olarak bu şubeye gönderebilirsiniz.
Yarışmacıların sırası aşağıdaki gibi olacaktır:
'begrudger'
'regular'
'patient'
'lazy'
'backstab'
'bully'
'lunatic'
'envious'
'titfortat'
'greedy'
'wrathful'
'judge'
'onepercent'
Son Skorlar
Test programımın çıktısı:
Final scores:
begrudger -2862
regular -204
patient -994
lazy -2886
backstab -1311
bully -1393
lunatic -1539
envious -2448
titfortat -985
greedy -724
wrathful -1478
judge -365
onepercent -1921
sıralamalar:
1. regular -204
2. judge -365
3. greedy -724
4. titfortat -985
5. patient -994
6. backstab -1311
7. bully -1393
8. wrathful -1478
9. lunatic -1539
10. onepercent -1921
11. envious -2448
12. begrudger -2862
13. lazy -2886
Yani kazanan gerçekten bir oyuncu - -204 puan ile The Regular!
Ne yazık ki, puanı olumlu değildi, ama yinelenen Tutuklu Mahkum'un İkileminin simülasyonunda herkesin kazanmak için oynadığını tahmin edemeyiz.
Bazı şaşırtıcı sonuçlar (en azından şaşırtıcı olduğunu düşündüm):
Açgözlü, Tat için Tit'den daha fazla puan aldı ve aslında çoğu skorerden genellikle daha yüksekti.
Bir çeşit "ahlak güçlendirme" karakteri olan Yargıç (temelde ortalamanın üzerinde bir sayıda kişiden 1'i almış olandan 1 aldı), simülasyon testinde, aslında oldukça düşük bir puan almak.
Ve diğerleri (düşündüm) o kadar şaşırtıcı değildi:
Hasta The Wrathful'dan 484 puan daha fazla puan aldı. İlk kez işbirliği yapmak gerçekten işe yarıyor.
Bir Yüzde çok hızlı bir şekilde, aşağıdayken tekmeleyecek kimse yoktu. Görünüşe göre% 1 sadece oyunda daha fazla oyuncuya sahip oldukları için bu şekilde kalabiliyor.
Her neyse, turnuva sona erdiğine göre, istediğiniz kadar fazla oyuncu yayınlamaktan çekinmeyin ve hakem programını kullanarak test edin.