*******************************************************************************
*** Schachprogramm "Jonny" Kurzbeschreibung***

0. Haftungsausschluß
1. Was ist "Jonny"?
2. Installation
   2.1 Hardwareanforderungen
   2.2 Installation unter Windows
       2.2.1 Installation unter Winboard
       2.2.2 Installation unter Fritz
   2.3 Installation unter Linux
3. Kurzreferenz zur Bedienung im Konsolenfenster
4. Parameter in der Datei "settings.ini"
5. Entstehungsgeschichte
6. Turnierteilnahmen, geschätzte Spielstärke
7. sonstiges
   7.1 Woher der Name?
   7.2 Dank an...
   7.3 Anregungen, Kritik, usw.   

0. Haftungsausschluß
   Kurz das übliche: Auch wenn "Jonny" sehr sorfältig entwickelt und 
   ausführlich getestet wurde, übernehme ich keinerlei Haftung für Schäden
   irgendwelcher Art, die im Zusammenhang mit der Benutzung des Programms
   entstehen.

1. Was ist "Jonny"?
   "Jonny" ist ein Freeware-Schachprogramm für Windows und Linux. Allerdings
   ist eine Bedingung zur Weitergabe, dass diese Datei (readme.txt) jeder Kopie
   unverändert beigefügt wird. Obwohl man "Jonny" auch in der Konsole laufen
   lassen kann (siehe 3.), so rate ich doch dringend zur Verwendung eines
   graphischen Benutzerinterfaces. Da Jonny eine Winboard-Engine ist, sollten
   alle Oberflächen, die dieses Protokoll unterstützen, geeignet sein,
   ausprobiert habe ich es mit "Winboard", "Arena" und "xboard". Allerdings
   habe ich unter diesen Oberflächen nur vereinzelt getestet, hier können
   durchaus noch ein paar Bugs auftreten; auch sind nicht alle Kommandos des
   Winboard-Protokolls implementiert. Wer lieber unter der "Fritz"-Oberfläche
   arbeitet, kann "Jonny" dort zusammen mit dem beigelegten Winboard-Adapter
   verwenden. Näheres zur Installation unter (2.2) bzw. (2.3).

2. Installation
   2.1 Hardwareanforderungen
       "Jonny" sollte auf jedem Rechner der Klasse Pentium oder höher ab 16 MB
       RAM (bei entsprechend klein eingestellten Hash- und Pawntables) mit
       Windows (9x, ME, 2000, NT, XP) bzw. Linux zum Laufen zu bewegen sein.
   
   2.2 Installation unter Windows
       2.2.1 Installation mit Winboard
             Winboard ist eine frei erhältliche Oberfläche, in die beliebige
             Schachprogramme eingebunden werden können, welche das
             entsprechende Protokoll unterstützen. Eine Downloadmöglichkeit 
             besteht z.B. unter http://www.tim-mann.org/xboard.html. Nach 
             erfolgter Winboard-Installation muss man lediglich die im
             Ziparchiv enthaltenen Dateien JonnyXYZ.exe (XYZ=Versionsnummer)
             und Settings.ini ins Winboard-Verzeichnis kopieren. Vor dem ersten
             Start empfiehlt es sich, die Hash- und Pawntablegröße dem
             Arbeitsspeicher des eigenen Rechners anzupassen (siehe hierzu 4.).
             Im Startdialog von Winboard ist nun lediglich noch die Option
             "Play against a chess engine or match two engines" zu wählen und
             in der ersten Zeile der Name der exe-Datei einzugeben, also
             "JonnyXYZ". Alles weitere ist dann der Winboard-Dokumentation zu
             entnehmen; allerdings können durchaus ein paar Dinge, die dort
             angegeben sind, mit "Jonny" nicht funktionieren, da wie gesagt
	     nicht das gesamte Winboard-Protokoll unterstützt wird.

      2.2.2 Installation mit Fritz
            Die Einbindung unter Fritz läuft über den Winboard-Adapter, den ich
            mit freundlicher Genehmigung von Chessbase hier beilegen darf.
            Hierzu müssen Sie lediglich das gesamte Zip-File unter Erhaltung
            der Verzeichnisstruktur in das "Engines"-Verzeichnis Ihrer
            Fritz-Installation entpacken. Sollte aus irgendeinem Grund die
            Verzeichnisstruktur verloren gehen, hier noch einmal, welche Datei
            wo hingehört:
            jonnyXYZ.eng  : \Engines
            jonnyXYZ.exe  : \Engines\JonnyXYZ
            settings.ini  : \Engines\JonnyXYZ
            jonnyXYZ.init : \Engines\JonnyXYZ
            jonnyXYZ.bmp  : \Engines\JonnyXYZ           

            Beim nächsten Start von Fritz sollte dann eine neue Engine namens
            "JonnyXYZ" anwählbar sein.

   2.3 Installation unter Linux
       Wer in der Konsole spielen will, muss lediglich die zwei Dateien
       jonnyXYZ und settings.ini in ein beliebiges Verzeichnis entpacken.
       Wesentlich komfortabler ist allerdings xboard, die Linux-Entsprechung zu
       Winboard. Nach Installation von xboard wird "Jonny" dort mit
       xboard -fcp PFAD/jonnyXYZ eingebunden, wobei "PFAD" das Verzeichnis ist,
       in das die Dateien entpackt wurden. Genaueres liefert die xboard-Hilfe;
       hier gilt das gleiche wie schon in 2.2.1: wahrscheinlich nicht alles,
       was dort steht, wird auch von "Jonny" unterstützt. 

