Meine KI ist zu intelligent - Was tun?
Übersicht

![]() |
M0rgensternBetreff: Meine KI ist zu intelligent - Was tun? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute.
Ich habe endlich wieder Zeit zum Programmieren gefunden und einfach mal drauflos programmiert. Dabei habe ich angefangen ein kleines Spiel zu schreiben bei dem man Schiffe von Sateliten zu anderen Sateliten schicken muss um diese zu erobern. Heute habe ich dann eine winzig kleine KI dazu programmiert. Das Problem: Egal was man tut, man kann nicht gewinnen. Die KI macht eigentlich nur folgendes: Wenn einer ihrer Sateliten eine Population hat, die größer als 50 ist, dann sucht sie sich den Sateliten mit der größten Population heraus. Als nächstes füllt sie eine Liste mit möglichen Angriffszielen. Wenn eines dieser Ziele eine geringere Population hat als der Satelit der der KI gehört, so greift sie dieses Ziel an. Das Problem ist jetzt: Wenn der Spieler einen anderen Sateliten angreift, dann hat er automatisch einen Sateliten mit einer sehr kleinen Population. Dieser wird dann meistens auch direkt das Angriffsziel der KI. Und da der neu eingenommene Satelit des Spielers anfangs auch noch nicht so eine große Population hat, wird dieser auch angegriffen. Der Code zu der KI sieht so aus: BlitzMax: [AUSKLAPPEN] Type TComputerPlayer Extends TPlayer Das "Spiel" könnt ihr hier herunterladen und verlieren: https://www.blitzforum.de/upload/file.php?id=10788 Hat jemand vielleicht eine Idee, wie ich meine KI umprogrammieren könnte, so dass sie nicht unbesiegbar ist? Sollte ich ganz anders rangehen oder das System da beibehalten udn einfach einen Faktor einbauen der die Wahrscheinlichkeit angibt einen Sateliten des SPielers anzugreifen? Wär supe wenn ihr mir Anregungen und Tipps geben könntet. Lg, M0rgenstern |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
das problem scheint mir zu sein, dass der Feind bei dir "allwissend" ist. Eine wirklichkeitsnahe Gegner-KI sollte eigentlich nicht einfach so auf Spielparameter zugreifen können, sondern ihren "Wissenvorteil" nur aus "Beobachtungen" machen können.
Es ist so ähnlich wie im Krimi: Warum fragt der Kommisar nie die Zuschauer? Die haben den Mord doch mitgesehen! Soll heißen: gibt deiner KI nur die Chance, sich Beobachtungen zu notieren und daraus kann sie dann Schlüsse ziehen. Im Falle deiner Satelliten, müsste sie z.b. wirklich SpionageRaumschiffe etc.. zu den Satelliten senden um etwas über die Population herauszubekommen und das ergibt ein Zeitproblem für den Gegner und eine Ungenauigkeit des Ergebnisses. |
||
![]() |
biggicekey |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nicht nur die Wahrscheinlichkeit macht es sondern die Geschwindigkeit der Reaktionen. Bevor der Spieler sich ein Bild machen kann, kommen die ersten Geschosse. Mit Gegenangriffen auf die ungeschützen Planeten von denen die KI etwas losgeschickt hat (Das gleiche macht die KI ja auch wenn du etwas losschickst), habe ich mich einige Zeit über Wasser halten können aber dann sind die Reaktionen der KI einfach viel zu schnell.
Also als erstes eine Verzögerung bei den Aktionen der KI einbauen. Dann kann man Sie überhaupt erst genauer analysieren und schauen was passiert. Überhaupt könntest du etwas Tempo herausnehmem indem zum Beispiel der Kampf auf einem Planeten mit einem Statusbalken oder ähnlichem dargestellt wird. Damit es dann nicht immer auf ein unentschieden hinausläuft müssten doch Zufall oder künstliche Fehler eingebaut werden. EDIT: Midimasters Ansatz würde ein ganz anderes Spiel daraus machen, da der Spieler dann auch erstmal eingeschränkt werden müsste. Sonst finde ich die Idee der nicht aufgedeckten Karte aber sehr gut. |
||
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller Nothing more to register - you've cleaned us out![/size] |
- Zuletzt bearbeitet von biggicekey am So, Jul 03, 2011 20:04, insgesamt einmal bearbeitet
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn die KI nicht mehr weiß als der Mensch, bau noch menschliche Fehler ein: Fehlentscheidungen (Einheiten auf das falsche Ziel schicken), lange "Denkzeiten" in denen sie nicht reagiert, und eine ganz doofe KI könnte auch 10% weniger schnell Einheiten generieren o.ä. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
M0rgenstern |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Midimaster:
Der Computer hat nicht mehr Informationen als der Spieler. Beide sehen die Population der Sateliten, da sie bei jedem Sateliten dabeisteht. Das Spiel wäre mit deiner Idee wie biggicekey schon sagt ein komplett anderes, aber irgendwie eine Überlegung wert. @ Xeres: Die Einheitengeneration hängt nicht von der KI sondern einzig und allein von der Größe der Sateliten ab. Also meint ihr man soll die KI einfach mit einer bestimmten Wahrscheinlichkeit Fehler machen lassen? Die Idee ist irgendwie so banal, da wär ich gar nicht drauf gekommen. Es ist für mich irgendwie nicht offensichtlich absichtlich Fehler einzuprogrammieren^^ Werds aber mal ausprobieren. Danke Lg, M0rgenstern |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
M0rgenstern hat Folgendes geschrieben: Die Einheitengeneration hängt nicht von der KI sondern einzig und allein von der Größe der Sateliten ab. Mag sein, aber vielleicht sollte sie das nicht (für bestimmte KIs).
Computer sind unglaublich schnell im Rechnen, das heißt wenn sie lösbare Probleme vorgegeben bekommen, sind sie prinzipiell unschlagbar, ansonsten sind sie nie ein ernst zu nehmender Gegner. Bei allen Strategiespielen wie Starcraft oder Age of Empires usw. tun die KIs so, als ob sie Ressourcen abbauen würden - dabei cheaten sie die ganze Zeit, bekommen Boni oder haben endlos Ressourcen zur Verfügung und halten sich bloß mit den bauen zurück. Wenn du den Computer immer nach den Regeln spielen lässt, ist er viel zu gut oder viel zu schlecht. Das Ziel ist, dem Menschen einen passenden Gegner zu bieten und dafür hier und da zu tricksen. Siehe auch: The Computer Is A Cheating Bastard |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es mag schon sein, dass beide Teilnehmer die gleichen Möglichkeiten haben...aber die Maschine sieht viel schneller und genauer die Situation durch. Das mit der "Spionage" meinte ich auch mehr als im übertragenen Sinn:
Ich wüde nicht nur auf "absichtliche Fehlentscheidungen" setzen, sondern überlegen, ob man der KI vielleicht nur 1x pro Sekunde das Erfassen eines Satelliten erlaubt. So hat sie nie den ganzen Überblick und trifft automatsich "Fehlentscheidungen". Ebenso würde ich sie zwingen, lange bei einer getroffenen Entscheidung zu bleiben, auch wenn sich längst etwas vorteilhafteres abzeichnet. z.b. 50 Satelliten nehmen teil: Die KI darf sich nur den Satelliten mit der Nummer RAND(0,50) anschauen. Da sind dann Satelliten dabei, die ihr selbst nach 2 Minuten noch nicht bekannt sind. Auch Veränderungen brauchen so vielleicht 2 Minuten, bis sie bemerkt werden. |
||
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich kann gewinnen ![]() Aber ich glaube, ein Großteil des Problems liegt einfach in deinen Spielregeln. Genauer gesagt darin, dass man nur immer die (fast) gesamte Population eines Planeten zum Angriff losschicken kann. Dadurch ist der angreifende Planet dann grundsätzlich sehr schwach, sodass der Gegner ihn angreifen kann. Natürlich kann man dann selbst wieder Truppen von einem anderen Planeten aus hinschicken usw., aber dadurch wird das ganze dann ein einziges Hin- und Hergehetze, bei dem die KI dank ihrer perfekten Reflexe im Vorteil ist. Die KI absichtlich dumme Fehler machen zu lassen, halte ich für eine nicht so tolle Idee. Aber könnte man einstellen, wie viele Einheiten man losschickt, z.B. nur die Hälfte, und wäre die Bewegung der Einheiten vielleicht langsamer, dann wäre deine KI vermutlich weit weniger stark. |
||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
![]() |
ToeB |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie gesagt, es wäre schon mal ein Anfang, eine Zeitliche Verzögerung ("Menschliche Reaktionszeit") einzubauen. Danach könnte sich. z.B. auch der Schwierigkeitsgrad richten, umso höher die Zeit, umso einfacher der Gegner.
mfg ToeB |
||
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt! |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ps: Bei der Fahrschultheorie haben wir gelernt, das ein Mensch zirka 1 sek Reaktionszeit hat. Sprich, erkennen einer gefahr - 1 sek - reaktion (Fuß aufs Bremspedal?)
Mein Ansatz für eine KI wäre ausserdem - ich haber allerdings noch nie eine geschrieben - statt der BESTEN möglichkeit eine liste anzufertigen, mit DEN besten möglichkeiten. Man könnte je nach KI eine tolleranzspanne einbauen. Leichte ki lässt große tolleranz zu - schwere nur geringe. (folgendes schreibe ich aufgrund von vermutungen, dein spiel getestet habe ich nicht!) Die ki stellt fest, das ein angriff lohnenswert wäre ( >= 50 einheiten). Sie sucht sich den besten angriffspunkt ( geringste population beim gegner ) Diesen wert nimmt sie als Vergleich. Eine Leichte CPU könnte zb einen wert von 35 als tolleranz haben, eine schwere nur einen von 10. Nun geht sie nocheinmal alle Satteliten des Gegners durch, und prüft ob die Population <= Bester.Punkt + Tolleranz AND Population < EigenerSatteliet.Population. Am ende hast du eine liste mit 1 bis vllt 5 einträgen, woraus eine zufällig ausgewählt wird. Bei besonders leichten KI' könntest du auch gleich den BESTEN eintrag rauslassen - das heißt nur 'Brauchbare' angriffsziele werden bearbeitet, nicht das beste! Solltest du diese werte ( tolleranz, reaktionszeit ) einbauen, kannst du sie ja einstellbar machen und uns einmal zum testen geben ![]() |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für (pro)gamer gilt diese Reaktionszeit aber garantiert nicht ![]() Mach doch alle Aktionen, die die KI ausfürhen will, in eine Queue, und lass sie dann immer in x Zeitabschnitten y Aktionen ausführen. |
||
Starfare: Worklog, Website (download) |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hatte dasselbe Problem bei einem BCC-Beitrag, der deinem im Spielprinzip sehr ähnlich ist. Meine Lösung dafür war, die Aktionen der KI in drei verschiedene Typen zu unterteilen:
1. Verteidigung: Hierbei schickt die KI Einheiten zu einer eigenen Basis, um sie zu verteidigen, falls diese vom Spieler angegriffen wird. Diese Aktion erfolgt immer sofort. 2. Einnahme: Passiert, wenn die KI Einheiten zu einer noch unbesetzten Basis schickt, um diese einzunehmen. Ob solch eine Aktion möglich ist, wird immer in gewissen Zeitintervallen überprüft (je nach Schwierigkeitsgrad) und es kann auch nur ein Einnehm-Befehl pro Zeitintervall erteilt werden (i.d.R. sucht sich die KI die Basis aus, die am wertvollsten ist und am nächsten zu einer eigenen Basis liegt). 3. Angriff: Logischerweise dann, wenn die KI eine vom Spieler besetzte Basis angreift. Ob so ein Angriff lohnenswert ist, wird auch nur in gewissen Zeitintervallen überprüft (doppelt so viel wie für die Einnahme-Aktion), damit die KI nicht zu oft angreift (selbstredend ist auch nur ein einziger Angriff pro Intervall erlaubt). Damit es allerdings nicht zu einfach wird und der Spieler wirklich auch seine Basen verteidigt, ist es der KI möglich, genau zu dosieren, wie viele Einheiten sie losschickt. Dafür berechnet sie den Verteidigungswert der Basis, wie lange die eigenen Einheiten zur gegnerischen Basis haben und wieviel Verteidigung die gegnerische Basis produziert, während die Einheiten unterwegs sind. Somit wird eine Basis des Spielers immer eingenommen, wenn er sie nicht verteidigt. Wie gross du die Zeitabstände für die einzelnen Überprüfungen setzt, musst du durch Ausprobieren herausfinden. In meinem Fall waren es jeweils zwischen 3 - 6 Sekunden, je nach Schwierigkeitsgrad. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group