Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - kjg

#1

tengo el siguiente algoritmo para resolver el problema de la n reinas con algoritmo genetico, mi duda es como podria adaptarlo para un estilo de seleccion por torneo


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>




int TamT = 8;

int area[50][50];

int chromosomeMatriz[50][100000];
int CostoMatriz[10000];
int MatrizCruz[50][100000];
int Poblacion = 100000;
int Iteracion = 100000;
float MutacionR = 0.5;


void Clear(){
int i, j;
for (i=0;i<TamT;i++)
for (j=0;j<TamT;j++)
area[i][j]=0;
}


void PoblacionInicial(){
int random, index, a, b, bCheck;

for (index=0; index<=Poblacion-1; index++){
for (a=0; a<TamT; a++){
random = rand();
bCheck = 1;

for(b=0; b<a; b++){
if(random % TamT == chromosomeMatriz[b][index])
bCheck=0;
if(bCheck)
chromosomeMatriz[a][index] = random % TamT;
else
a--;
}
}
}
}


void LlenarArea(int index){
int i;

    Clear();
    for (i=0; i<TamT; i++)
        area[i][chromosomeMatriz[i][index]]=1;
}


int CostFunc(int index){
    int costValue=0;
    int m,n;
    int i,j;

    for(i=0;i<TamT;i++){   
        j=chromosomeMatriz[i][index];

        m=i+1;
        n=j-1;
        while(m<TamT && n>=0){
            if(area[m][n]==1) costValue++;
            m++;
            n--;
        }

        m=i+1;
        n=j+1;
        while(m<TamT && n<TamT ){       
            if(area[m][n]==1) costValue++;           
            m++;
            n++;
        }

        m=i-1;
        n=j-1;
        while(m>=0 && n>=0){       
            if(area[m][n]==1) costValue++;
            m--;
            n--;
        }

        m=i-1;
        n=j+1;
        while(m>=0 && n<TamT){       
            if(area[m][n]==1) costValue++;           
            m--;
            n++;
        }
    }

    return costValue;
}


void PopulationSort(){
    int k=1, i, j;
    int Temp;
    while (k){
        k=0;
        for (i=0;i<=Poblacion-2;i++){
            if (CostoMatriz[i]>CostoMatriz[i+1]){
                Temp=CostoMatriz[i];
                CostoMatriz[i] = CostoMatriz[i+1];
                CostoMatriz[i+1] = Temp;
               
            for (j=0; j<TamT; j++){
                Temp=chromosomeMatriz[j][i];
                chromosomeMatriz[j][i] = chromosomeMatriz[j][i+1];
                chromosomeMatriz[j][i+1] = Temp;
            }           
            k=1;
            }
        }
    }
}


void GenerateCrossOverMatrix(){
    int randomCrossOver, index, a;

    for (index=0;index<=Poblacion-1;index++){
        for (a=0;a<TamT;a++){
            randomCrossOver=rand();
           MatrizCruz[a][index]=randomCrossOver%2;
        }
    }
}


void Mating(){
int TempMatrix[50][2];
int TempMatrix0[50],TempMatrix1[50];
int Temp,j,k, index, t, i;

for (index=0;index<=(Poblacion/4)-1;index++){
for (t=0;t<=1;t++){

for(i=0;i<TamT;i++){
TempMatrix0[i]=chromosomeMatriz[i][2*index];
TempMatrix1[i]=chromosomeMatriz[i][2*index+1];
}
for (i=0;i<TamT;i++)
if(MatrizCruz[i][2*index+t]==0){
for (j=0;j<TamT;j++)
if(TempMatrix0[j]!=100){
TempMatrix[i][t]=TempMatrix0[j];
Temp=TempMatrix0[j];
TempMatrix0[j]=100;
j=TamT-1;

for (k=0;k<TamT;k++){
if (TempMatrix1[k]==Temp){
TempMatrix1[k]=100;
k=TamT-1;
}
}
}
}else{
for (j=0;j<TamT;j++)
if(TempMatrix1[j]!=100){
TempMatrix[i][t]=TempMatrix1[j];
Temp=TempMatrix1[j];
TempMatrix1[j]=100;
j=TamT-1;

for (k=0;k<TamT;k++){
if (TempMatrix0[k]==Temp){
TempMatrix0[k]=100;
k=TamT-1;
}
}
}
}

for(i=0;i<TamT;i++)
chromosomeMatriz[i][2*index+Poblacion/2+t]=TempMatrix[i][t];

}
}
}