3. Kurzreferenz zur Bedienung im Konsolenfenster:
   Da Jonny eigentlich nicht für die Bedienung auf Konsolenebene gedacht ist,
   werden hier nur die wichtigsten Kommandos erläutert:
   "sd x"   : setzt die Suchtiefe, bis zu der Jonny rechnet, auf den Wert x.
              Die evtl. mit dem "time"-Kommando vorgenommene Einstellung wird
              dann ignoriert.
   "time x" : setzt die verbleibende Zeit auf den Wert x (in 1/100 s); "Jonny"
              aktualisiert diese Zeit nicht selbst, so dass sie vor jedem Zug
              prinzipiell neu gesetzt werden muss, sonst wird bei jedem Zug von
              der verbleibenden Zeit x ausgegangen. Die evtl. mit dem 
              "sd"-Kommando vorgenommene Einstellung wird dann ignoriert.
   "edit"   : Startet den Edit-Modus (mit dem in der letzten Stellung
              vorliegenden Zugrecht). Hiernach stehen folgende Kommandos zur
              Verfügung:
              "#": leer das Brett
              "Kxy","Qxy","Rxy","Bxy","Nxy","Pxy": setzt König/Dame/Turm/
                                                   Läufer/Springer/Bauer der
					           Partei, für die momentan das
 						   Zugrecht gesetzt ist, auf
					           das Feld xy.
              "c": wechselt das Zugrecht
              ".": verläßt den Edit-Modus mit dem zuletzt eingestellten
                   Zugrecht; eine Überprüfung der Stellung auf schachliche
                   Korrektheit findet derzeit nicht statt, hier lassen sich
                   also leicht Abstürze produzieren...
   "force"  : erlaubt es, Züge einzugeben, ohne dass die Engine darauf
              antwortet. Eine zweite Eingabe hebt das Kommando wieder auf.
   "undo"   : nimmt einen Halbzug zurück
   "remove" : nimmt zwei Halbzüge zurück
   "xboard" : schaltet in den Winboard-Modus, in dem die Anzeigen zur Suche
              etwas kompakter dargestellt werden und die Brettdarstellung
	      abgeschaltet wird. Nochmalige Eingabe nimmt das Kommando zurück.
   "hard"   : hiernach beginnt "Jonny" nach jedem ausgespielten Zug automatisch
	      auf die Zeit des Gegners nachzudenken. 
   "easy"   : nimmt das "hard"-Kommando zurück
   "quit"   : beendet das Programm
   "new"    : startet eine neue Partie
   "go"     : fordert die Engine zum Nachdenken auf
   "?"      : bricht den Rechenvorgang ab; der momentan für am besten gehaltene
              Zug wird ausgespielt
   "abcd"   : Eingabe eines eigenen Zuges in der Form "e2e4", wenn die Figur
              vom Feld e2 nach e4 ziehen soll

