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.
Per a crear el graf, emprarem un generador de grafs predeterminat proporcionat pel Rocs. El trobareu al menú principal a → → . 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).
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 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
.
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.");