本文整理汇总了C++中Path::Set方法的典型用法代码示例。如果您正苦于以下问题:C++ Path::Set方法的具体用法?C++ Path::Set怎么用?C++ Path::Set使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Path
的用法示例。
在下文中一共展示了Path::Set方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Coordinator
// Implementacion el proceso administrador
void Coordinator()
{
// Permite guardar el estado.
MPI_Status status;
// Permite almacenar el mensaje a ser intercambiado.
Message message;
// Permite mantener registro de todos los procesos esperando por una ruta.
int* waiting = new int[NumberOfProcesses];
// Permite almacenar la cantidad de procesos esperando.
int numberOfWaitingProcesses = 0;
// Cuenta el número de mejores rutas recibidas.
int numberOfBestPath = 0;
// Permite almacenar la ruta más corta encontrada hasta ahora.
Path Shortest;
// Permite almacenar las tareas a ser asignadas en una cola.
List queue;
// Instanciamos una nueva ruta.
Path *P = new Path;
// Inserta la primera ruta, la de largo 0.
queue.Insert(P, 0);
// La ruta inicial debe ser mala.
Shortest.length = INT_MAX;
// Mientras los procesos que esperan por asignacion de algun ruta sean menores a la cantidad total menos 1
while (numberOfWaitingProcesses < NumberOfProcesses - 1)
{
// Se reciben los mensajes enviados por los trabajadores
MPI_Recv (&message, MessageSize, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
// Se revisa el status
switch (status.MPI_TAG)
{
// Si es una ruta mejor la que se envia
case BestPathTag:
// Si el largo de la ruta es menor que el de la menor encontrada hasta ahora
if (message.length < Shortest.length)
{
numberOfBestPath++;
printf("Mejor Ruta encontrada %d, origen = %d, largo = %d\n",
numberOfBestPath, status.MPI_SOURCE, message.length);
// actualizar la ruta mas corta
Shortest.Set(message.length, message.city, NumberOfCities);
// Le envio la nueva ruta a los trabajadores
for(int i = 1; i < NumberOfProcesses; i++)
MPI_Send(&(Shortest.length), 1, MPI_INT, i, UpdateBestPathTag, MPI_COMM_WORLD );
}
break;
// Si hay que insertar una ruta en la cola de tareas
case PutPathTag:
// Si hay procesos esperando por tareas
if (numberOfWaitingProcesses > 0)
{
// no se pone la ruta en la cola, se envia al proceso en espera
MPI_Send (&message, MessageSize, MPI_INT, waiting[--numberOfWaitingProcesses], ReplyPathTag, MPI_COMM_WORLD);
}
else // si no hay procesos en espera de tareas
{
// sea crea una nueva ruta
P = new Path();
// se configuran sus valores
P->Set(message.length, message.city, message.visited);
// se inserta en la cola de tareas
queue.Insert(P, message.length);
}
break;
// Si hay que asignar una tarea.
case GetPathTag:
// si aun hay rutas en la cola de tareas.
if (!queue.IsEmpty())
{
// se obtiene la ruta y se la envia con la mejor longitud
P = (Path *)queue.Remove(NULL);
message.length = P->length;
memcpy(message.city, P->city, MAXCITIES*sizeof(int));
message.visited = P->visited;
MPI_Send (&message, MessageSize, MPI_INT, status.MPI_SOURCE, ReplyPathTag, MPI_COMM_WORLD);
delete P;
}
else
{
// El proceso que pidio la ruta debe esperar
waiting[numberOfWaitingProcesses++] = status.MPI_SOURCE;
if (numberOfWaitingProcesses == NumberOfProcesses - 1)
// se les comunica a los demás procesos que se terminó
for (int i = 1; i < NumberOfProcesses; i++)
MPI_Send (NULL, 0, MPI_INT, i, DoneTag, MPI_COMM_WORLD);
}
break;
}
}
// Se imprime la ruta más corta.
printf("La Ruta Mas Corta Es : \n");
Shortest.Print();
}