4. Parameter in der Datei "settings.ini"
   Modifikationen in dieser Datei erlauben es dem Benutzer, den Spielstil von
   "Jonny" in gewissen Grenzen zu verändern. Hier eine kurze Beschreibung der
   einzelnen Parameter:

   //Parameter für Tabellengröße
   nHashTables        : gibt an, wie viele Hashtabelleneinträge "Jonny"
                        verwendet. Diese Variable sollte dem Arbeitsspeicher
                        des Rechners angepaßt sein (eine Million Einträge
                        benötigt jeweils etwa 12 MB Speicher). Wird keine
                        Zweierpotenz angegeben, so rundet "Jonny" zur
			nächstliegenden ab.

   nPawnTables        : dto. für die Pawntables, hunderttausend Einträge
                        benötigen etwa 5MB.

   //Parameter für Figurenwerte 
   pawnValue etc.     : Materialwerte für Bauer, Springer, usw.
   
   //positionelle Parameter
   endgameMaterial    : Gesamtmaterial, ab dem für "Jonny" das Endspiel
                        beginnt; das hat u.a. zur Folge, dass die
                        Königssicherheit kaum noch berücksichtigt wird
   rookOn7th          : Wert für einen Turm auf der 7. Reihe
   pairOfBishops      : Bonus für Besitz des Läuferpaares
   activeBishop       : Bonus für einen aktiven Läufer (nicht absolut)
   doublePawn         : Abzug für jeden Doppelbauern
   isolatedPawn       : Abzug für jeden isolierten Bauern
   Outpost            : Wert für einen Vorposten, also einen Springer oder
                        Läufer in der Brettmitte, der nicht mehr von
                        gegnerischen Bauern angegriffen werden kann
   centerPawn         : Bonus für Zentrumsbauern
   weakSquare         : Abzug für jedes schwache Feld in der Bauernstruktur
   unprotectedPawn    : Abzug für ungeschützte Bauern
   blockedCPawn       : Abzug für die Konstellation Sc3/Bc2/Bd4 
   UncastledKing      : Abzug für einen in der Mitte hängengebliebenen König
   NoShortCastling    : Abzug, wenn der König in der Mitte steht und keine
                        kurze Rochade mehr möglich ist
   NoLongCastling     : dto. für die lange Rochade
   missingFianchettoB.: Abzug, wenn der Fianchetto-Läufer auf der Seite des
 			eigenen Königs abgetauscht wurde
   RightToMove        : Bonus für das Zugrecht
   centeredKing       : Je höher dieser Wert, desto mehr wird im Endspiel auf
			Zentralisation des Königs geachtet (kein absoluter
                        Wert)
kingFarFromPassedPawn : Abzug, wenn der eigene König weit entfernt von einem
			gegnerischen Freibauern steht
