Resúmen del problema...
Citar
Agrupación alumnos de dos en dos maximizando la suma de los productos del grado de amistad y la compenetración en el trabajo de alumnos que se agrupan juntos. Se dispone para ello de una matriz de amistad y otra de trabajo, donde se guardan los grados de amistad y de compenetración, que pueden no ser recíprocos, por lo que las matrices no son simétricas.
Con lo cuál tengo 2 tablas tal que así:
Citar
Amistad Trabajo
0 5 6 0 5 3
4 0 3 3 0 2
2 1 0 1 5 0
0 5 6 0 5 3
4 0 3 3 0 2
2 1 0 1 5 0
El beneficio del que se habla se genera de la siguiente forma:
Código
amistad[i][j]+amistad[j][i])*(trabajo[i][j]+trabajo[j][i]
Tengo que seguir obligatoriamente un esquema de backtracking iterativo ( y es lo que me está matando )...
Llevo más o menos el siguiente esqueleto:
** Intento plantearme esto como un árbol permutacional sin repetición **
Código
do{ genera(nivel,sol); if(solucion(sol,nalum)){ /* Sumar beneficios y actualizar voa/soa */ } if(criterio(nivel,sol,nalum)==true){ nivel++; }else { while((masHermanos(nivel,nalum)==false) && (nivel>0)) { retroceder(nivel,sol); nivel --; } } }while(nivel!=0);
Dónde las funciones:
Genera(nivel,sol) debería generar el siguiente hermano, o el
primero, para el nivel actual.
Criterio (nivel, sol): Debería comprobar si a partir de sol[0-nivel] se puede alcanzar una solución válida. En caso de que no, podar.
MasHermanos (nivel, sol): Devuelve true si hay más hermanos del nodo actual que todavía no han sido generados.
Retrocede(nivel,sol): Retrocede la solucion y hace nivel--
--------------------------------------------------------------
Hasta ahora, todos mis intentos han acabado en un bucle infinito o bien en un falso backtrack, ya que recorría malamente.
¿Podría tratar de hacerlo aprovechando STL algorithm con la función para permutaciones?
A ver si alguien me puede echar un cable, que estoy más perdido que un ciego en el océano.
*Cualquier idea, será bien recibida *
Gracias y perdón por la biblia.