Hi, Ich habe in den letzten Wochen an meinem evolutionären Optimierungscode gebastelt und bin jetzt so weit, dass ich auf eine große Zahl Bedingungen prüfen kann.
- http://bitbucket.org/ArneBab/evolve-keyboard-layout/ Das Grundprinzip ist, jedem Tastendruck einen Kostenfaktor zuzuweisen, dazu weitere Kosten für Fingerwiederholungen u.ä. Theoretisch kann ich einen Großteil der Bedingungen abbilden, die einzelne Buchstaben, Bigramme und/oder Trigramme nutzen und dann die Tastatur so lange zufällig variieren, bis die Kosten um einen Text zu schreiben minimal werden (inklusive Beginn mit zufälliger Tastatur). Bisher allerdings nur für Ebene 1 plus Großschreibung mit Shift (heißt auch, dass Sonderzeichen bisher einfach ignoriert werden). Ich brauche allerdings sinnvolle Kostenfaktoren, sonst ist das ganze Modell sinnlos. Aktuell sieht das Grundmodell der Tastatur so aus: NEO_LAYOUT = [ [("^"),("1"),("2"),("3"),("4"),("5"),("6"),("7"),("8"),("9"),("0"), ("-"),("`"),()], # Zahlenreihe (0) [(),("x"),("v"),("l"),("c"),("w"),("k"),("h"),("g"),("f"),("q"),("ß"), ("´"),()], # Reihe 1 [("⇩"),("u"),("i"),("a"),("e"),("o"),("s"),("n"),("r"),("t"),("d"), ("y"),("⇘"),("\n")], # Reihe 2 [("⇧"),(),("ü"),("ö"),("ä"),("p"),("z"),("b"),("m"),(","),("."), ("j"),("⇗")], # Reihe 3 [(), (), (), (" "), (), (), (), ()] # Reihe 4 mit Leertaste ] ( http://bitbucket.org/ArneBab/evolve-keyboard- layout/src/25da1c40e553/check_neo.py#cl-168 ) Dazu gibt es für jede Position der Finger fixe Kosten (pro Tastendruck): COST_PER_KEY = [ # 0 heißt nicht beachtet [0,0,0,0,0,0,0,0,0,0,0,0,0,0], # Zahlenreihe (0) [0,6,3,3,3,4,4,3,3,3,6,7,8,0], # Reihe 1 [0,3,2,2,1,3,3,1,2,2,3,6,0,9], # Reihe 2 [0,5,5,5,5,5,7,7,5,5,5,5,0], # Reihe 3 [0,0,0, 9 ,0,0,0,0] # Reihe 4 mit Leertaste ] ( http://bitbucket.org/ArneBab/evolve-keyboard- layout/src/25da1c40e553/check_neo.py#cl-206 ) D.h. Die Tasten unter dem Zeigefinger kosten 1 (keine Einheit), die Tasten unter Mittel und Ringfinger kosten 2 und die Tasten unter dem Kleinen Finger kosten 3, usw. - Tasten mit Kosten 0 sollte es nicht geben, allerdings wird jedes Zeichen mit Kosten 0 zur Zeit ignoriert ( genauer: Tasten die geändert werden: http://bitbucket.org/ArneBab/evolve-keyboard- layout/src/783b6489128f/check_neo.py#cl-160 ). Zusätzlich kosten Fingerwiederholungen je 5 (zusätzlich zu den Kosten der Einzeltasten). (wer sich daran stört, dass die Kosten keine Einheit haben, kann einfach uke nehmen: Unteilbare Kosteneinheit :) ). Was ich jetzt brauche: - Wieviel soll welche Taste kosten? (Grundlage: 0 bedeutet, dass das Zeichen ohne Zeitaufwand und Belastung sofort im Rechner ist => theoretische telepathische Idealtastatur; die Minimalkosten pro Taste sind 1 (aus technischen Gründen). => Ich brauche einen Konsens darüber, wie COST_PER_KEY aussehen soll. - Wieviel soll eine Fingerwiederholung kosten (relativ zu den Kosten der Tasten)? „Was ist teurer, eine Fingerwiederholung oder zusätzlich mit dem kleinen Finger nach rechts oben greifen zu müssen?” => Welche Kosten pro Fingerwiederholung? - Was gibt es sonst an Kosten? (Beispiele: Zweimal die gleiche Hand verwenden. Bei drei Tasten mit der dritten Taste auf der gleichen Hand zu sein wie bei der ersten, aber weiter innen. … ) => Welche zusätzlichen Kostenfaktoren? Prinzipiell können zusätzliche Kostenfaktoren so gefunden werden: - Was ist die ideale Art, die 2 oder 3 Tasten hintereinander zu drücken? Das kostet nur das, was die Tasten einzeln kosten (keine Zusatzkosten). - Welche anderen Arten gibt es, die Tasten zu drücken? Wie viel schlechter sind die als die ideale Art? Im Vergleich dazu, eine einzelne Taste zusätzlich zu drücken? => Kosten für diese Art die Tasten zu drücken. Beispiel: - Ideal: Zwei Tasten hintereinander sollten auf unterschiedlichen Fingern liegen. - Kosten: Wenn sie auf dem gleichen Finger sind, kostet das 5 zusätzlich; soviel, als müsste ich mit einem Finger zusätzlich in die untere Reihe runter. Und solche Kosten brauche ich zur Optimierung. Was das Programm nämlich (etwas vereinfacht) macht ist, die Kosten aller Zeichen, Bigramme und Trigramme aus den verschiedenen Faktoren zu addieren und dann zufällig Tasten zu vertauschen (zwei oder mehr) und danach zu schauen, ob die Kosten des neuen Layouts niedriger sind. Wenn ja wird es beibehalten und dann von der Basis aus weiter gemacht. Wenn nein wird die Änderung verworfen. Also: Was gibt es an Kosten, auf die ein Layout optimiert sein sollte? (Ja, ich möchte dazu eine Diskussion lostreten - dadurch können wir die Anforderungen an eine Tastatur teilweise quantisieren. Wenn ich das habe, kann ich sie integrieren und dann nach diesen Kosten optimierte Layouts rechnen lassen. Da der Code evolutionär arbeitet, kommt am Ende kein einzig perfektes Layout heraus, sondern viele unterschiedlich stark optimierte, aus denen dann ein bestes ausgewählt werden kann. Was ich persönlich als Vorteil empfinde, weil alle Aussagekraft sowieso durch die Qualität der Kostenfaktoren bedingt wird. Da ist es ganz gut, dass das Programm gar nicht erst vorspiegelt, ein perfektes Ergebnis zu finden. Zur Geschwindigkeit: Aktuell kann ich binnen eines Tages etwa 100 zufällige Tastaturlayouts so weit optimieren, dass eine Vertauschung von Tasten keinen weiteren Vorteil bringt, oder 100 mal Neo evolutionär entwickeln (mit mehr Kostenfaktoren vermutlich etwas weniger). Das Programm rechnet dabei auf meinem schon etwas älteren Rechner etwa einen Evolutionsschritt pro Sekunde; normalerweise ist ein Layout nach 100 Schritten recht stabil und nach 1000 tut sich selten noch was. Liebe Grüße, Arne PS: Wenn ihr das Programm selbst ausprobieren wollt: - http://bitbucket.org/ArneBab/evolve-keyboard-layout/ Direkter Download der aktuellen Version: - http://bitbucket.org/ArneBab/evolve-keyboard-layout/get/tip.bz2 Oder über Mercurial ( http://mercurial.selenic.com ): - hg clone https://[email protected]/ArneBab/evolve-keyboard-layout/ Da dann ./check_neo.py --help Beispiel 1: Neo 100 Schritte weit evolutionär entwickeln: ./check_neo.py --evolve 100 Beispiel 2: Neo vs. Qwertz mit beliebigem Text: ./check_neo.py --file beispieltext-prosa.txt Beispiel 3: Neo vs. Qwertz mit 1gramme.txt und 2gramme.txt ./check_neo.py Beispiel 4: Zufälliges Layout 100 Schritte weit entwickeln ./check_neo.py --evolve 100 --prerandomize 100000 (damit das läuft braucht ihr außerdem Python 3.x -> http://python.org ) PPS: Ich tippe inzwischen fast nur noch mit Neo weil es sich einfach natürlicher anfühlt, auch wenn mir noch manchmal über mehr als ein Jahrzehnt eintrainierte Reflexe in die Quere kommen :) PPPS: Wenn das Prog in ein lokales Minimum rutscht und Einzeländerungen nichts mehr bringen, geht es nach 100 erfolglosen Einzelersetzungen zu Zweifachersetzungen über, nach 1000 dann zu Dreifachersetzungen, … P4S: Die Ausgabe des Evolutionsdurchgangs kann direkt wieder als neues Layout in der Datei genutzt werden. Mit "-q" werden Zwischenstatusinfos weggelassen (nützlich für Mehrfachausführung in einer Schleife, um nicht von der Ausgabe erschlagen zu werden). P5S: Ein paar weitere Infos dazu: http://draketo.de/licht/freie- software/neo-tastaturlayout-pruefen-und-evolutionaer-entwickeln
