A korábbi cikkekben sokat foglalkoztunk fogalmi modellezéssel, ennek ábrázolásával, és megnéztük egy rendszert, mely példákat állít elő az általunk megadott szabályok alapján.
A mai cikkem rendhagyó lesz: a hagyományos informatikai témáktól elszakadva egy teljesen más világba utazunk, ez pedig az 1850-es évek Franciaországa, ahol is egy botvívás rendszer működését fogjuk analizálni a korábban tanult fogalmi modellezés segítségével.
HEMA és botvívás
A HEMA (Historical European Martial Arts, történelmi európai harcművészetek kutatásával foglalkozó csoport) mozgalom keretén belül több mint 10 éve foglalkozom vívás rekonstrukcióval; a fő kutatási területem az 1800-1900-as évek európai küzdésmódszerei, amelyről több cikket is publikáltam, amelyek elérhetőek a kardeskalap.hu oldalon.
Franciaországban nagy népszerűségnek örvendett a bottal (sétapálcával) történő vívás, olyan mértékben, hogy még az akkori katonatiszti képzésért felelős Joinville-i katonai akadémia tananyagának is részévé vált.
Francia botvívó diploma az 1800-as évekből, forrás: Craig Gemeiner
A témában több könyvet is megjelentettek, az egyik legismertebb az 1853-as Théorie pour apprendre à tirer la canne en vingt-cinq leçons par Leboucher, de Rouren , magyarra fordítva Elmélet a sétapálca vívás tanulásáról 25 leckében a Rouren-ből származó Leboucher-től.
A könyv angol fordításának előlapja
Egy rekonstrukciós próbálkozást itt lehet megtekinteni:
Egy rövid összefoglaló cikk pedig a következő címen olvasható a rendszerről:
A könyv a XIX. századnak megfelelő, önvédelmi szemléletű támadás, védés, visszatámadás formájában írja le a technikákat. Ez önmagában jó, viszont felmerült bennem a kérdés: ugyanezt az anyagot nem-e lehetne jobban, hatékonyabban átadni?
Támadás, védés, visszatámadás sorozat a könyvből
Az ötlet a következő: mi lenne, ha az unalmas egyik támad, másik véd majd visszatámad gyakorlatok helyett olyan páros gyakorlatokat adnánk, melyeket a gyakorló felek folyamatosan, megszakítás nélkül tudnának végrehajtani.
Ezek a gyakorlatok állhatnának több mint három lépésből, de nyilvánvalóan valamilyen szinten korlátozni kell a lépések számát, mert ha túl sok, akkor senki nem tudja megjegyezni.
Cél továbbá az is, hogy a rekonstrukció a lehető legpontosabb legyen: a technikák a forrásanyagban szereplő módon jöjjenek egymás után.
Röviden összefoglalva: a végeredményt megpróbáljuk annyira közelíteni az eredeti rendszerhez, amennyire csak lehetséges.
A vívókönyv fogalmi modellezése
Mint minden feladat esetében, itt is a fogalmi modellezéssel kezdünk. Nézzük, hogy a könyv milyen fogalmakkal dolgozik. A könyv átnézése után három kategóriát tudunk megkülönböztetni, ezek:
- Támadás: az eszközzel végrehajtott ütés vagy szúrás
- Védés: egy támadás ellen végrehajtott akció mely megakasztja a támadó eszközt ezáltal védve a vívót
- Visszatámadás: a visszatámadás egy támadás, melyet egy védés után hajtunk végre
Nézzünk egy példát egy gyakorlatsorra:
A támadó függőleges ütés fejre (head blow) technikát hajt végre, melyet a védekező fej védés (head parry) technikával hárít, majd egy belső arc ütés (inside face blow) technikával válaszol.
A korábban fogalmi modellezésben tanultakat alkalmazva láthatjuk, hogy itt a fenti fogalmaknak egy-egy példányával dolgozunk. Az első példányunk a támadás fogalomból jön létre (függőleges ütés fejre), a második példányunk a védekezés fogalomból (fej védés), a harmadik példány pedig a visszatámadás fogalomból (“inside face blow”).
Felmerül a kérdés, hogy a modellünk szempontjából van-e értelme külön fogalomként kezelni a támadást és a visszatámadást.
Támadás, védés, és visszatámadás
Ahhoz, hogy a fenti kérdésre választ kapjunk, elemezni kell a forrás anyagunkat, és két kérdésre kell választ találnunk.
Az első kérdésünk az, hogy van-e végrehajtásbeli különbség a között, hogy egy ugyanolyan néven hivatkozott technikát támadásként, vagy pedig visszatámadásként hajtunk végre.
Példaként ha egy függőleges ütés fejre technikáról beszélünk, akkor van-e különbség a között, hogy az ellenfelünket simán csak fejbekólintjuk, vagy előtte védünk, és utána csapjuk fejbe. Ha nincs, az azt jelenti, hogy ezek a technika végrehajtások (példányok) valójában azonosak, ezért őket egy közös fogalmi kategóriába lehet csoportosítani.
A válasz az első kérdésre a forrásanyag elemzése után az, hogy nincs végrehajtásbeli különbség a között, hogy egy technikát támadásként, vagy pedig visszatámadásként hajtunk végre.
A második kérdésünk az, hogy a támadások és visszatámadások halmaza megegyezik-e? Ha nem, az azt jelenti, hogy vagy létezik olyan támadás, amely nem értelmezhető visszatámadásként, vagy pedig létezik olyan visszatámadás, mely nem értelmezhető támadásként.
Ehhez írjuk fel az összes könyvben szereplő akciót (ezt a táblázatot rakjuk is el, mert hamarosan fel is fogjuk használni), és vizsgáljuk meg a támadások és a visszatámadások halmazát.
A könnyebb érthetőség kedvéért egy táblázatban foglalnám össze az alap mozdulatokat képekkel és fordítással együtt, majd pedig a könyvben szereplő támadás, védés, visszatámadásokat mutatnám be.
Alaptechnikák és fordításuk
Támadások
Angol elnevezés | Magyar elnevezés | Kép |
Head blow | Fejre mért függőleges ütés | |
Inside face blow | Belső arc ütés | |
Outside face blow | Külső arc ütés | |
Kidney blow | Vesére mért ütés | |
Flank blow | Oldalra mért ütés | |
Outside leg blow | Külső lábszárra mért ütés | |
Inside leg blow | Belső lábszárra mért ütés | |
Rising blow | Emelkedő ütés könyökre | |
Inside thrust | Szúrás belső vonalon testre | |
Outside thrust | Szúrás külső vonalon testre | |
Thrust to the face | Szúrás arcra |
Védések
Angol elnevezés | Magyar elnevezés | Kép |
Head parry | Fejvédés | |
Quarte parry | Védés belső vonalon | |
Tierce parry | Védés külső vonalon | |
Prime parry | Magas védés | |
Kidney parry | Vesetámadás védése | |
Flank parry | Oldal védés | |
Outside leg parry | Külső láb védés | |
Inside leg parry | Belső láb védés | |
Rising parry | Emelkedő támadás védése |
Támadások, védések, és visszatámadások
Támadás | Védés | Visszatámadás |
Head blow | Head parry | Head blow |
Head parry | Inside face blow | |
Head parry | Inside leg blow | |
Inside face blow | Quarte parry | Kidney blow |
Quarte parry | Rising blow | |
Quarte parry | Outside leg blow | |
Outside face blow | Tierce parry | Head blow |
Tierce parry | Inside face blow | |
Tierce parry | Inside leg blow | |
Inside face blow | Prime parry | Head blow |
Prime parry | Inside leg blow | |
Prime parry | Inside face blow | |
Kidney blow | Kidney parry | Head blow |
Kidney parry | Inside face blow | |
Kidney parry | Inside leg blow | |
Kidney parry | Flank blow | |
Flank blow | Flank parry | Flank blow |
Flank parry | Head blow | |
Flank parry | Inside face blow | |
Outside leg blow | Outside leg parry | Head blow |
Outside leg parry | Inside face blow | |
Inside leg blow | Inside leg parry | Outside face blow |
Rising blow | Rising parry | Thrust to the face |
Inside thrust | Quarte parry | Outside face blow |
Outside thrust | Tierce parry | Inside face blow |
Tierce parry | Inside leg blow |
Ha a fenti táblázatból kivesszük a védéseket és kiszűrjük a duplikátumokat, akkor a következő táblázatot kapjuk:
Támadás | Visszatámadás |
Flank blow | Flank blow |
Head blow | Head blow |
Inside face blow | Inside face blow |
Inside leg blow | Inside leg blow |
Kidney blow | Kidney blow |
Outside face blow | Outside face blow |
Outside leg blow | Outside leg blow |
Rising blow | Rising blow |
Outside thrust | Thrust to the face |
Inside thrust |
Látható, hogy szinte mindegyik támadást megtaláljuk a visszatámadások között, egyedül a szúrásokkal van egy kis problémánk: támadásként szúrhatunk belülre illetve kívülre (ez azt jelenti, hogy az ellenfél fegyverének síkjához képest a törzshöz, vagy a karhoz közelebbi területre), visszatámadásként azonban csak fejre.
Több lehetőségünk is van modellezési szempontból: vagy azt mondjuk hogy a támadást és a visszatámadást, legalábbis szúrás tekintetében külön kezeljük, vagy kibővítjük a modell-t úgy, hogy felvesszük a támadások közé a Thrust to the face (szúrás arcra) akciót és a visszatámadások közé az inside és az outside thrust (belső és külső szúrás) akciókat. Ezt a domain tudásunk alapján megtehetjük, mert a szúrás védése tierce vagy quarte mozdulattal egy teljesen szabályos vívóakció, illetve egy rising parry után nem csak fejre, hanem testre is szúrhatunk.
Nézzük mivel bővült az eredeti táblázatunk:
Támadás | Védés | Visszatámadás |
Rising blow | Rising parry | Inside thrust |
Rising parry | Outside thrust | |
Thrust to the face | Quarte parry | Outside face blow |
Tierce parry | Inside face blow | |
Tierce parry | Inside leg blow |
Gyakorlatok gráfosítva
Gráfelméletben jártasak már sejthetik, hogy mire is megy ki a játék: megpróbáljuk a problémát visszavezetni egy irányított gráfra, majd pedig a gráfelméletben használt algoritmusokkal elemezni azt.
Hogyan is néz ki egy irányított gráf? Egy irányított gráf csúcsokból és irányított élekből áll, ahol egy él két csúcsot köt össze, és van egy irányultsága: egyikből mutat a másikba.
Hogyan lehetne felírni egy példát a mi esetünkre? Tekintsük az összes támadást, védést, illetve visszatámadást egy-egy csúcsnak. Akkor húzzunk élet támadásból védésbe, illetve védésből visszatámadásba, ha a forrásban szerepel ilyen akció.
A gráfunk ábrázolására használhatjuk a graphviz nevű alkalmazást, mely az akciók betáplálása után a következő eredményt adja (oválissal jelöljük a támadást, szögletes dobozzal a védést).
Ha ránézünk a generált gráfra, láthatjuk, hogy alapvetően szépen teljesíti az elvárást: tudunk olyan sorozatokat találni amelyek “sosem fejeződnek be”, viszont vannak akciók, melyeket maximum egyszer tudunk végrehajtani (ezeket pirossal jelöltem a gráfban).
Ezeket az akciókat azért lehet csak egyszer végrehajtani, mert belőlük csak kiindulni tudunk, hozzájuk vissza többet nem jutunk (ilyen pl. az inside thrust, outside thrust), vagy pedig része lehetnek egy sorozatnak, viszont maga a sorozat befejeződik (ilyen a rising blow, rising parry, thrust to the face), és nem tud ismétlődni.
Nézzük meg tehát hogyan is nézne ki a gráfunk ha a fent említett bővítést végrehajtanánk.
Láthatjuk, hogy a felvett akciókkal a fent említett problémákat megszüntettük.
Gráf elemzés
A problémát egy irányított (páros) gráffal modelleztük, ahol az egyes csúcsok a támadások illetve védekezések, és irányított él akkor megy egy csúcsból a másikba, ha az adott vívóakciók egymásutánja szerepel a forrásban. Ha jobban belegondolunk, ez egyébként egy páros gráf, mert a csúcsokat két kategóriába (támadás és védés) sorolhatjuk, és él csak támadás és védés között mehet, támadásból támadásba, illetve védésből védésbe nem.
Vívástechnikailag ez egyébként azt jelenti, hogy a közbetámadás vívóakció (amikor egy támadásra támadással felelünk) ebben a rendszerben nem értelmezett. E mögött az a gondolat állhat, hogy a közbetámadás akció nem rizikós akció, sokkal biztonságosabb, ha a gyakorló (aki alapvetően egy gyorstalpaló kurzuson vesz részt) először mindig védeni próbálja magát, és csak utána visszatámadni.
Páros gyakorlatok generálása
Nézzük meg, hogy hogyan tudunk páros gyakorlatokat generálni az így elkészített gráfunkból.
Mi a páros gyakorlat? A páros gyakorlat egy két fél (A,B) által végrehajtott technikák sorozata. A jelen esetben olyan páros gyakorlatokat akarunk létrehozni, melyekben egy támadást egy védés és visszatámadás követ.
Nézzünk erre egy példát egy négy lépésből álló páros gyakorlat esetén:
A | B | B | A |
támad | véd | támad | véd |
A támad (1. lépés), B ezt védi (2. lépés), majd B (vissza)támad (3. lépés), amit A véd (4. lépés), majd pedig A újra támad (1.lépés). Egy ilyen sorozat általánosan akkor megfelelő, ha a gráfban találunk egy olyan csúcs-él sorozatot (a gráfelméletben a csúcs-él sorozatot útnak nevezik) amelyre igaz hogy 1 → 2 → 3 → 4 → 1. Mivel az úton az első elem megegyezik az utolsóval, körbeérünk, ennek a szakszerű elnevezése meglepő módon a kör. Tehát a célunk az, hogy a gráfban köröket keressünk. Figyeljük meg, hogy 4 lépés esetén mindig ugyanaz a fél kezdi a sorozatot, tehát egy idő után szükség lesz szerepcserére.
Egy ilyen sorozat például az Inside face blow → Prime Parry → Head blow → Head parry → Inside face blow.
Színezzük ki ezt a kört a gráfban:
Tudunk ennél hosszabb köröket találni a gráfban? Természetesen. Hat hosszúságú esetben a sorozatunk általánosan így nézne ki:
A | B | B | A | A | B |
támad | véd | támad | véd | támad | véd |
A támad (1. lépés), B ezt védi (2. lépés), majd B (vissza)támad (3. lépés), amit A véd (4. lépés), majd pedig A visszatámad (5.lépés), amit B véd, majd pedig szerepet cserélnek, és B fogja végrehajtani az 1. támadást. Figyeljük meg, hogy itt automatikusan, a drill részeként történik egy szerepcsere, tehát nem kell külön felhívni a figyelmet erre, mint a négy lépéses esetben.
Egy ilyen sorozat például az Inside face blow → Quart Parry → Kidney blow → Kidney parry → Head blow → Head parry.
Páros gyakorlatok vizsgálata
Most már látjuk, hogy mit is szeretnénk: egy olyan algoritmusra lenne szükségünk, amelyik visszaadja nekünk egy adott gráfban létező összes kört, majd ezek után kérdéseket szeretnénk feltenni. A kérdéseink a következőek:
- Ha vesszük az összes kört, és rávetítjük a gráfunkra, akkor marad-e olyan csúcs vagy él, amely nem kerül lefedésre? Ha nem, akkor örülünk, hiszen ez azt jelenti, hogy ha az összes gyakorlatsort végrehajtjuk, akkor végiggyakoroltuk az egész rendszert. Ha marad, akkor a páros gyakorlatokon kívül ezeket még külön be kell gyakorolni.
- Van-e lehetőségünk arra, hogy csökkentsük a körök számát, ezáltal a begyakorlandó páros gyakorlatok számát úgy, hogy a duplikátumokat kiszűrjük? Az átlagember 6-8 mozdulatot tud megjegyezni, tehát ezzel a korlátozással kellene élnünk (maximum 6 vagy 8 hosszúságú köröket engedünk).
- Mennyire “jó” az algoritmusunk?
Az összes kör megtalálása
A feladat alapvetően egy gráfelméleti probléma: találjuk meg egy irányított gráfban az összes lehetséges kört. A problémát különböző algoritmusokkal meg lehet oldani, ezek egyike az un Johnson algoritmus.
Az algoritmust lefuttatva 144 kört találunk, amely túl sok. Nézzük, hogy hogyan tudnánk optimalizálni.
A körök számának csökkentése
Miután megkaptuk az összes kört, meg kell vizsgálnunk, hogy a körök mely halmaza az, amely lefedi a teljes gráfot. Erre különféle algoritmusokat találhatunk ki, a naiv algoritmus a következő: rendezzük a köröket méret szerint sorba. Kezdetben egy üres listánk van, mely nem tartalmaz kört. Vegyük a legrövidebb még nem kiválasztott kört (ha több azonos méretű van akkor véletlenszerűen egyet) és adjuk hozzá a listánkhoz. Nézzük meg, hogy a listánkban lévő körök lefedik-e az egész gráfot. Ha igen, akkor készen vagyunk. Ha nem, akkor folytassuk.
Ezzel az algoritmussal 21-re tudjuk csökkenteni a körök számát.
Tudjuk optimalizálni az algoritmus? Igen, egy mohó algoritmussal. Eddig a rövidebb köröktől haladtunk az egyre hosszabbak felé, most fordítsuk meg az irányt. Adjunk meg egy maximális kör hosszúságot (pl. 8) kezdjünk ezekkel a körökkel dolgozni. Nézzük meg, hogy az adott méretű körök közül melyik az, amelyik legjobban csökkenti az élek számát. Ezt a kört vegyük be a listánkba. Ha lefedjük a gráfot, végeztünk. Ha nem, akkor vegyük a következő, az adott hosszúságnak megfelelő gráfot. Ha már nincs, akkor csökkentsük a hosszúságot (pl. 6-ra), és folytassuk ezekkel a körökkel.
Ezen algoritmussal 18-ra tudjuk csökkenteni a körök, tehát a páros gyakorlatok számát.
Nézzük meg, hogy mik lettek a gyakorlatok (mert végül is ezért dolgoztunk idáig):
Két lépésből álló gyakorlatok:
- headBlow, headParry
- insideFaceBlow, primeParry
- flankBlow, flankParry
Négy lépésből álló gyakorlatok:
- risingBlow, risingParry, insideThrust, quarteParry
- kidneyBlow, kidneyParry, insideFaceBlow, quarteParry
- risingBlow, risingParry, faceThrust, quarteParry
- outsideLegBlow, outsideLegParry, insideFaceBlow, quarteParry
- outsideFaceBlow, tierceParry, insideFaceBlow, quarteParry
- insideLegBlow, insideLegParry, outsideFaceBlow, tierceParry
Hat lépésből álló gyakorlatok:
- outsideLegBlow, outsideLegParry, flankBlow, flankParry, insideFaceBlow, quarteParry
- risingBlow, risingParry, outsideThrust, tierceParry, insideFaceBlow, quarteParry
- insideFaceBlow, quarteParry, kidneyBlow, kidneyParry, headBlow, headParry
- insideFaceBlow, quarteParry, outsideLegBlow, outsideLegParry, headBlow, headParry
- insideFaceBlow, primeParry, insideLegBlow, insideLegParry, outsideFaceBlow, tierceParry
Nyolc lépésből álló gyakorlatok:
- insideFaceBlow, quarteParry, kidneyBlow, kidneyParry, flankBlow, flankParry, headBlow, headParry
- insideLegBlow, insideLegParry, outsideFaceBlow, tierceParry, insideFaceBlow, primeParry, headBlow, headParry
- insideFaceBlow, quarteParry, risingBlow, risingParry, faceThrust, tierceParry, headBlow, headParry
- kidneyBlow, kidneyParry, insideLegBlow, insideLegParry, outsideFaceBlow, tierceParry, insideFaceBlow, quarteParry
Az algoritmus jósága
Láthatjuk, hogy a megfelelő páros gyakorlatokkal az unalmas támadás, védés, visszatámadás gyakorlatokat izgalmas páros gyakorlatokká tudtuk alakítani. A kérdés, hogy ennek mi az ára. Kell-e, és ha igen mennyivel többet gyakorolni mint a kiindulási pont, mi a hatékonyság és a szórakozás aránya?
Az algoritmus jóságának vizsgálatára a következő arányszámot használtuk: a kiválasztott körök hányszor tartalmaznak több élt, mint az eredeti gráf.
A jelenlegi nem túl szofisztikált algoritmus esetében 2.3-szor több élt tartalmaz a gráf (40 helyett 92 él), tehát ennyivel fogunk több munkát végezni.
Összefoglalás
A régi korokban készített vívókönyvek feldolgozása nem egyszerű, de azt gondolom, sikeresen vettük a feladatot. Feldolgoztunk egy 1850-es évekbeli botvívó könyvet, létrehoztuk a könyvben használt fogalmi modell-t, meghatároztuk a fogalmi modell példányait, majd áttranszformáltuk a feladatot egy gráfelméleti problémára, amit sikeresen megoldottunk.
Láthatjuk, hogy az általam propagált modellezési módszertan és gondolkodásmódot nem csak informatikai témákban, hanem az élet egészen más területein is sikeresen használhatjuk.
Végül de nem utolsó sorban szeretnék köszönetet mondani Törcsvári Attilának az algoritmusokban való segítségnyújtásért és Bakos Bencének a lektorálásért.
Páros gyakorlat generátor
A fent említett algoritmusok javascript nyelvű implementáció elérhető a következő oldalról:
https://github.com/sz332/cerri
Az implementáció a következő funkciókkal rendelkezik:
- Gyakorlatok olvasása JSON fájlból
- PDF generálása a létrehozott gyakorlatsorokból
- Webes nézet
- Lehetőség az páros gyakorlat algoritmus cseréjére
- Generált páros gyakorlatok megjelenítése
- Jósági adatok megjelenítése
Példa a generált PDF-re
Webes nézet
Kapcsolódó anyagok
A könyv angol nyelvű fordítása elérhető itt:
https://sirwilliamhope.org/Library/DDLR/crawley/theory_for_learning_the_cane_in_25_lessons.pdf
Az eredeti, francia nyelvű forrás elérhető itt:
https://gallica.bnf.fr/ark:/12148/bpt6k55442697