void ApplyMutation(){
int randomChromosome;
int randomGen0,randomGen1;
int Temp, k;
int NumberOfMutation = (int)MutacionR*(Poblacion-1)*TamT;

for(k=0;k<=NumberOfMutation;k++){
randomChromosome=0;
while((randomChromosome=rand()%Poblacion)==0);

randomGen0=rand()%TamT;
while((randomGen1=rand()%TamT)==randomGen0);

Temp=chromosomeMatriz[randomGen0][randomChromosome];
chromosomeMatriz[randomGen0][randomChromosome]=chromosomeMatriz[randomGen1][randomChromosome];
chromosomeMatriz[randomGen0][randomChromosome]=Temp;
}

}


void DisplayBoard(){
int i, j;

for(i=0; i<=TamT-1; i++){
for(j=0; j<=TamT-1; j++){
if(j == chromosomeMatriz[i][0]){
printf("0  ");
}else{
printf(".  ");
}
}
printf("\n");
}

printf("\n");
}

int main(){
     
int i,k,g,num;
char a='g';

k=0;
g=0;
num=0;

printf("\nNumero de reinas: ");
scanf("%d", &TamT);

printf("Numero de poblacion (ex 1000): ");
scanf("%d", &Poblacion);

printf("Numarul de iteratii (ex 1000): ");
scanf("%d", &Iteracion);

printf("Rata de mutatie (ex 0.5): ");
scanf("%f", &MutacionR);

printf("\nSolutie:\n");

PoblacionInicial();

while(g==0 && num<Iteracion){
num++;
g=0;

for (k=0;k<=Poblacion-1;k++){
LlenarArea(k);
CostoMatriz[k]=CostFunc(k);
}

PopulationSort();

if (CostoMatriz[0]==0) g=1;

DisplayBoard();

GenerateCrossOverMatrix();

Mating();

ApplyMutation();

system("PAUSE");
return 0;
}
}





