Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

71

19.02.2015, 20:43

Und noch ein Vorschlag (sorry): Mach lieber "Jeder gegen jeden" mit 2 Punkten für einen Sieg und 1 Punkt für ein Unentschieden. Das ist besser als das "Champion"-Prinzip, das du anwenden willst.

Das Champion-Prinzip bestraft früh eingereichte KIs, denn diese müssen nach einem Sieg mehr Spiele ungeschlagen überstehen als die spät eingereichten KIs, um bis zum Ende Champion zu bleiben.

Beim Champion-Prinzip gehst du weiterhin davon aus, dass mathematisch gesprochen eine Ordnung auf den KIs existiert. Das ist aber definitiv nicht so. Es kann durchaus sein, dass A gegen B gewinnt und B gegen C, aber A trotzdem gegen C verliert.

Darin sehe ich auch eine potenzielle Gefahr beim Optimieren der eigenen KI. Man sollte eine neue Variante am besten gegen alle vorherigen Varianten antreten lassen, nicht nur gegen die letzte, die man als die bisher beste betrachtet. Sonst wäre es theoretisch möglich, dass man sich insgesamt verschlechtert.

Und zu guter letzt: Die maximal 7 Einreichungen pro Teilnehmer würde ich auf 1 reduzieren, sonst kann man seine Chancen ganz einfach verbessern, indem man 7-mal die gleiche KI einreicht, die sich nur durch den Random Seed unterscheidet. ;)

Helmut

5x Contest-Sieger

  • »Helmut« ist der Autor dieses Themas

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

72

19.02.2015, 21:08

Nun, es geht bei dem Contest nicht nur um KI Entwicklung, sondern auch darum sich schlau anzustellen. :) Wenn jemand die fast selbe KI 7 mal einsenden will, kann er das gerne tun :)
Das Champion-Prinzip bestraft früh eingereichte KIs, denn diese müssen nach einem Sieg mehr Spiele ungeschlagen überstehen als die spät eingereichten KIs, um bis zum Ende Champion zu bleiben.

Dafür bleibt die Früheingesandte bei Unentschieden Champion. Und es kann jeder selbst entscheiden, wann er einsendet.

Beim Champion-Prinzip gehst du weiterhin davon aus, dass mathematisch gesprochen eine Ordnung auf den KIs existiert. Das ist aber definitiv nicht so. Es kann durchaus sein, dass A gegen B gewinnt und B gegen C, aber A trotzdem gegen C verliert.
In dem Fall wird's tatsächlich stark von der Reihenfolge der Einsendungen abhängig, aber ich glaube nicht, dass der Fall tatsächlich auftreten wird, und wenn doch ist halt ein wenig Glück notwendig :)
Ich werde nach Ende der Runde definitiv mal jeden gegen jeden antreten lassen, aber an den Regeln will ich erstmal festhalten.

Darin sehe ich auch eine potenzielle Gefahr beim Optimieren der eigenen KI. Man sollte eine neue Variante am besten gegen alle vorherigen Varianten antreten lassen, nicht nur gegen die letzte, die man als die bisher beste betrachtet. Sonst wäre es theoretisch möglich, dass man sich insgesamt verschlechtert.

Das ist ja jedem selbst überlassen.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

73

20.02.2015, 05:50

Dafür bleibt die Früheingesandte bei Unentschieden Champion. Und es kann jeder selbst entscheiden, wann er einsendet.


Naja das würde ich jetzt nicht Unterschreiben, die Freizeit spielt da natürlich auch ne Rolle. Ich sagen mal Familein Mensch mit Arbeit vs. Student, da liegt der Famielenmensch klar im Nachteil.

Man könnte es ähnlich wie im Fussball machen:
- 3 Punkte Sieg
- 1 Punkt Unentschieden
- ein SpielTag jeder gegen Jeden

Die Wirklich beste KI geht mit den Meisten Punkten nache Hause.

Eine Woche "Training" und der Nächste Spieltag geht los.

Am ende gewinnt der mit den Meisten punkten und man selber weiß auch wie gut man im Vergleich mit den Andreren abgeschnitten hat das es dann weitere Platzierungen gibt.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

74

20.02.2015, 08:53

