예제 #1
0
//
// Arma matriz MK=inv(M)*K, devuelve matrices Qac y Dant con autovectores y autovalores
//
void calculo_av_prueba(
  int n,Coef m0, Coef ml, Coef mp, Matriz &K, vector<int>& l, vector<int>& p, Matriz& Qac, Matriz& Dant
){
  Matriz MK(n,n);
  for(int i=0;i<n;i++){
    float div=m0+l[i]*ml+p[i]*mp; // div es el coeficiente de M (M es diagonal)

    // Dividir cada fila de K por div es equivalente a multiplicarla a izq por inv(M)
    if (i>0) {
        MK.sub(i,i-1)=K.sub(i,i-1)/div;
    }
    if (i<n-1) {
      MK.sub(i,i)=K.sub(i,i)/div;
      MK.sub(i,i+1)=K.sub(i,i+1)/div;
    } else {
      MK.sub(i,i)=K.sub(i,i)/div;
    }
  }
  // Calculo autovectores y autovalores de inv(M)*K
  MK.autoval_autovect(Qac,Dant);
}
예제 #2
0
//
// Llama a la heurística correcta y hace los chequeos de éxito o no
// Corta cuando se alcanzó el tiempo máximo o la heurística no tiene 
// más combinaciones para intentar
//
void ejecuta_heuristica(
   int nh
  ,vector<int>& parametros
  ,int n
  ,Coef m0
  ,Coef ml
  ,Coef mp
  ,Matriz& K
  ,vector<int>& l
  ,vector<int>& p
  ,bool& ok
  ,bool& tmax
  ,int& c
  ,double& segundos
){
  vector<Coef> w(n); // Acá quedarán las frecuencias
  clock_t inicio,fin;
  Matriz Qac;
  Matriz Dant;

  inicio=clock();
  int cantl=0;
  int cantp=0;
  int v,m;

  c=1;

  if (nh==1){
    assert(parametros.size()==2);
  }
  if (nh==2){
    assert(parametros.size()==2);
    for (int i=0;i<n;i++) { cantl+=l[i]; l[i]=0; cantp+=p[i]; p[i]=0; }
    p[0]=cantp;
    l[n-1]=cantl;
  }

  while (1){
    if (!(c%10)) cout << "." << flush; // Para ver que está trabajando

    // Calcula autovectores y autovalores para esta prueba
    calculo_av_prueba(n,m0,ml,mp,K,l,p,Qac,Dant); // en Dant quedan los autovalores
    // Calcula frecuencias a partir de autovalores
    for (int i=0;i<n;i++) w[i]=sqrt(-Dant.sub(i,i));

    // Verifica si no están en el rango prohibido (2.7 a 3.3)
    ok=true;
    for (int i=0;i<n;i++) {
      if (w[i]>=2.7 && w[i] <= 3.3) ok=false;
    }

    // Calcula el tiempo transcurrido
    fin=clock();
    segundos=(double)(fin - inicio)/CLOCKS_PER_SEC;

    // Si las frecuencias no están en el rango prohibido terminamos=>sale
    if (ok) {
      cout << endl;
      cout << "Solución encontrada:" << endl;
      for (int i=0;i<n;i++) { cout << "  w[" << i << "]=" << w[i] << endl; }
      break;
    }
    
    if (segundos > TMAX) { // Máximo tiempo permitido para las pruebas
      cout << endl;
      cout << "Tiempo máximo alcanzado!" << endl;
      tmax=true;
      break;
    }
    if (nh==1){
      h1(parametros,n,l,p);
    } else {
      if ((l[0]==cantl || parametros[0]==0) && (p[n-1]==cantp || parametros[1]==0)) break;
      h2(parametros,n,l,p);
    }
    c++;
  }
  if (!ok && !tmax) cout << endl;

  cout << "Cantidad de pruebas: " << c << "." << endl;
  cout << "Tiempo ejecucion: " << setprecision(15) << segundos << " segundos." << endl;
}