#2
Programación C/C++ / archivos y registros
13 Diciembre 2016, 21:10 PM
no se como terminar mi ejercicio(tengo que terminar uno ya hecho),hice el modulo para cargar datos, no estoy seguro de como hacer los demas, el ejercicio un archivo llamado "maratones.txt", por ejemplo un archivos de esta forma,
"pais años hora minuto"
pais años hora minuto
pais años hora minuto
pais años hora minuto
de una pais y el modulo me de los dato de ese pais (el año hora minuto"                                                       

#include <stdio.h>

#define FALSO 0
#define VERDADERO 1
#define NUM_MARCAS 20
#define SALIR 4

struct marca_s {
       char pais[50];
           int año;
               int horas;
               int minutos;
};


typedef struct marca_s marca_t;


void CargaDatos(marca_t tiempos[]);
int IndiceMejorTiempo(marca_t tiempos[], int año);
void TiempoPromedio(marca_t tiempos[], int año, int *horas, int *mins);
void EscribeEstadisticas(int año, int hprom, int mprom, int hmejor, int mmejor);
void DespliegaMenu();
int LeeOpcionValida(int min, int max);

marca_t tiempos[NUM_MARCAS];

void TiempoPromedio()
{
 int a;
 
 printf("dame el año que quieras conocer el promedio");
 scanf("%d",&a);
 printf("%d",tiempos.año
 
   
int main(void)
{ int opcion;
 
 CargaDatos(tiempos);
 
 do{
   //.....
   DespliegaMenu();
   opcion = LeeOpcionValida(1,4);
   printf("Operacion elegida: %d\n", opcion);
   }while (opcion != SALIR);
 //.....
 printf("Gracias por usar mi aplicación\n");
 return 0;

}


/* Función que carga los datos del archivo maratones.txt a la estructura de datos */
void CargaDatos(marca_t tiempos[])
{
 int i=0;
 FILE *ap1;
  ap1 = fopen("maratones.txt", "r");
  do{
      fscanf(ap1,"%s %d %d %d\n",tiempos[i].pais,&tiempos[i].año,&tiempos[i].horas, &tiempos[i].minutos);
      printf("Valores leidos: %s\t%d\t%d\t%d\n",tiempos[i].pais,tiempos[i].año,tiempos[i].horas,tiempos[i].minutos);
      i++;
  } while( !feof(ap1) );
   fclose(ap1);
}


/* Función que despliega el menu de la aplicación */
void DespliegaMenu()
{
 printf("************************************************\n");
 printf("Bienvenido. Elige tu operacion: \n");
 printf("[1]: Conocer tiempo promedio en un año \n");
 printf("[2]: Conocer mejor tiempo en un año (y lugar)\n");
 printf("[3]: Guardar estadisticas de un año\n");
 printf("[4]: Salir\n");
 printf("************************************************\n");
}



/* Función que lee y regresa una opción válida */
int LeeOpcionValida(int min, int max)
{ int op;
 
 do
 {
   printf("Opcion? [%d,%d]:",min,max);
   scanf("%d",&op);
 }while ((op > max) || (op < min));
 return op;
}


/* Función que escribe las estadisticas del deportista en el archivo estadisticas.txt */
void EscribeEstadisticas(int año, int hprom, int mprom, int hmejor, int mmejor)
{
 /*...*/
 fprintf(/*...*/,"%d %d:%d %d:%d\n",año, hprom, mprom, hmejor, mmejor);
 /*...*/
}

/*
*
* Completar el siguiente programa para que:
*
* a) Cargue los tiempos de un maratonista que están registrados en el archivo "maratones.txt"
*    En cada renglón de este archivo se tienen los siguientes campos separados por un espacio: país, año, horas y minutos. Donde país es sólo una palabra.
* b) Obtenga el número de marca en la que el maratonista hizo el mejor tiempo en un año dado. Si el año no existe, regresa -1.
* c) Obtenga el tiempo promedio en un año dado.
* d) Para un año dado, agregue en el archivo estadisticas.txt un renglón con los datos: año horasprom:minutosprom horasmejor:minutosmejor
*    Donde horasprom y minutosprom  corresponden a las horas y minutos del tiempo promedio
*    horasmejor y minutosmejor corresponden a las horas y minutos del mejor tiempo en ese año.
*

*
*/
#3
Programación C/C++ / no se que esta mal
1 Diciembre 2016, 06:45 AM
no se que esta mal, se supone que debe poner 6 "1" , sin sobre esribir ninguno, pero no se porque no se puede

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define N 5
#define M 5
int main()
{
 int tablero[N][M];
 int i,j,k;
 int numbarcos=(N*M)/4;
 printf("se colocaran %d barcos",numbarcos);
 for(i=0;i<N;i++)
     for(j=0;j<M;j++)
          tablero[i][j]=0;
          printf ("tablero original\n");
          for(i=0;i<N;i++)
          {
          for(j=0;j<M;j++)
         printf("%i\t",tablero[i][j]);
         printf("\n");
}
 int hora,r,col;
 hora=time(NULL);
 srand(hora);
 for(k=0;k<numbarcos;k++){
 if(tablero[rand()%N][rand()%M]==0){
 tablero[rand()%N][rand()%M]=1;
 }else {
 while(tablero[rand()%N][rand()%M]==1){
 if(tablero[rand()%N][rand()%N]==0){
 tablero[rand()%N][rand()%M]=1;}
 break;
}
}
 int c=0;
 
 for(i=0;i<N;i++)
     for(j=0;j<M;j++)
            if (tablero[i][j]==1)
            c=c+1;
           
             printf("se colocaron %d barcos\n",c);
             
            printf("tablero con barcos\n");
            for(i=0;i<N;i++)
            {
            for(j=0;j<M;j++)
            printf("%i\t",tablero[i][j]);
            printf("\n");
            }
           
                                                                         }
 system("PAUSE");
 return 0;
}


Mod: Los códigos van entre etiquetas GeSHi. Temas sobre C/C++ van al subforo de C/C++