rookBehindPassedPawn  : Bonus für Türme hinter eigenen Freibauern
   rookAgainstNoRook  : Hat eine Partei noch mind. einen Turm auf dem Brett und
			der Gegner nicht, so erhält sie diese Bonus
   QNAgainstQB        : Bonus für die Partei mit Springer im Endspiel D+S - D+L
   blockedCenterPawn  : Abzug, wenn ein Zentrumsbauer auf d2/e2 bzw. d7/e7
                        durch eine Figur blockiert wird
   backstandingPawn   : Abzug für einen rückständigen Bauern
   trappedBishop      : Abzug für einen eingesperrten Läufer auf a2/h2/a7/h7
   narrowedRook       : Abzug für einen Turm, der keine direkte
                        Rückzugsmöglichkeit auf die eigene Grundreihe besitzt
                        und beengt steht
   trappedRook        : Abzug für einen Turm, dessen Entwicklung vom eigenen, 
                        nicht mehr rochadefähigen König behindert wird		
   badBishop          : Abzug für einen schlechten Läufer
   rookOnOpenLine     : Bonus für einen Turm auf einer offenen Linie
   rookOnHalfOpenLine : Bonus für einen Turm auf einer halboffenen Linie
   doubledRooks       : Bonus für verdoppelte Türme
   centerControl      : je höher dieser Wert, desto stärker wird die
			Zentrumskontrolle gewichtet (kein absoluter Wert)
   spaceAdvantage     : je höher dieser Wert, desto stärker wird Raumvorteil
			gewichtet (kein absoluter Wert)
   pawnStormValue     : je höher dieser Wert, desto höher werden Bauernstürme
			auf den gegnerischen König bewertet (kein absoluter
			Wert)

   //Parameter für den Algorithmus
   aspirationWindow   : legt Breite des sog. aspiration-Window fest 
   maxCompensation    : Schätzwert für die maximal mögliche positionelle
			Kompensation bei Materialnachteil; ein höherer Wert
			verlangsamt die Suche, dafür werden u.U. öfter
			interessante Opfer gespielt
   maxExtensions      : Obergrenze für die Gesamtzahl an Erweiterungen während
			der Suche
   selectivity1       : bezeichnet ein Maß für die Selektivität in den vorderen
			Knoten des Baumes; je niedriger dieser Wert, desto
			selektiver wird gesucht (Extremwert: 0)
   selectivity2       : dto. für Knoten im hinteren Teil des Baumes (d.h. kurz
			vor Erreichen des Horizontes)

   //Parameter für den Tablebase-Zugriff	
   TBdistance         : Mindestdistanz bis zur Ruhesuche, damit auf die TBs
			zugegriffen wird; bei einem niedrigeren Wert erfolgen
			mehr Zugriffe, aber der Knotendurchsatz bricht u.U. ein
   TBCacheSize        : Größe des TB-Caches in Byte
   TBPath             : Pfad zum TB-Verzeichnis

   //Settings für das Zeit-Management
   considerPonderTime : wird dieser Wert auf 1 gesetzt, so geht Jonny davon
			aus, dass er auch nachdenken kann, während der Gegner
 			am Zug ist und nimmt sich deshalb grundsätzlich etwas
 			mehr Zeit für seine Züge (jeder andere Wert als 1
			schaltet dieses Feature aus) 

   //Settings für Ausgabeverhalten
   showCurrentMove    : nur für erfahrene Benutzer: falls 1, dann wird während
			des Rechenvorgangs mittels des stat01-Kommandos der
			aktuell berechnete Zug an die GUI geschickt. Der
                        beigelegte Winboard-Adapter für Fritz kommt damit
			offenbar nicht zurecht und "verschluckt" teilweise
			Ausgaben! Jeder andere Wert als 1 schaltet dieses
                        Feature aus.  
   resignValue        : nur für erfahrene Benutzer: Wert, ab dem Jonny aufgibt.
			Dieser wird zuvor negiert (d.h. ein Wert von 900
			bedeutet, dass Jonny bei einer Suche mit Ergebnis
                        <=-900 aufgibt). Werte <=0 schalten die Aufgabe ab.
   writeLogFile       : 0 schaltet hier das Mitprotokollieren der Kommunikation
                        und Programmausgaben in der Datei "jonnycom.log" ab   

