Guia d'aprenentatge

En aquesta secció volem crear un projecte d'exemple per a explorar algunes de les característiques més importants del Rocs. L'objectiu és crear un graf i un script que il·lustri un algorisme d'aproximació a 2 simple per al problema cobertura de vèrtexs mínima. En aquest problema s'han de trobar un subconjunt de nodes del graf C de mida mínima, de manera que cada aresta del graf estarà connectada a almenys un node de C. Se sap que aquest problema és NP-complex i volem il·lustrar com trobar una aproximació de factor 2 cercant una coincidència en el graf donat.

El nostre objectiu és visualitzar la relació de les coincidències i la cobertura de vèrtexs mínima. Per això, volem especificar dos tipus d'arestes, un per a mostrar les arestes coincidents i un per a mostrar les arestes «comunes», així com dos tipus de nodes que utilitzarem per a distingir els nodes continguts en C i els que no estan continguts en C.

Generar el graf

Per a crear el graf, emprarem un generador de grafs predeterminat proporcionat pel Rocs. El trobareu al menú principal a Document de grafEinesGenera el graf. Després, seleccionarem un Graf aleatori amb 30 nodes, 90 arestes i amb 1 llavor (la llavor és la llavor inicial per al generador de grafs aleatoris; si s'utilitza la mateixa llavor diverses vegades es tornaran a reproduir els mateixos grafs).

Crear els tipus d'elements

Emprarem els Tipus d'elements per a crear un segon tipus de node i un segon tipus d'aresta. Per a aquests dos nous tipus, obrirem el diàleg de propietats amb els respectius botons de Propietats i establirem els seus ID a 2. A més, canviarem els colors dels elements d'aquests dos tipus nous (per a distingir els tipus predeterminat). Finalment, establirem que tots els tipus d'arestes són bidireccionals i establirem els ID del tipus predeterminat a 1.

L'algorisme

Per a acabar, hem d'implementar l'algorisme d'aproximació. Per a això utilitzarem la següent implementació:

for (var i=0; i < Document.nodes.length; i++) {
    Document.nodes[i].type = 1;
}
for (var i=0; i < Document.edges.length; i++) {
    Document.edges[i].type = 1;
}

var E = Document.edges(); // conjunt d'arestes sense processar
var C = new Array();      // arestes coincidents
while (E.length 
> 0) {
    var e = E[0];         // prenem la primera aresta e={u,v}
    var u = e.from();
    var v = e.to();
    e.type = 2;           // establim l'aresta com a coincident
    E.shift();            // eliminem «e» (és a dir, E[0]) des de la llista d'arestes
    C.push(u);            // afegim «u» a «C»
    C.push(v);            // afegim «v» a «C»

    // marquem «u,v» com a nodes en «C»
    u.type = 2;
    v.type = 2;

    // eliminem de «E» totes les arestes adjacents a «u» o «v»
    var adjacent = u.edges();
    for (var i=0; i < adjacent.length; i++) {
        var index = E.indexOf(adjacent[i]); // troba l'índex
        if (index != -1) {
            E.splice(index, 1); // l'elimina si ja s'ha trobat
        }
    }
    var adjacent = v.edges();
    for (var i=0; i < adjacent.length; i++) {
        var index = E.indexOf(adjacent[i]); // troba l'índex
        if (index != -1) {
            E.splice(index, 1); // l'elimina si ja s'ha trobat
        }
    }
}
Console.log("Vertex Cover contains " + C.length + " nodes.");

Executar l'algorisme

L'algorisme es pot executar amb el botó Executa al plafó de control de l'script.