Hi, Ich habe check_neo inzwischen so weit, dass es auf die meisten Kriterien prüfen und ein Layout darauf optimieren kann.
Allerdings arbeitet das Layout aktuell mit hächstens abgeschätzten Parametern, daher brauche ich Hilfe, um es wirklich sinnvoll zu machen. Das Layout verwendet Kostenparameter, um die Güte eines Layouts zu berechnen, und alles steht und fällt damit, wie gut diese Parameter sind (zusammen mit der Qualität der Wortliste). Ihr könnt die Parameter recht einfach selbst anpassen und mit euren Werten testen (sie stehen im Skript aktuell in den Zeilen 257 bis 276, kommen aber auch gleich in dieser Mail: http://bitbucket.org/ArneBab/evolve-keyboard- layout/src/4bc6c132ec95/check_neo.py#cl-257 ). Bitte nicht erschrecken, wenn das etwas unübersichtlich wirkt. Sie sind alle hinter dem Wert auf Englisch erklärt. Jeder Wert hier steht für die Gewichtung einer Kostenfunktion. Desto höher sie ist, desto wichtiger ist der Punkt in der Berechnung. Wenn ihr zu einer davon Fragen oder Anmerkungen habt, dann schreibt es bitte! WEIGHT_POSITION = 1 #: reference WEIGHT_FINGER_REPEATS = 8 #: higher than a switch from center to side, but lower than a switch from center to upper left. WEIGHT_FINGER_REPEATS_TOP_BOTTOM = 16 #: 2 times a normal repeat, since it's really slow. Better two outside low or up than an up-down repeat. WEIGHT_FINGER_DISBALANCE = 5 #: multiplied with the standard deviation of the finger usage - value guessed and only valid for the 1gramme.txt corpus. WEIGHT_TOO_LITTLE_HANDSWITCHING = 1 #: how high should it be counted, if the hands aren’t switched in a triple? WEIGHT_INTENDED_FINGER_LOAD_LEFT_PINKY_TO_RIGHT_PINKY = [ 1, 2, 2, 3, 1, 1, 3, 2, 2, 1] #: The intended load per finger. Inversed and then used as multiplier for the finger load before calculating the finger disbalance penalty. Any load distribution which strays from this optimum gives a penalty. WEIGHT_XCVZ_ON_BAD_POSITION = 0.1 #: the penalty *per letter* in the text if xvcz are on bad positions (cumulative; if all 4 are on bad positions (not in the first 5 keys, counted from the left side horizontally) we get 4 times the penalty). Außerdem gibt es noch die Kosten pro Taste, Zeile 356 ( http://bitbucket.org/ArneBab/evolve-keyboard- layout/src/4bc6c132ec95/check_neo.py#cl-356 ) Hier müssen noch die Kosten für die Gesamtbelastung der Finger rausgenommen werden, da die schon woanders abgedeckt werden. Also sollte nur noch die Erreichbarkeit der Taste (und die Geschwindigkeit des jew. Fingers) und die Belastung die ein Druck auf genau diese Taste bringt drinstehen, nicht aber sowas wie „der Kleine ist eh schwächer, auch wenn genau die Taste für ihn eigentlich kein Problem ist“. # Structured reweighting (but still mostly from experience and deducing from the work of others). 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, 12,9,6,4,10,10,4,6,9,12,15,18,0], # Reihe 1 [0, 5,3,3,2,5,5,2,3,3,5,12,0,15], # Reihe 2 [15,0,10,11,11,7,12,10,7,11,11,10,15], # Reihe 3 [0,0,0, 5 ,0,0,0,0] # Reihe 4 mit Leertaste ] Der Punkt braucht allerdings überarbeitung. Wenn sich jemand von euch mal die Kosten pro Taste vornehmen will, würde ich (dem Vorschlag von Michael Ostermeier folgend) vorschlagen, dem Zeigefinger nicht wie hier 2, sondern 10 Strafpunkte zu geben, dann haben wir mehr Flexibilität. Die Bedingung ist, dass die Punkte ganze Zahlen sind (sonst wird der Code unnötig langsamer). Nun aber dazu, wie ihr es selbst testen könnt (nur unter GNU/Linux geprüft; ich habe hier nichts anderes): 1. Tarball-Snapshot (braucht Python3 → http://python.org/download ) - wget http://bitbucket.org/ArneBab/evolve-keyboard- layout/get/55e78a669261.bz2 - tar xf 55e78a669261.bz2 - cd evolve-keyboard-layout/ - ./check_neo.py 2. Versionsverwaltung (braucht Python3 und Mercurial): - (falls noch nicht vorhanden: easy_install mercurial ) - hg clone https://[email protected]/ArneBab/evolve-keyboard-layout/ - cd evolve-keyboard-layout/ - ./check_neo.py Der Aufruf started den Vergleich der Ergebnisse für Neo, Qwertz, Nordtast, Dvorak und Colemak. Alle Vergleiche nutzen die Leipziger Wortliste. Wenn ihr eine andere Wortlist wollt, müsst ihr nur 1gramme.txt, 2gramme.txt und 3gramme.txt austauschen. Zusätzlich könnt ihr ein Layout durch zufällige Mutationen entwickeln lassen, d.h. es werden zufällig Tasten vertauscht, und wenn das mutierte Layout besser ist (weniger Strafpunkte hat) als das alte, wird die Mutation behalten. Was z.B. interessant sein dürfte: ./check_neo.py --evolve 1000 1000 Mutationen testen. Ein paar andere Methoden findet ihr via ./check_neo.py --help Das einfachste evolve scheint aber am effizientesten zu sein. Mit der Bash könnt ihr außerdem viele Ergebnisse hintereinander berechnen (z.B. nützlich, um den Rechner eine Urlaubswoche lang arbeiten zu lassen). Hier z.B. für 100 Layouts: for i in {0..99}; do time ./check_neo.py --evolve 1000 --prerandomize 10000 -q; done>> 2010-03-28-evolve-1000-results.txt „-q“ hier sagt: zeig mir nur das Ergebnis, nicht die Zwischenschritte. Das beste findet ihr hier z.B. via grep, sort und tail. Hier für Fingerwiederholungen grep 2gramme 2010-03-28-evolve-1000-results.txt | sort -ur | tail Dann nach dem besten Ergebnis suchen. Mein aktuell bestes für Fingerwiederholungen: grep "1.02004994329 % finger repeats in file 2gramme.txt" 2010-03-26- evolve-10000-results.txt -A3 -B8 # Evolved Layout [['^', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '`', ()], [(), 'ö', 'w', 'c', 'a', 'ä', 'f', 'h', 'u', 'm', 'y', 'x', '´', ()], ['⇩', 't', 'n', 'r', 'e', 'o', 'g', 'd', 'i', 's', 'l', 'ß', '⇘', '\n'], ['⇧', (), 'ü', 'p', 'v', '.', 'q', 'k', 'b', 'j', 'z', ',', '⇗'], [(), (), (), ' ', (), (), (), ()]] # 1.30856908 billion total penalty compared to notime-noeffort # 14.8497008604 million keystrokes disbalance of the fingers # 1.02004994329 % finger repeats in file 2gramme.txt # 0.212532496307 % finger repeats top to bottom or vice versa # 8.94816062502 % of trigrams have no handswitching (uppercase ignored) # 4.00409258152 mean key position cost in file 1gramme.txt Nebenbei: Die Befehle hängen alle an die Ausgabedatei an, so dass es nur eine sehr geringe Chance gibt, dass sie sich in die Quere kommen, wenn ihr einfach mehrere nebeneinanden startet. Am effizientesten ist einer pro Prozessorkern. Ich lasse dieses Wochenende so eine Rechnung laufen, allerdings gleich mit 10 000 Mutationsschritten, so dass bei mir ein einzelner Durchlauf knapp 5 Stunden dauert. Nun aber viel Spaß beim Spielen :) Ich würde mich über eure Rückmeldung freuen - und natürlich auch darüber, wenn ihr eure interessantesten Ergebnisse schreibt. Liebe Grüße, Arne PS: Solltet ihr auf einen Bug stoßen, dann schreibt das bitte auch. Ich habe die letzten Tage recht viel umstrukturiert, so dass sich noch ein paar Fehler im Code verstecken könnten… PPS: Die Tests laufen grade nicht ganz durch, weil ich an ein paar Kostenfunktionen gedreht habe, also erschreckt nicht, wenn ./check-neo.py --check Fehler auswirft. --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- - singing a part of the history of free software - http://infinite-hands.draketo.de
signature.asc
Description: This is a digitally signed message part.
