Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011

Kokujou

Members
  • Content count

    169
  • Joined

  • Last visited

Community Reputation

1 Neutral

About Kokujou

  • Rank
    Advanced Member
  • Birthday 11/13/1993

Contact Methods

  • Website URL
    http://obscuritas.pw

Profile Information

  • Gender
    Male
  • Location
    Dessau-Roßlau
  • Interests
    Spieleentwicklung, Animes

Recent Profile Visitors

619 profile views
  1. Vermeiden von Casts

    Oho, ein veteran, nicht schlecht. Nagut dann pfuschie ich mal ein bsichen an meinem Code rum und sehe was passiert~ ich muss eh nochmal alles von vorne machen.
  2. Vermeiden von Casts

    Oh man... Also auch noch im Unity Source rumzupfuschen da komm ich mir nicht sehr... konfident vor ich arbeite nur sehr oberflächlich mit Networking.. Das Grundproblem ist einfach nur Klassen und deren Inhalte auf beiden Spielern zu synchronisieren. Aber aus mangelnder Kompatibilität habe ich aus den Klassen structs und aus den generischen listen Arraylisten machen müssen. Reicht es denn wirklich aus wenn ich das mittels Vererbung löse? Ich muss warscheinlich sowieso nochmal alles komplett überarbeiten. Du weißt ja wie das ist, wenn du dir mal den Code ansiehst den du vor 4 Jahren geschrieben hast und du denkst "Gott was hab ich damals fürn Mist verzapft" XD
  3. Vermeiden von Casts

    willst du damit sagen, dass man inzwischen generische Klassen übers Netzwerk senden kann? Ich hab das letzte mal mit Networking unter Unity 4.x gearbeitet, um es zum laufen zu bringen unter 5.x musste ich haufenweise ändern, es wäre gut wenn das jetzt so wäre. Oder warum hast du mir den Source geschickt?
  4. Vermeiden von Casts

    Hallo erstmal Folgendes: Ich verwende als Basis das Unity Networking und um Klassen zu synchronisieren dürfen sie leider nicht generisch sein, weswegen ich Arraylisten verwenden muss. Diese enthalten ja nur Objekte vom Typ object. Das Problem ist, ich muss jetzt jedes Mal, wenn ich auf Werte dieser Listen zugreifen will konvertieren und ich kann mir nicht vorstellen dass das sonderlich effizient ist. Meine Frage: Was tun? Ich weiß leider nie wann Referenzen übergeben werden und wann nicht. Würden die ursprünglichen Listen auch verändert werden wenn man das Casten nur einmal macht und dann mit der erzeugten Liste weiter arbeitet? Oder ist diese Liste eine Wertkopie? Oder gibt es alternativ vielleicht eine möglichkeit diese ArrayLists zu vermeiden? Wäre es z.B. effektiver wenn man sich selbst eine "Serialisierungsfunktion" definiert, und wenn ja wie funktioniert sowas? ich suche nach der effizientesten Lösung.
  5. Optimiertes Erstellen eines großen Suchbaums

    Naja wir müssen uns überlegen wie wir das Spiel dazu befähigen zu lernen. anders gesagt wir lernen ja indem wir erstmal Spielen. Wenn wir verloren haben heißt das das wir schlecht gespielt haben. Dann hat man die Möglichkeit sich zu überlegen an welcher Stelle wir einen fehler gemacht haben im Spiel. Das wäre aber mit strategischem Wissen verbunden. Was wir suchen wäre eher sowas wie: wenn man gewinnt bewerte alle von dir getätigten Spielzüge mit +100 und alle vom ggner auf -100, baue daraus ein neuronales netz und lasse dann mit diesem neuronalen netz gegen einen gegner spielen, je besser desto... besser. und dann passt sich das netz auf diese weise selbst an. Aber das ist nur theoretisch Das größte Problem beim trainieren solcher Bäume ist die Anzahl der Durchläufe. Schach hat fast unbegrenzt viele Züge allein zu bewerten wann ein Spiel schachmatt ist ist überaus komplex. und die Anzahl der Schachzüge geht gegen unendlich. Also wäre das kein gutes Beispiel. Aber vielleicht gibt es ja solche Algoirthmen für einfachere Spiele. 4Mich wrüde eben interessieren ob es Ideen zur Umsetzung von neuronalen Netzen bei Spielen gibt deren Zustände nicht ohne weiteres bewertet werden können. Bei 4 gewinnt würdest du wohl einen zustand danach bewerten wie viele Teile in einer Reihe sind und würdest damit warscheinlich verlieren. Denn du musst ja gleichzeitig die Gegnersteine minimieren. und dann irgendeine strategie aufbauen sodass der Gegner deine Steine nicht verbauen kann. netc...
  6. Optimiertes Erstellen eines großen Suchbaums

    Aber es muss doch eine grundsätzliche Vorgehenweise zum Trainieren eines neuronalen Netzes geben oder? Sagen wir mal du gibst einen Zustand ein also ein Schachfeld mit den korrespondierenden Figuren und den Positionen etc... Ich weiß noch aus dem Unterricht dass es wohl ein rekursiver Algorithmus ist. Man spielt ein Probespiel und wenn die KI gewinnt gibts Pluspunkte wenn nicht Minuspunkte und +-0 bei Patt. Und dann muss sich der Algorithmus von dieser Basis aus irgendwie selbst abwickeln. Aber wie trainiert man ein neuronales Netz? ich meine bei einer Gewichtsanpassung muss man ja nur gewisse Werte anpassen, aber ein neuronales Netz ist doch deutlich komplizierter oder? Ich würde gerne wissen wie sowas funktioniert. das könnte man sicherlich auch gut in einer Master Arbeit verwenden. Kennt ihr vielleicht irgendein primitives Spiel das mittels neuronalem Netz gelernt wird? Irgendwas einfaches wie Tic Tac Toe oder so, an dem man die generelle Vorgehensweise sieht.
  7. Optimiertes Erstellen eines großen Suchbaums

    Dann nehmen wir als Beispiel ein Schachspiel. Da gibts nur gewonnen und verloren. wie kann man also sagen wenn man z.B. den Bauer in der 5. Runde 2 Felder vor setzt das das gut oder schlecht ist? das würde mich mal interessieren.
  8. Optimiertes Erstellen eines großen Suchbaums

    aber bei einem Spiel ist das ja etwas komplexer. Tatsächlich benutze ich übrigens OpenCV aktuell für geometrische Szenenrekonstruktion. Das sit ein modul dass ich im Master studiere. Die pure hölle >.> Aber egal. Bei einem Spiel weißt du ja nicht was richtig ist.Wie lernst du den Algorithmus dann an? Du hast ja praktisch nur 1 sicheres Ergebnis und das ist wenn du gewonnen bzw verloren hast. Oder falls es ein Patt gibt. Aber wir müssen ja die Zwischenzüge bewerten. Das hab ich nie so ganz verstanden.
  9. Optimiertes Erstellen eines großen Suchbaums

    Also man gibt x Eingabegrößen an ein neuronales Netz. Dieses Netz hat y Schichten durch die diese Größen gejagt und modifiziert werden. Beim machinellen Lernen geht man ja so vor dass man sich eine Formel sagen wir mal Wert=ax+by+cz aufstellt, wobei a-c dann die Gewichte sind die man dann durch eine Lernfunktion anpasst, wobei man die Abweichung von dem Optimalwert misst. Das problem ist aber dass die Form der Formel nicht verändert wird also z.B. dass es eben bei + bleibt und man nicht ne Potenz reinkriegt oder man plötzlich 3^x daraus zaubert. Und ein neuronales Netz kann das... hab ich das so richtig verstanden? dann wäre das vielleicht ein guter experimenteller Ansatz. Könnte mir jemand diese Thematik näher erklären? Algorithmisch.
  10. Optimiertes Erstellen eines großen Suchbaums

    Ich verstehe etwas wie neuronale Netze funktionieren aber nicht so ganz wie man sie auf ein Spiel anwendet. Im Prinzip ist ein neuronales Netz doch auch nur eine Bewertungsfunktion. Du schickst ne Zahl rein die wird durch irgendwelche Schichten gejagt wo sie verändert wird und am Ende kommt ein ergebnis raus. die Arrays sind alle vom Typ Integer. Aber ich habe eine Klasse für Figur mit den Eigenschaften Farbe, Position, mögliche Bewegungen, Typ, ... Wenn ich jetzt z.B. den Root-Zustand übergebe rechnen ja x Threads gleichzeitig an dem Root zustand die Folgezustände aus. Also folgender Fall: Thread 1 schiebt den Bauern im Root zustand 2 Felder vor. Dann kommt Thread 2 und nimmt eine andere Figur, der Bauer ist aber auch da bereits verändert worden da sie ja alle mit der gleichen Figur arbeiten. Das heißt in diesem Zug wurden 2 Figuren verändert. Das war das Problem das ich hatte ich hatte bei meinem Algorithmus ständig verschiedene Werte wenn ich das Spiel starte, weil die Threads ja die Referenzen verwenden und keine neuen Figuren erzeugen.
  11. Optimiertes Erstellen eines großen Suchbaums

    Figuren haben ja noch andere Eigenschaften die man nicht vergessen darf, beim Schachspiel ist das besonders kompliziert. Das wichtigste und umfangreichste dabei ist die Frage, welche Felder sie begehen können, was wichtig ist um daraus Folgezüge zu konstruieren. Dazu wiederum wird die Farbe der Figur und deren Typ (Bauer, Turm, ... ) benötigt. Ich habe das als 8x8 Matrix geregelt aus Integer-Werten. Integer-Werte deswegen weil man verschiedene Arten des ziehens hat. Schlagen, Normales laufen, Rochade und andere Sonderzüge, Blockade durch eigene Figur, das alles wird in meinem Algorithmus verwendet der sogar ziemlich gut ist bis auf die Schachmatt-Erkennung. Ich habe natürlich auch für jeden Zustand ein 2D-Feld angelegt allerdings nicht vom Typ Byte sondern Integer, ganz einfach weil ich byte noch nie verwendet habe XD Vor allem interessiert mich die Frage. Wirkt es sich positiv auf die Laufzeit auf einfach "Komprimiertere" Datenstrukturen zu verwenden? Ich meine das dürfte doch eigentlich keine Rolle spielen. Selbst wenns um Festplattenspeicher geht hat man 100MB/s+ das wird niemals ausgereizt. wichtiger ist doch die Berechnungen zu reduzieren oder? Und wenn man jetzt die Positionen die ich z.B. als eine Art Integer Array zusammengefasst habe {x,y} jetzt in einem einzigen byte speichert müsste man dann doch dekomprimieren und das wäre doch wiederum teurer, was die Laufzeit angeht oder? Zur zweiten antwort: Ja so wäre das etwa geplant. Besonders wenn der Suchbaum schon existiert kostet er ja nur die Laufzeit die es braucht um die Daten zu importieren. Du würdest deine aber zur Laufzeit erzeugen. Natürlich hast du recht, dass bereits vergangene Züge nicht mehr gebraucht werden aber das ist eine Sache des Speichermanagements. Und so viele Daten dass du in "Textform" in den Mega oder sogar Giga bereich kommst musst du erstmal generieren. Du wirst mir sicher zustimmen wenn ich sage, dass je mehr Züge der algorithmus voraus sehen kann, umso besser ist er oder? Das kommt auch vom theoretischen Aspekt der Denkweise eines Spielers gleich. Man überlegt ja, welche Züge könnte der Gegner machen wenn ich das und das mache und das für x verschiedene Züge. Allerdings fällt mir spontan auch ein, dass man den Suchbaum sozusagen entschlacken könnte. Überlegt mal: Man baut zuerst direkte Folgezüge auf, bewertet diese und baut dann für den BESTEN Zug oder optional die 2,3,4 besten Züge den Baum tiefer auf, also a la Tiefensuche bzw Tiefen"konstruktion". Dann berechnest du die x wahrscheinlichsten Züge des Gegners und konstrukierst für diese dann wieder die y Folgezüge berechnest den wahrscheinlichsten etc... damit würdest du praktisch alle "unsinnigen" Züge auf den Müll schmeißen. Man hätte dann eben nur das Pech, wenn der Gegner einen unvorhergesehenen Zug macht kannst du deinen ganzen Minimalbaum in die Tonne schmeißen XD
  12. Optimiertes Erstellen eines großen Suchbaums

    besonders würde mich interessieren wie das mit anpassbaren Lernfunktionen ist ob es da einen populären Ansatz für Spiele gibt.
  13. Optimiertes Erstellen eines großen Suchbaums

    Am Ende muss es doch so oder so immer in einer Liste festgehalten werden. Die Tiefe in der du die Züge aufbaust bestimmt die Qualität der KI. Man will doch Züge des Gegners vorhersehen und darauf reagieren. Wenn du immer nur bis zu Tiefe 1 gehst und dir genau eine Ebene ausgeben lässt musst du die ja trotzdem irgendwo zwischenspeichern, du machst also auch nichts anderes als ich, nur dass ich meine Datenstruktur nicht lokal sondern global speichere. Einer der KI-Ansätze ist doch dass man das gesamte Spiel als Suchproblem definiert. Also praktisch nach allen Zuständen suchen in denen man das Spiel gewonnen hat oder besser gesagt nach allen in den der Gegner nicht gewinnen kann (diese Unterscheidung ist bei meinem aktuellen Spiel wichtig). Gäbe es z.B. Beim Schach ein Spiel dass ALLE möglichen Schachbretter gespeichert hätte könnte die KI doch niemals verlieren, weil sie immer den Zug wählen würde, in dem man am Ende die meisten Gewinnmöglichkeiten hat. Wäre lustig sie gegen sich selbst spielen zu lassen XD Bei statischen Spielen funktioniert das super, denn dann könnte man diesen Suchbaum einfach speichern und statt zu berechnen dann einfach abrufen oder optional in der Datei suchen. Und nebenbei das mit dem Move funktioniert leider auch nicht. Denn sobald du sie wieder zurück bewegst, haben sie ja in allen Folgezuständen wieder die Position des root zustands und du hast nichts geändert. Was man tun könnte ist wirklich nur das Schachfeld festzuhalten und daraus eben alles abzuleiten aber das bedeutet wieder rechnen, rechnen rechnen, weil du da daraus erstmal die Figuren rauslesen musst, ihre Zugmöglichkeiten etc...
  14. Optimiertes Erstellen eines großen Suchbaums

    Oh man... die Bewertung des Zustands ist aktuell noch nichtmal im Algorithmus enthalten. Ich steh noch ganz am Afnang damit krieg ichw arscheinlich nochmal +10 tage. Obwohl die Bewertung ja nicht unbedingt amBaum gemacht werden muss das heißt nicht sofort bei erstellung. Nimmt man die Suchproblematik sucht man ja eigentlich nur nach Endzuständen und weniger nach dem mit den meisten Punkten. DBei dem Spiel kann ich mir was das angeht eine komplexe Bewertungsfunktion sparen aber hier gehts ja auch ums allgemeine also yo.. Aber das führt mich zu ein paar Fragen. zu b.: Sind Evaluationen sinnvoll in Datenstrukturen? Was ist mit Listen? Lieber Listen oder Arrays? und was ist mit vordefinierten funktionen oder Linq Erweiterungen? Sollte man sie benutzen oder lieber vermeiden. Sowas wie Find, Exists, Cast<> ... zu c.: Was würdet ihr für eine Datenstruktur vorschlagen wenn man einen Baum eines selbstdefinierten Typs haben will? Spontan fallen mir nur Array und Listen ein, aber es gibt bestimmt auch spezielle Baum Datenstrukturen. Diese müssten aber generisch sein. zu d.: heißt das du schlägst vor in einer Datenstruktur sämtliche Zustände unterzubringen und in einer anderen nochmal separat die Bewertungen? wäre es nicht viel klüger das alles in einer zu kombinieren und die Bewertung in der Klasse unterzubringen die man für einen Zustand gewählt hat? Zuletzt möchte ich in dieser Diskussion noch ein Thema ansprechen dass mich persönlich am meisten fertig macht und das ist dieses Chaos mit Referenzen und Werten. Ich weiß nie wann in meinem Algorithmus nun der tatsächliche Wert oder nur eine Referenz übergeben wird. Ich komm auch immer ins grübeln darüber wann es Sinnvoll wäre die Referenz zu übergeben um nicht kopieren zu müssen. Ein Beispiel: Bei meinem Schachspiel habe ich in der Klasse für Spielfiguren ja auch deren Position auf dem Spielfeld hinein geschrieben und diese dann verständlicherweise verändert. Dafür musste ich aber unbedingt den Wert übergeben was dazu folgt dass ich jede einzelne verdammte Figur in jedem Knoten völlig neu erzeugen m musste. Das frisst natürlich enorm viel Zeit. Ich hatte auch zuerst den Ansatz mit der DeepCopy aber da in den Klassen auch andere Klassen und Referenzen auf meinen suchbaum waren habe ich die ja auch gleich mitkopiert und mir so meine Laufzeit noch mehr zerschossen. Kurze Anmerkung zu meiner Motivation: Meine Bachelorarbeit behandelte oberflächlich das Thema KI und es ist klar im Schach einen Zustandsbaum aufzustellen ist unmöglich. Aber weil ich das da nicht geschafft habe wollte ich diesmal wo es ja deutlich überschaubarer ist, es hinkriegen um in meiner Masterarbeit etwas neues anzubringen. Leider schaff ich es jetzt hier nichtmal üüber 3 spielzeuge hinaus. Bei Schach hab ich es irgendwann mal auf 7 Züge gebracht, was komisch ist da es da eigentlich viel mehr Spielzüge gibt auch in den ersten Runden besonders. Und jetzt noch ein letzter Punkt: Was meint ihr zum Thema maschinelles Lernen? Könnte man das irgendwie unterbringen? Ich hab ja praktisch den "statischen" Ansatz indem ich eine Bewertungsfunktion selbst aufstelle, aber dort die Gewichte mit einer Fehlerfunktion anzupassen dazu müsste ich unzählige Spiele durchzocken undd das könnte wieder viel Laufzeit fressen besonders weil man ja 1000+ Iterationen braucht um zum Ziel zu kommen.
  15. Optimiertes Erstellen eines großen Suchbaums

    Darum habe ich ja ein sehr unkomplexes Spiel gewählt. Mein erstes Spiel mit KI war schach das hat auch gut geklappt mit der Bewertungsfunktion und das obwohl ich nur die Suchtiefe 1 benutzt habe. Jetzt bin ich in der Komplexität etwas runtergegangen. Ich meine das Spiel hat nur 8x2 Spielzüge, MAXIMUM. das kann doch eigentlich nicht so schwer sein oder? Und man würde den Baum ja auch nocht zur Laufzeit erstellen. Aber es wäre sinnvoll die Laufzeit wenigstens auf 24 Stunden runterzubrechen, damit ich den Baum über Nacht in eine Datei schreiben kann, diese am Anfang des Spiels laden kann und so dann ein schönes Suchproblem anwenden kann. Wobei jetzt wo ich das so sage klingt das Prinzipiell sehr gut aber ich hab leider total vergessen dass der Spielfeldaufbau ja zufällig ist und nicht konstant womit dieser Ansatz am Ende wirklich hinfällig ist. Verdammt. Trotzdem es geht ja bei der Sache auch darum etwas zu lernen. Ich hab euch ja jetzt den fraglichen Code gezeigt fällt euch irgendeine Möglichkeit ein die Laufzeit dieses Alogirthmus zu zehnteln?
×