5. Entstehungsgeschichte
   "Jonny" ist ein noch relativ junges Programm, ich arbeite daran seit August
   2002. Allerdings gab es schon einige "Vorgänger": meine erstes
   Schachprogramm programmierte ich noch auf einem alten Atari ST unter
   GFA-Basic; später schrieb ich die Bewertungsfunktion in Assembler um, das
   brachte zwar eine deutliche Beschleunigung, konnte aber nix dran ändern,
   dass die Spielstärke nach wie vor nicht allzu berauschend war. Es ging aber
   damals ehrlich gesagt auch nur darum, mir zu beweisen, das ich prinzipiell
   ein funktionsfähiges Schachprogramm schreiben kann. Somit war ich fürs erste
   zufrieden und ließ die Sache zunächst 4-5 Jahre ruhen. Bis dann im
   Mathe-Leistungskurs die Facharbeit anstand und mir die Idee kam, ich könnte
   doch die Entwicklung eines Schachprogramms als Thema nehmen. Da meine
   Kursleiterin nichts dagegen hatte, begann ich noch vor der endgültigen
   Themenvergabe ein Grundgerüst in x86-Assembler zu programmieren. Dieses
   "Programm" konnte auch schon schachspielen, blieb aber leider unvollendet:
   da meine LK-Leiterin wenig von Informatik verstand, wurde mir als Betreuer
   ein Dozent der Universität Erlangen zugeteilt, der sehr darauf drängte, das
   Schachprogramm doch zwecks Objektorientierung in Java zu schreiben. Ich ließ
   mich dazu breitschlagen und begann nochmal von vorne in Java, allerdings
   habe ich dabei einige Regeln der objektorientierten Programmierung aus 
   Unwissenheit ziemlich vergewaltigt, so dass am Ende zwar ein Java-Programm
   ("Mattjoe") entstand, das jedoch wenig der Vorteile der Objektiorientierung
   ausnutzte und außerdem recht langsam war. Die Spielstärke war trotzdem schon
   ganz ordentlich, vielleicht Elo 2100-2150 auf einem aktuellen Rechner. Nach
   Abgabe der Facharbeit machte ich mich daran, den Programmcode aus
   Geschwindigkeitsgründen in C umzuschreiben, was nicht allzu lange dauerte;
   soweit ich mich erinnere, lief "Mattjoe" danach etwa 3-4 mal schneller und
   spielte auch dementsprechend stärker. Als nächstes baute ich die wichtigsten
   Winboard-Kommandos ein und hatte dann mit der Fritz-GUI (+Winboardadapter)
   eine schöne Oberfläche zum Testen und Spielen von Enginematches zur 
   Verfügung. Ein bißchen habe ich "Mattjoe" dann noch weiterentwickelt, die
   Spielstärke der letzten Version beträgt wohl so Elo 2250-2300. Allerdings
   sind mir dann einige grundsätzliche Fehler im Ansatz (Brettdarstellung etc.)
   aufgefallen, die einen hohen Knotendurchsatz verhinderten. So machte ich
   mich in der Zeit nach meinem Zivildienst daran, ein von Grund auf neues
   Programm in C zu schreiben: "Jonny" eben...

