StateRC osztály

A bemutatásra kerülő módszerek között van egy-két metódus, amit alig 1-2 módszer használ. Így ezeket több feladattípusnál felesleges implementálni. A konkrét megvalósításokba beillesztendő helyfoglaló és semmitmondó (dummy) metódusok helyett inkább külön osztályba szerveztük ezeket, így ha a feladatnak nem felelnek meg ezek a metódusok, nem kell implementálni ezeket..

package hu.unideb.inf.optimization.methods;
/**
 * Absztrakt adatszerkezet, mely lehetőséget nyújt keresztezésre és közelítésre
 * @author ASZALÓS László
 */
public abstract class StateRC extends StateR{

Ez az osztály az előbb bemutatott osztály leszármazottja. Elvileg szétválaszthattuk volna a keresztezéshez és közelítéshez kapcsolódó metódusokat egy-egy külön osztályba, de mivel a Java nem ismeri/szereti a többszörös öröklődést, egyben kezeljük ezeket.

Keresztezés

Kezdjük a keresztezéssel! A Wikipédia oldalán ismertetett módszerek közül csak a hármat adunk meg. Az érdeklődő olvasó könnyedén kiegészítheti ezt a listát.

A két azonos hosszú adatsort azonos ponton vágjuk ketté, és kicseréljük az első részeket.

/**
 * Egypontos kereszteződés.
 * @param d1 első adat
 * @param d2 második adat
 */
public abstract void crossoverOnePoint(StateRC d);

A két azonos hosszú adatsort azonos pontokon vágjuk ketté, és kicseréljük az középső részeket.

/**
 * Kétpontos kereszteződés.
 * @param d1 első adat
 * @param d2 második adat
 */
public abstract void crossoverTwoPoint(StateRC d);

Az adatsorok megfelelő tagjait a paraméterként adott valószínűséggel cseréljük fel.

/**
 * Minden egyes adatelemet <i>p</i> valószínűséggel cserélünk ki.
 * @param d1 első adat
 * @param d2 második adat
 * @param p csere valószínűsége
 */
public abstract void crossoverUniform(StateRC d, float p);

Közelítés

A rovarraj módszer jellemző lépése az, amikor az egyik rovar a másik irányába lép. A lépés kiválasztásához szükség van rovarok távolságára is. Folytonos esetben egyértelmű a definíció, diszkrét esetben több lehetőség is adott. Mi most csak előírjuk a megvalósítást.

/**
  * Aktuális állapot távolsága a <code>d</code> állapottól
  * @param d másik állapot
  * @return távolság
  */
 public abstract int distance(StateRC d);

 /**
  * Egy lépés a <code>d</code> irányába
  * @param d célbavett állapot
  */
 public abstract void nearTo(StateRC d);
 }