Ich denke halt, dass die Rahmenbedingungen so sein sollten, dass am Ende die beste KI gewinnt. Einfluss von Zufall (durch niedriges Punkte-Limit) und anderen nicht von uns kontrollierbaren Umständen (Reihenfolge der Einsendung - selbst wenn jeder um 23:59 abgibt, so wäre es Zufall, in welcher Reihenfolge die E-Mails bei dir eintreffen) sollte so weit wie möglich ausgeschlossen werden, sonst könnten wir ja auch direkt Lotterie spielen ... Ich fände es schon frustrierend, wenn der Champion nur Champion ist, weil er zuletzt eingereicht wurde und "mit Glück" den bisherigen Champion geschlagen hat (weil er mit dessen Spielweise besser klarkommt), obwohl er ansonsten gegen die anderen KIs eher mittelmäßig gespielt, im schlimmsten Fall sogar gegen alle verloren hätte.

Zur Argumentation mit Unentschieden: Kann das im neuen Framework überhaupt noch realistisch passieren? Ich dachte, es kommt jetzt ein neuer Ball dazu. (bei mir funktioniert das übrigens korrekt) Naja, theoretisch können beide Spieler gleichzeitig scoren oder durch den CPU-Faktor zu einem Unentschieden gelangen, aber das ist doch ziemlich unwahrscheinlich. Die zuletzt eingereichte KI hat damit einen großen unfairen Vorteil. Wenn überhaupt die Reihenfolge der Einsendung eine Rolle spielen sollte, dann doch eher umgekehrt: Man sollte diejenigen belohnen, die schnell und gut gearbeitet haben (ist aber auch eher problematisch, siehe Koschis Beitrag).

Eine Frage habe ich noch. Statische Variablen sind ja verboten, aber wie sieht's mit statischen Konstanten aus? Ich würde gerne ein paar Sachen vorberechnen, die sich prima in ein statisches konstantes Array packen ließen. Die Alternative wäre halt, eine Instanzvariable zu benutzen und die im Konstruktor zu füllen.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

75

20.02.2015, 09:47

Eine Frage habe ich noch. Statische Variablen sind ja verboten, aber wie sieht's mit statischen Konstanten aus? Ich würde gerne ein paar Sachen vorberechnen, die sich prima in ein statisches konstantes Array packen ließen. Die Alternative wäre halt, eine Instanzvariable zu benutzen und die im Konstruktor zu füllen.
Ich werde sowas auf jeden Fall benutzen. Ansonsten werde ich Code generieren, der in etwa die gleiche Funktion erfuellt. Code sind Daten - Daten sind Code. Das ganze hat nur ehh keinen Sinn, weil eine schnelle KI sowieso nicht belohnt wird. Daher faende ich es auch bloed, wenn ich nur 1 KI einreichen darf, da ich evtl. auch mal noch einen Ansatz einreichen moechte, der ganz simpel CPU Zeit verbrennt.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

76

20.02.2015, 10:33

Heute ist mir das alles nicht mehr die Zeit Wert um Penise zu vergleichen.

Denkst du wirklich, dass es darum geht?
So ein Contest bringt einen dazu, sich sehr intensiv mit einem Problem zu beschäftigen und es von allen Seiten zu analysieren. Dabei lernt man oft viele neue Sachen.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

77

20.02.2015, 10:49

So langsam fange ich an zu verstehen warum sich so viele über Bambi aufregen.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

78

20.02.2015, 11:09

*Zieht den Reißverschluss wieder zu* Hosen jetzt also anlassen, oder wie? Na gut...

@Bambi:
Ich finds ziemlich spannend, ehrlich gesagt, und es ist ein spielender Einstieg in die Entwicklung von KIs. Zumindest für mich! Nach der ersten Runde werde ich definitiv schlauer sein. :)

Außerdem ist competition immer lustig, man darf es halt nur nicht zu ernst nehmen. Wieso machst du nicht einfach mit?
WIP Website: kevinheese.de

Helmut

5x Contest-Sieger

  • »Helmut« ist der Autor dieses Themas

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

79

20.02.2015, 12:47

Also na gut, dann lassen wir halt jeden gegen jeden spielen :) Sagen wir 2 Punkte für Sieg und einen Punkt für jeden bei Unentschieden. So bleibt die Summe der Punkte pro Spiel gleich. Oder gibt's jemanden, der doch das Championverfahren will?

@TGGC
Ja, du kannst gerne mehrere Einsendungen machen.

David, ich klau mir dann deine HTMLgenerierfunktion für die Tabellenherstellung aus früheren Contests, wenn du nichts dagegen hast? Ich hab zwar schon einiges geklaut, aber nicht so ein großes Stück Code :)