6. Turnierteilnahmen, geschätzte Spielstärke
   Bisher hat "Jonny" an sechs offiziellen Turnieren teilgenommen:
   auf der WCCC 2003 in Graz erzielte er mit 4,0 Punkten aus 11 Partien ein
   Ergebnis, mit dem ich durchaus leben konnte, wobei in manchen Partien auch
   mehr drin war. Das zweite Turnier, an dem ich teilgenommen habe, war die
   6. Auflage des alljährlich von Volker Richey im ICC ausgetragenen CCT. 
   Hier konnte "Jonny" sehr ordentlich abschneiden und erzielte 5.5 Punkte aus
   9 Partien, darunter allerdings ein kampfloser Sieg. Ein großer Erfolg war
   der 6. Platz der Version 2.64 mit 6.5/11 bei der WCCC 2004 in Ramat Gan,
   womit "Jonny" das beste teilnehmende Einprozessorsystem war. Dagegen
   stellten die 3.5/9 von "Jonny 2.75" im CCT7 (Feb. 2005) einen kleinen
   Rückschlag dar, zumal auch einige Partien gegen relativ unbekannte Gegner
   verlorengingen. Beim IPCCC 2005 in Paderborn erzielte die Version 2.76 
   4.5 Punkte aus 9 Partien, womit ich alles in allem zufrieden war, zumal
   Jonny viele interessante Partien spielte.
   Der bisher größte Erfolg ist die Erringung des Vizeweltmeistertitels
   bei der 1. Livingston-WM im Fischer-Random-Schach (Mainz 2005), einer
   Schachvariante, bei der zu Beginn der Partie die Aufstellung der Figuren
   auf der Grundreihe unter gewissen Einschränkungen ausgelost wird; die
   Rochaderegel wird entsprechend modifiziert. Jonny 2.82 holte hier mit 5.5/7
   genauso viele Punkte wie der Turniersieger Spike 1.0 und wurde nur aufgrund
   der Buchholzwertung Zweiter. Auf der anschließenden Computer-WM im
   klassischen Schach in Reykjavik (Island) erzielte Jonny leider nur 4.5/11
   und wurde Achter unter 12 Teilnehmern. 
   Jonny 2.82 muss man wohl als "starkes Amateurprogramm" einordnen,der Abstand
   zum derzeitigen Spitzenreiter "Shredder 9" beträgt ca. 150-170 Elopunkte.

7. sonstiges
   7.1 Woher der Name?
       Als das Grundgerüst des Programms geschrieben war, stellte sich mir das
       schwierigste Problem: wie sollte das Kind denn nun heißen? Etwas ratlos
       ließ ich meinen Blick durchs Zimmer schweifen, bis er plötzlich an dem
       kleinen Plastikdampfer hängen blieb, den ich als Kind so gern hatte -
       besser gesagt an dem auf der Kajüte angebrachten Namensschild:
       "Jonny"...
   
   7.2 Dank an...
       - Eugene Nalimov und Andrew Kadatch für den hervorragenden Code zum
         Tablebasezugriff und die Erlaubnis, ihn in "Jonny" verwenden zu dürfen
       - Chessbase für die Erlaubnis, den Winboard-Adapter hier beizulegen
       - meinen Studienkollegen von der Uni Bayreuth, Christoph Groth, der mir
         bei der Portierung auf Linux mit großer Geduld und Kompetenz geholfen
         hat
       - Wilhelm Hudetz, der ein schönes Logo für "Jonny" erstellt hat
       - Jörg Oster, der sich seit kurzem als Beta-Tester für mich betätigt

   7.3 Anregungen, Kritik usw.
       Ich bin immer dankbar für Anregungen und Hinweise aller Art, sei es die
       Mitteilung eines Bugs, die Feststellung einer markanten Schwäche in der
       Engine o.ä.; besonders freuen würde ich mich, wenn jemand Zeit und Lust
       hat, "Jonny" mal mit anderen Parametern als den voreingestellten zu
       testen (gerne auch Blitz- und Schnellschach) und mir dann die Ergebnisse
       ggf. mitteilt. Allerdings sollte es sich schon um eine aussagekräftige
       Zahl von Partien handeln, durch 20 Partien läßt sich eine Verbesserung
       um vielleicht 20-30 Elopunkte nicht nachweisen; bei "extrem positivem"
       Abschneiden im Turnierschach mit normaler Bedenkzeit interessieren mich
       aber auch solche Ergebnisse. Da Jonny derzeit noch nicht über ein
       Eröffnungsbuch verfügt, würde ich Tests aus vorgegebenen Stellungen
       empfehlen. Wenn sich jemand dauerhaft als Betatester betätigen will,
       darf er mich natürlich auch gerne kontaktieren. Wer "Jonny" irgendwo
       öffentlich einsetzt (Turniere mit Veröffentlichung im Internet, ICC,
       etc.), den bitte ich vorher um kurze Mitteilung. 

       Kirchehrenbach, den 24.08.2005
       Johannes Zwanzger (Email: johannes.zwanzger@t-online.de)

  