Calculo de menor prazo

1 resposta
A

Fala pessoal…
mais um probleminha :slight_smile:

é o seguinte: tenho uma lista de atividades de um projeto. Bom, montei um grafo com essas atividades. Tenho que calcular qual é o menor tempo q estas atividades podem ser executadas…
Tenho uma classe Grafo que dentro dela tenho um Vector de vertices e tenho uma matriz de adjacências(ja q tem atividades que soh podem ser executadas dps que certa atividade jah acabou).

Eu não to conseguindo calcular este menor tempo…
Abaixo tem um exemplo.

1 3 2 4
2 5 3 4 5
3 6 4
4 2
5 9

1ª Coluna: Nº da atividade
2ª Coluna: Quantas semanas essa atividade demora pra ser executada
3ª Coluna ou +: São as atividades que dependem dela.
Ex.: 1ª linha… Atividade 1, demora 3 semanas, as atividades 2 e 4 soh podem ser executadas dps q a 1 foi executada.

Neste caso o menor tempo de execução são 17 semanas.

Eu não to conseguindo fazer este calculo…
Eu posso ter até 200 atividades, então teria q ser algo bem genérico. Eu tentei fazer por caminhamento em profundidade, mas não tive muito sucesso pois falta a parte do calculo q não to conseguindo resolver…

agradeço a ajuda de vcs!

abraços

1 Resposta

L

hmm, vc trabalha com isso ou eh coisa de faculdade?! queria trabalhar fazendo sistemas desse tipo hehe vou fazer para vc porque gosto desse tipo de problema.

É uma solução generica que deve funcionar para qualquer… o que pode abaixar a performasse eh o fato de uma tarefa ser dependente da tarefa X e Y sendo que a X eh dependente da Y (como no caso do 2 que eh dependente de 3 e 4 e 3 eh dependente de 4).

Tenta entender o que eu fiz, pelos meus testes está funcionado, se vc não entende alguma coisa, me add no msn [email removido] que eu te explico hj anoite (depois das 21h que eh qdo eu vou estar em casa).

Isso ae :wink:

package lubs;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Teste
{
   public static final int INF = Integer.MAX_VALUE;

   static class Tarefa
   {
      public int id;
      public List<Tarefa> dep;
      public int tempo;
      public int tempoTotal;

      public Tarefa (int id, int tempo)
      {
         this.id = id;
         this.tempo = tempo;
         this.tempoTotal = INF;
         this.dep = new ArrayList<Tarefa>();
      }

      public Tarefa addDep(Tarefa t)
      {
         dep.add(t);
         return this;
      }

      public void acertaTempo()
      {
         int tempoDep = 0;
         Set<Tarefa> analisadas = new HashSet<Tarefa>();
         for (Tarefa t : dep)
         {
            if (analisadas.contains(t)) continue;
            if (t.tempoTotal == INF)
            {
               tempoTotal = INF;
               return;
            }
            analisadas.addAll(dependentes(t));
            tempoDep = Math.max(tempoDep, t.tempoTotal);
         }
         tempoTotal = tempo + tempoDep;
      }

      private Set<Tarefa> dependentes(Tarefa t)
      {
         Set<Tarefa> setDep = new HashSet<Tarefa>();
         setDep.add(t);
         for (Tarefa dep : t.dep)
         {
            setDep.addAll(dependentes(dep));
         }
         return setDep;
      }
   }

   public static void main(String[] args)
   {
      // cria as tarefas
      Tarefa t1 = new Tarefa(1, 3);
      Tarefa t2 = new Tarefa(2, 5);
      Tarefa t3 = new Tarefa(3, 6);
      Tarefa t4 = new Tarefa(4, 2);
      Tarefa t5 = new Tarefa(5, 9);

      // adiciona as dependencias
      t1.addDep(t2).addDep(t4);
      t2.addDep(t3).addDep(t4).addDep(t5);
      t3.addDep(t4);

      // coloca numa lista
      List<Tarefa> tarefas = new ArrayList<Tarefa>();
      tarefas.add(t1);
      tarefas.add(t2);
      tarefas.add(t3);
      tarefas.add(t4);
      tarefas.add(t5);

      // aqui que começa a logica para valer
      boolean processa = true;
      while (processa)
      {
         processa = false;
         for (Tarefa t : tarefas)
         {
            if (t.tempoTotal == INF) t.acertaTempo();
            if (t.tempoTotal == INF) processa = true;
         }
      }

      int max = 0;
      for (Tarefa t : tarefas)
      {
         max = Math.max(max, t.tempoTotal);
         System.out.println("Tarefa " + t.id + " levara " + t.tempoTotal + " semanas para acabar");
      }
      System.out.println("Total do projeto: " + max + " semanas.");

   }

}

e sim, eu deixei tudo public, mas isso vc ajusta neh

valeu!

Ah, e eu não fiz qq tratamento para detectar loopings do tipo 1 eh dependente de 5 e 5 eh dependente de 1, ou 1 eh dependente de 3 que eh dependente de 5 que eh dependente de 1. O certo eh ter essa validação e não deixar incluir como dependente a tarefa Y de uma tarefa X, se existe direta ou indiretamente. uma dependencia de X para Y.

Criado 14 de novembro de 2006
Ultima resposta 14 de nov. de 2006
Respostas 1
Participantes 2