Algoritmia - Problemas NP-Completos

 
Vista:

Problemas NP-Completos

Publicado por hector santa (2 intervenciones) el 19/06/2005 07:07:27
tengo este problema

Se tienen p cajones con capacidad ilimitada y los enteros t1, ......tn. Empacar los ti en los cajones de modo que el nivel máximo de los cajones sea minimo.
Piense en los cajones como procesadores y en los ti como tiempos que tardan n trabajos independientes. El problema consiste en asignar trabajos a procesadores de modo que el conjunto de trabajos se termine en el menor tiempo posible.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Asignación de trabajos a procesadores para minimizar el tiempo total de ejecución

Publicado por Alejandro (307 intervenciones) el 05/03/2024 18:17:37
Héctor, el problema que estás describiendo es similar al problema de la asignación de trabajos a procesadores con el objetivo de minimizar el tiempo total de ejecución. Una estrategia común para abordar este tipo de problemas es utilizar algoritmos de ordenamiento y heurísticas. Una posible solución es utilizar el algoritmo de ordenación greedy.

Aquí hay una descripción general de cómo podrías abordar este problema:

1. Ordenar los tiempos de ejecución:
- Ordena los tiempos de ejecución t_1, t_2, ..., t_n en orden descendente. Esto significa que asignarás los trabajos más largos primero.

2. Inicializar los cajones (procesadores):
- Crea una estructura de datos para representar los cajones y sus niveles actuales. Puedes usar un vector, una lista enlazada o cualquier otra estructura de datos según tu preferencia.

3. Asignación greedy:
- Itera sobre los tiempos de ejecución ordenados y asigna cada trabajo al cajón con el nivel mínimo actual. Esto se hace para tratar de mantener equilibrados los niveles de los cajones.

4. Actualizar niveles:
- Después de asignar un trabajo, actualiza el nivel del cajón al que se asignó sumándole el tiempo de ejecución del trabajo.

5. Resultado:
- El nivel máximo entre todos los cajones al final de este proceso será la solución al problema.

Aquí tienes un esbozo de código en C++ que implementa este enfoque:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <algorithm>
 
// Estructura para representar un cajón (procesador)
struct Cajon {
    int nivel;
    std::vector<int> trabajos;
};
 
// Función para resolver el problema de asignación de trabajos a procesadores
void asignarTrabajos(std::vector<int>& tiempos, int numCajones) {
    // Ordenar los tiempos en orden descendente
    std::sort(tiempos.begin(), tiempos.end(), std::greater<int>());
 
    // Inicializar cajones
    std::vector<Cajon> cajones(numCajones, Cajon{0, {}});
 
    // Asignación greedy
    for (int tiempo : tiempos) {
        // Encontrar el cajón con el nivel mínimo actual
        auto minCajon = std::min_element(cajones.begin(), cajones.end(),
            [](const Cajon& c1, const Cajon& c2) {
                return c1.nivel < c2.nivel;
            });
 
        // Asignar el trabajo al cajón con el nivel mínimo
        minCajon->nivel += tiempo;
        minCajon->trabajos.push_back(tiempo);
    }
 
    // Mostrar resultados
    for (int i = 0; i < numCajones; ++i) {
        std::cout << "Cajon " << i + 1 << ": Nivel = " << cajones.nivel << ", Trabajos = ";
        for (int trabajo : cajones[i].trabajos) {
            std::cout << trabajo << " ";
        }
        std::cout << std::endl;
    }
}
 
int main() {
    // Ejemplo de uso
    std::vector<int> tiempos = {10, 5, 8, 15, 3};
    int numCajones = 2;
 
    asignarTrabajos(tiempos, numCajones);
 
    return 0;
}

Este código asignará los trabajos a los cajones de manera [i]greedy
, intentando mantener equilibrados los niveles. Puedes ajustar el número de cajones y los tiempos de ejecución según tus necesidades.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar