////////// // Binäre Klassifikation mittels Fehlerkorrektur-Algorithmus // Matthias Jauernig, 15.01.2008 ////////// ////////// // Auswertungen: Buchstabe (Merkmal1,Merkmal2) | !Buchstabe für nicht trennbar // ABCDEFGHIJKLMNOPQRSTUVWXYZ // AV (1,6) // BD (5,6) // BP (2,6) // BS (1,6) // CG (1,6) // CO (1,6) // OQ (1,6) // EF (6,7) // EH (5,6) // EM (5,7) // FK (5,6) // KL (1,6) // MN (5,6) // MX (1,6) // MY (1,6) // IJ (5,7) // !IL // JL (5,7) // PR (1,6) // UV (1,6) // UW (1,6) // TY (5,6) // XY (2,5) // XZ (1,5) ////////// // Verfügbare Merkmale: // 1 = Formfaktor // 2 = Konvex-Formfaktor // 3 = Füllungsgrad // 4 = Flächenrelation (ohne-Löcher / mit-Löcher) // 5 = Elongation // 6 = Kontur-Konvex-Flächenrelation (Kontur durch konvexe Kontur) // 7 = Konvex-Kontur-Längenrelation (konvexe Kontur durch Kontur) ////////// // Liefert die Anzahl zu erzeugender Punkten pro Klasse zurück. PROCEDURE GETPCOUNT 'reg SOUT ^Schreibe Konfiguration in fkorr.cfg^; PLF FRESET handle ^fkorr.cfg^ 1 IFN RCODE = 0 THEN FREWRITE handle ^fkorr.cfg^ FRESET handle ^fkorr.cfg^ 1 NRM ENDIF FWRITE handle 28 reg FCLOSE handle ENDP ////////// ////////// // Liest die Konfiguration aus der Datei fkorr.cfg ins Register ab reg. PROCEDURE readconf '>reg SOUT ^Lese Konfiguration aus fkorr.cfg^; PLF FRESET handle ^fkorr.cfg^ 0 IFN RCODE = 0 THEN SOUT ^Lege Konfigurationsdatei fkorr.cfg an^; PLF FREWRITE handle ^fkorr.cfg^ writeconf reg FRESET handle ^fkorr.cfg^ 0 NRM ENDIF FREAD handle 28 reg FCLOSE handle ENDP ////////// ////////// // Liest vom Benutzer einen Buchstaben ein (Nummer bn). PROCEDURE readBuchstabe '>bn +bn^ = bn ^bn + ^. Buchstaben eingeben und ENTER drücken^ = bt; TEXT bt 10 {40+{bn-1*20}} 12 +0 = ende WHILE ende = 0 SINP Buchstabe ^Buchstabe ORD = b IF b>96 and b<123 THEN ;// Umwandlung in Großbuchstaben +b - 32 = b ENDIF IF b>64 and b<91 THEN ;// Wenn Buchstabe, dann ist alles ok +1 = ende +b CHR = b TEXT b 370 {40+{bn-1*20}} 12 +b-64 = #{bn-1} ;// in Ergebnisregister speichern ENDIF ENDWHILE ENDP ////////// ////////// // Untermenü zur Buchstabenkonfiguration. PROCEDURE confBuchstaben PCLR 1 +#0 + 64 CHR = b1 +#1 + 64 CHR = b2 ^^Derzeit: Buchstabe 1 = ^+b1+^, Buchstabe 2 = ^+b2 = t TEXT t 10 10 12 readBuchstabe 1 readBuchstabe 2 writeconf 0 TEXT ^ENTER zum Fortfahren^ 10 100 12 pause PCLR 1 ENDP ////////// ////////// // Liefert den Namen des Merkmals mnr zurück. PROCEDURE getMerkmalsname '>mnr ^mnr PCLR 1 +mnr^+^. Merkmal wählen (Mausnavigation):^ = cap TEXT cap 10 10 12 GRAYMAX 1 1 ^Arial^ 0 2 getMerkmalsname 1 m1 getMerkmalsname 2 m2 getMerkmalsname 3 m3 getMerkmalsname 4 m4 getMerkmalsname 5 m5 getMerkmalsname 6 m6 getMerkmalsname 7 m7 TEXT {^^1.) ^+m1} 10 45 12 TEXT {^^2.) ^+m2} 10 67 12 TEXT {^^3.) ^+m3} 10 89 12 TEXT {^^4.) ^+m4} 10 111 12 TEXT {^^5.) ^+m5} 10 133 12 TEXT {^^6.) ^+m6} 10 155 12 TEXT {^^7.) ^+m7} 10 177 12 +1 = m +0 = ende WHILE ende = 0 POINTSEL x y 1 0 IF y>39 and y<195 THEN +1 = ende IF y<63 THEN +1 = m ELSE IF y<85 THEN +2 = m ELSE IF y<107 THEN +3 = m ELSE IF y<129 THEN +4 = m ELSE IF y<151 THEN +5 = m ELSE IF y<173 THEN +6 = m ELSE +7 = m ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDWHILE +m = #{1+mnr} ENDP ////////// ////////// // Untermenü zur Konfiguration der Merkmale. PROCEDURE confMerkmale chooseMerkmal 1 chooseMerkmal 2 writeconf 0 PCLR 1 ENDP ////////// ////////// // Untermenü zur Konfiguration der Variation der Zeichen. PROCEDURE confPunktmengen +0 = ende WHILE ende = 0 PCLR 1 TEXT ^Rotation:^ 10 10 12 TEXT ^Skalierung:^ 10 30 12 TEXT ^Versch. Schriftarten:^ 10 50 12 TEXT ^Zurück zum Menü^ 10 100 12 FRAME 70 108 130 19 0 GRAYMAX 1 ^^aus^ = rot ^^aus^ = skal ^^aus^ = fonts IF #4 = 1 THEN ^^ein^ = rot ENDIF IF #5 = 1 THEN ^^ein^ = skal ENDIF IF #6 = 1 THEN ^^ein^ = fonts ENDIF TEXT rot 200 10 12 TEXT skal 200 30 12 TEXT fonts 200 50 12 FRAME 211 18 35 19 0 GRAYMAX 1 FRAME 211 38 35 19 0 GRAYMAX 1 FRAME 211 58 35 19 0 GRAYMAX 1 POINTSEL x y 1 1 IF x>2 and x<138 and y>97 and y<118 THEN +1 = ende ELSE IF x>195 and x<227 and y>7 and y<68 THEN IF y<28 THEN +1 - #4 = #4 ELSE IF y<48 THEN +1 - #5 = #5 ELSE +1 - #6 = #6 ENDIF ENDIF ENDIF ENDIF ENDWHILE writeconf 0 PCLR 1 ENDP ////////// ////////// // Erzeugt die Punktemenge des Zeichens char im Registerfeld. PROCEDURE createPoints '>char '>pcount '>confreg '>resreg 'maxx or ymaxy THEN IF (x,y,pnr) = GRAYMAX THEN +size1 + 1 = size1 ENDIF ENDIF END l +size1" / {'size"} = fval +max" * fval = fval ELSE IF fi=5 THEN ;// Elongation EFEATR lambda1 lambda2 xm ym ang "xm + ym = dummy; "lambda2 / lambda1 = fval +max" * fval = fval ELSE IF fi=6 THEN ;// Kontur-Konvex-Flächenrelation +size" / {'csize"} = fval +max" * fval = fval ELSE ;// Konvex-Kontur-Längenrelation +clength" / {'length"} = fval +max" * fval = fval ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF // Merkmalswerte im Resultatregister speichern +2*{i-1} + {j-1} = offset "fval' = #{resreg+offset}; getMerkmalsname fi fname ^fname + ^:^ = fname SOUT fname; FOUT fval; PLF IF j=1 THEN "fval' + MX = MX ELSE "fval' + MY = MY ENDIF ENDFOR ENDFOR TEXT ^Fertig^ 300 20 10 GRAYMAX 3 WORK 1 ENDP ////////// ////////// // Zeichnet das leere Koordinatensystem in Bild 2. PROCEDURE drawcoordsys LINE 20 10 20 490 GRAYMAX 2 LINE 20 490 500 490 GRAYMAX 2 LINE 20 10 15 20 GRAYMAX 2 LINE 20 10 25 20 GRAYMAX 2 LINE 500 490 490 485 GRAYMAX 2 LINE 500 490 490 495 GRAYMAX 2 getMerkmalsname {#2} m1 getMerkmalsname {#3} m2 TEXT m1 150 495 10 GRAYMAX 2 1 ^Arial^ 0 2 TEXT m2 2 350 10 GRAYMAX 2 1 ^Arial^ 90 0 ENDP ////////// ////////// // Zwichnet die Punktemengen in Bild 2. PROCEDURE drawpoints '>pcount +64 = start FOR j 1 2 IF j = 2 THEN +128 = start ENDIF FOR i 0 {pcount-1} +20 + #{2*i+start} = x +490 - #{2*i+start+1} = y IF j = 1 THEN CIRCLE x y 2 GRAYMAX 2 ELSE LINE {x-2} {y-2} {x+2} {y+2} GRAYMAX 2 LINE {x-2} {y+2} {x+2} {y-2} GRAYMAX 2 ENDIF ENDFOR ENDFOR ENDP ////////// ////////// // Zeichnet die aktuelle Trennlinie in Bild 2. PROCEDURE drawsepline ">c0 ">c1 ">c2 '>mark ' 480 THEN "480 = y0 "0 = x0 IFN "c1 = 0 THEN "{-c2*y0 - c0} / c1 = x0 ENDIF ENDIF ENDIF "480 = x1 "-1 = y1 IFN "c2 = 0 THEN "+{-c1*x1 - c0} / c2 = y1 ENDIF IF "y1 < 0 THEN "0 = y1 "0 = x1 IFN "c1 = 0 THEN "-c0 / c1 = x1 ENDIF ELSE IF "y1 > 480 THEN "480 = y1 "0 = x1 IFN "c1 = 0 THEN "{-c2*y1 - c0} / c1 = x1 ENDIF ENDIF ENDIF +0 = DRAWN "10 = mindist IFN "x0<0 or "y0<0 or "x1<0 or "y1<0 or "x0>480 or "y0>480 or "x1>480 or "y1>480 THEN "{x0-x1 sqr} + {y0-y1 sqr} sqrt = dist IFN "dist < mindist THEN LINE {"x0'+20} {"490-y0'} {"x1'+20} {"490-y1'} mark {-2} +1 = DRAWN ENDIF ENDIF ENDP ////////// ////////// // Zeichnet alle Informationen in Bild 2 neu. PROCEDURE drawall '>pcount ">c0 ">c1 ">c2 '>mark, 'pcount ">alpha ">afac '>maxit "0 = c0 ;// Startwerte für die Trennlinie "-1 = c1 "1 = c2 drawall pcount c0 c1 c2 1 TEXT ^Abbruch^ 50 2 10 GRAYMAX 2 FRAME 73 10 57 16 0 GRAYMAX 2 TEXT ^Schrittweise Abarbeitung^ 200 2 10 GRAYMAX 2 TEXT ^Kontinuierliche Abarbeitung^ 200 20 10 GRAYMAX 2 FRAME 278 11 165 17 0 GRAYMAX 2 FRAME 278 29 165 17 0 GRAYMAX 2 +0 = stepwise +0 = ende +1 = it WHILE ende = 0 +1 = ende POINTSEL x y 1 0 IF x>145 and x<411 and y>1 and y<39 THEN IF y<20 THEN +1 = stepwise ELSE +0 = stepwise ENDIF ELSE IF x>45 and x<102 and y<20 and y>1 THEN JMP ende ELSE +0 = ende ENDIF ENDIF ENDWHILE drawall pcount c0 c1 c2 1 +64 = pos ;// Startposition der Punkte +0 = count ;// bereits betrachtete Punkte der Menge +0 = ende +0 = changed WHILE ende=0 and {it 0 THEN ;// Punkt aus S1 falsch klassifiziert //"-alpha + 0.000000001 = alpha "c0 + {alpha*afac} = c0 "c1 + {alpha*x} = c1 "c2 + {alpha*y} = c2 +1 = update +1 = changed ENDIF ELSE //"alpha + 0.000000001 = alpha "c0 + {x*c1} + {y*c2} = prod IFN "prod < 0 THEN ;// Punkt aus S2 falsch klassifiziert "c0 - {alpha*afac} = c0 "c1 - {alpha*x} = c1 "c2 - {alpha*y} = c2 +1 = update +1 = changed ENDIF ENDIF IF update = 1 THEN ;// alles neu zeichnen PCLR {-2} drawsepline c0 c1 c2 1 DRAWN "c0' = c0; "c1' = c1; "c2' = c2; PLF; IF DRAWN=1 THEN SOUT ^+^; ELSE SOUT ^-^; ENDIF OUT it; FOUT afac alpha; OUT c0 c1 c2 IF stepwise=1 and DRAWN=1 THEN TEXT ^Maustaste zum Fortfahren...^ 300 0 10 GRAYMAX 2 TEXT ^Abbruch^ 50 2 10 GRAYMAX 2 FRAME 73 10 57 16 0 GRAYMAX 2 POINTSEL xx yy 1 0 IF xx>45 and xx<102 and yy<20 and yy>1 THEN JMP ende ENDIF ENDIF +it + 1 = it ENDIF IF count = {pcount-1} THEN ;// aktualisiere zu betrachtenden Punkt +0 = count IF pos = 64 THEN +128 = pos ELSE IF changed = 0 THEN +1 = ende ELSE +64 = pos +0 = changed ENDIF ENDIF ELSE +count + 1 = count ENDIF ;// aktualisiere Schrittweiten //IF "afac>1 THEN // "afac * 0.99999 = afac //ENDIF IF "alpha>1 THEN "alpha * 0.999 = alpha ENDIF ENDWHILE IF it>maxit and ende=0 THEN drawall pcount c0 c1 c2 1 ;// Iteration wurde nach maxit Schritten abgebrochen ^^Maximale Durchlaufzahl von ^+{'maxit^}+^ erreicht, breche ab...^ = txt TEXT txt 50 0 10 GRAYMAX 2 TEXT ^Punktmengen wahrscheinlich nicht linear separierbar^ 50 18 10 GRAYMAX 2 PLF; SOUT ^ABBRUCH...^; PLF ELSE drawall pcount c0 c1 c2 2 ;// Iteration beendet - mit grüner Linie neu zeichnen TEXT ^Fertig...^ 50 0 10 GRAYMAX 2 PLF; SOUT ^FERTIG...^; PLF ENDIF $ende ENDP ////////// ////////// // Erzeugung der Punktemengen und Ausführung des Fehlerkorrektur-Algorithmus. PROCEDURE verarbeitung PCLR 1 SOUT ^Starte Verarbeitung^; PLF TEXT ^Starte Verarbeitung^ 10 10 12 GETPCOUNT pcount ;// Anzahl der zu erzeugenden Muster createPoints {#0} pcount 0 64 mx1 my1 createPoints {#1} pcount 0 128 mx2 my2 WORK 1 "1000 = afac +mx1+mx2/2 = mx +my1+my2/2 = my +mx+my"/2 * 5 = afac "10 = alpha +5000 = maxit fehlerkorrektur pcount alpha afac maxit TEXT ^Verarbeitung beendet^ 10 30 12 SOUT ^Verarbeitung beendet^; PLF PCLR 1 ENDP ////////// ////////// // Zeichnet das Hauptmenü. PROCEDURE drawmenue +#0 + 64 chr = b1; +#1 + 64 chr = b2 ^^(ist: ^+b1+^,^+b2+^)^ = bt +#2^ = r2; +#3^ = r3; ^^(ist: ^+r2+^,^+r3+^)^ = mt +#4^ = r4; +#5^ = r5; +#6^ = r6; ^^(ist: ^+r4+^,^+r5+^,^+r6+^)^ = pt +12 = tsize TEXT ^Menü^ 10 10 {tsize+2} GRAYMAX 1 1 ^Arial^ 0 16 TEXT ^1.) Cfg: Buchstaben^ 10 40 tsize TEXT bt 180 40 tsize TEXT ^2.) Cfg: Merkmale^ 10 60 tsize TEXT mt 180 60 tsize TEXT ^3.) Cfg: Punktmengen^ 10 80 tsize TEXT pt 180 80 tsize TEXT ^4.) Verarbeitung starten^ 10 105 tsize TEXT ^5.) Ende^ 10 135 tsize ENDP ////////// ////////////////////// ////////////////////// // HAUPTPROGRAMM //// ////////////////////// PSIZE 512 512 4; ERRON createconf readconf 0 SOUT ^Starte Menü (Bedienung mit Maus)^; PLF $start drawmenue POINTSEL x y 1 0 PCLR 1 drawmenue IF y>30 and y<155 THEN IF y<60 THEN confBuchstaben ELSE IF y<80 THEN confMerkmale ELSE IF y<100 THEN confPunktmengen ELSE IF y<130 THEN verarbeitung ELSE JMP ende ENDIF ENDIF ENDIF ENDIF ENDIF JMP start $ende TEXT ^=> Programm beendet^ 10 220 12 GRAYMAX 1 1 ^Arial^ 0 2 ////////////////////// //////////////////////