A megvalósítás részletei

A konkrét megvalósításhoz a C++ programnyelvet választottam GNU/Linux alatt, de a forráskód nagy valószínűséggel minden C++ fordító számára érthető. A C++ nyelvre az alacsony szintű nyelvekre vonatkozó megjegyzések érvényesek (magas szintű nyelvként is használható lett volna a sebesség és a portabilitás rovására.) A választás több okból esett erre a nyelvre: nagyon gyors kódot generál, a GNU/Linux rendszerek szerves része egy C++ fordító, az adatrendszerek, amiket használtam, nagyon jól reprezentálhatóak objektumokként és pointerekként illetve az általam ismert nyelvek közül ez volt az első, amivel megoldhatónak találtam a problémákat.

Lássuk hogyan is sikerült az algoritmusokat egymással szoros együttműködésbe hozni: Az első kérdés, hogy milyen adatrendszerekként tároljuk az információt. A legkisebb egység a szimplex (illetve diagram-csúcs), tudnia kell, hogy hány dimenziós, összesen hány szimplex van, ismernie kell a szomszédait (dim+1 elemű szimplexre mutató mutató-tömb), az $ \mathcal{M}$ mátrix-függvény rá vonatkozó mátrixát és érdemes a különböző átsorszámozások esetén a sorszámot eltárolni, így csak egyszer kell az átsorszámozást végre hajtani (a szimplexek számánál eggyel nagyobb méretű egész-tömb.5)

A következő osztály a D-szimbólum, melynek tagjai: dimenzió és a szimplexek száma, szimplexekre mutató pointerek mátrixa ($ (n+1)*n$ -es mátrix, ahol $ n$ az elemszám: minden lehetséges átsorszámozást és az átsorszámozatlan esetet tároljuk), végül tárolunk egy duálisra mutató pointert is. Ezen adatokból és a fenti algoritmusokból már előállíthatóak a diagramok, miután az osztály tag függvényeiként leírtuk az algoritmusokat és egy élhozzáadó/törlő algoritmust is csináltunk. A gráfok rajzát az xfig nevű program által ismert nyelven írtuk le, amit később lehet manipulálni.

A lehetséges paraméter értékek számolásához szükség van egyáltalán a paraméter fogalmára: van neki együtthatója, minimális értéke, aktuális értéke, egy operációja (azért egy, mert a másik az eggyel nagyobb számú operáció) és egy karakter, amivel jelöljük; végül tároljuk, hogy melyik szimplexekre hat. Ilyen paraméterek listáját használjuk. Már tudjuk, hogy egy paraméter melyik szimplexekre hat, jó lenne tudni, hogy egy szimplexhez melyik paraméterek tartoznak: érdemes lenne a szimplex osztályon belül definiálni, de ezt a C++ nem szereti (a függőségek vizsgálatakor végtelen ciklusba esne), így az $ 1$ -es sorszám szerinti rendezésben egészekkel azonosított paraméterekre mutató pointer-tömböt alkalmazunk. A paraméter értékek változtatására és a korábban leírt algoritmusokra további tagfüggvényeket írtunk.

Az ismertetett algoritmusoktól egy esetben tér el a forráskód: a paraméterek ellenőrzésekor egyszerre vizsgáljuk a maximalitás és az átsorszámozás kérdését. A tagfüggvények és a megvalósítás pontos részei megtalálhatók a függelékként csatolt forráskódban.

Boroczki Lajos 2007-05-29