Zur Sache mit den statischen Variablen: Ja, natürlich darf man konstante statische Member anlegen. Daran hatte ich nicht gedacht. Die Regel sollte nur sicherstellen, dass man eine KI gegen sich selbst spielen lassen kann.

Hier noch eine Frage zum Speicherverbrauch aus zfx.info:

Zitat von »"Alexander Kornrumpf"«

Wie wirst du prüfen ob nur 100MB allokiert wurden?

Ich breche die Frage auf ein paar cases runter:

1) Meine Klasse macht nichts anderes als einmal bei Konstruktion [cn]malloc(1024*1024*100)[/cn]. OK?
2) Meine Klasse macht nichts anderes als einmal bei Konstruktion [cn]void* p = malloc(1024*1024*100)[/cn]. OK?
3) Falls 2 nicht ok ist, wie steht es mit [cn]void* p = malloc(1024*1024*100-sizeof(p))[/cn]?
4) Falls 1-3 nicht ok ist, wie steht es mit dem C++ äquivalent? Was ist überhaupt das C++ Äquivalent? [cn]new char[1024*1024*100][/cn]?
5) Was ist mit [cn]const char* = "gibberish, continues for 1024*1024*100 characters. If you like make that -1 to accout for terminal 0 ..."[/cn]?
6) Falls 5 ok, was ist mit [cn]const char* = "gibberish for more than 100 MB"[/cn]?
7) Falls 5 oder 6 nicht ok, was ist mit einer (generierten) Funktion der folgenden Art

[cn]char fake_const_array(size_t index)
{
switch (index)
{
case 0: return 'g';
case 1: return 'i';
case 2: return 'b';
case 3: return 'b';
//usw.
}
}[/cn]


Ich denke man kann erkennen, was ich damit abklopfen will.

Also erstens denke ich nicht, dass überhaupt eine KI so speicherhungrig sein wird, zweitens werde ich im Zweifel die KI natürlich nicht disqualifizieren, wenn sie ein MB zu viel allokiert. Wenn jemand eine KI schreibt, die tatsächlich ans Limit kommt, kann er mir die auch gerne zuschicken und vor Ende der Runde fragen, ob sie ok ist, aber wie gesagt denke ich nicht, dass es dazu überhaupt kommt.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Helmut

5x Contest-Sieger

  • »Helmut« ist der Autor dieses Themas

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

80

20.02.2015, 13:25

Ansonsten, wenn ich meine KI gegen sich selbst antreten lasse hab ich schon noch den Bug, außerdem bleibt der Ball auch manchmal in der Mitte liegen(was wiederum nicht so dramatisch ist).
Wenn man an der Framerate rumschraubt, stimmen die Zeiten nicht bzw. selbst wenn man nichts ändert sind die Sekunden keine Sekunden. Ist aber alles halb so wild, wollte es nur mal erwähnt haben.

Kannst du mal genauer beschreiben, was du da als Bug ansiehst? Du hast mir ja auch schon deinen Code geschickt, aber ich seh's einfach nicht.

Zum Ball in der Mitte: Also es ist so, wenn 1 Ball zwei Objekte gleichzeitig trifft, obs nun 2 Spieler und 1 Ball oder 3 Bälle sind, dann funktioniert die Kollisionserkennung nicht. Dann fliegen die Objekte einfach durcheinander hindurch. Der Grund dafür ist einfach, dass es verhältnismäßig aufwändig ist den Fall zu berücksichtigen, er aber so selten auftritt. Für die KI Entwicklung spielt er auch keine Rolle. Nur wenn man ne KI gegen sich selbst spielen lässt imponiert das halt visuell. Den Bug zu fixen würde da aber auch nichts am Spielgeschehen ändern.

Und ja, Spielsekunden sind nicht echte Sekunden, selbst wenn die KIs schnell genug sind. Ich hatte gehofft, dass das nicht auffällt. :) Der Grund ist einfach, dass ich WM_TIMER zur Synchronisation benutze und die Genauigkeit einfach nicht genug ist. Das ist mir kurz vor Beginn aufgefallen, ich hatte dann aber keine Lust mehr alles umzuschmeißen. Zumal es nicht wirklich relevant ist und in StarcraftII beispielsweise laufen Spielsekunden auch nicht in echten Sekunden :)
(Die Zeitmessung der KI ist davon nicht betroffen, nur die Visualisierung unter Windows ist davon betroffen)
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Werbeanzeige

Ähnliche Themen