Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  dfs
Language: C/C++
Code:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"des.c"
#include"des.h"


struct lista
{
     unsigned char chei[8];
     lista *prec,*urm;
     int selected_eli;
     int fitness;
};
lista *prim,*ultim;
int d(unsigned char a,unsigned char b)
{
     int s;
     int i;
     s=0;
     for(i=0;i<8;i++)
     {
          s+=(a&1)^(b&1);
          a=a>>1;
          b=b>>1;
     }
          return s;
}
int d(unsigned char a[8],unsigned char b[8])
{
     int i;
     int s=0;
     for(i=0;i<8;i++)
          s+=d(a[i],b[i]);
     return s;
}
int fitness(unsigned char chei[8],unsigned char p[8],unsigned char c[8])
{
     unsigned char p1[8],c1[8];
     des_context dc;
des_set_key( &dc,chei );

     des_crypt(dc.esk,p,c1);
     des_crypt(dc.dsk,c,p1);
     return d(p,p1)+d(c,c1);
}
void adaug(unsigned char cheie[8],unsigned char p[8],unsigned char c[8])
{
     lista *aux;
     int i;
     aux=(lista*)malloc(sizeof(lista));
     aux->fitness=fitness(cheie,p,c);
     aux->selected_eli=0;
     for(i=0;i<8;i++)
          aux->chei[i] =cheie[i];
     aux->urm=prim;
     prim->prec=aux;
     prim=aux;
     
}
void generare(unsigned char cheie[8])
{
     int i;
     for(i=0;i<8;i++)
     {
          cheie[i]=(unsigned char)(rand()%256);
     }
}


lista* elitist(unsigned char p[8],unsigned char c[8])
{
     lista *i;
      lista *adresa;
     int min;
     min=100;
     for(i=prim;i!=NULL;i=i->urm)
          if(min>i->fitness && i->selected_eli==0)
               {
                    adresa=i;
                    min=fitness(i->chei,p,c);
               }
          
          return adresa;
}
void sterge(lista *adresa)
{

     adresa->urm->prec=adresa->prec;
     adresa->prec->urm=adresa->urm;
     free(adresa);
}


void se(unsigned char a[8],unsigned char b[8])
{
     int i;
     for(i=0;i<8;i++)
     {
          a[i]=a[i]^b[i];
     }
}
void copy(unsigned char a[8],unsigned char b[8])
{
     int i;
     for(i=0;i<8;i++)
     {
          a[i]=b[i];
     }
}
lista *incrusisare(unsigned char chei1[8],unsigned char chei2[8],unsigned char p[8],unsigned char c[8])
{
     
     lista *pi,*q;
     int i;
     unsigned char k[8][8];
     copy(k[0],p);
     se(k[0],c);
     copy(k[1],chei1);
     se(k[1],c);
     copy(k[2],chei1);
     se(k[2],p);
     copy(k[3],chei1);
     se(k[3],k[0]);
     copy(k[4],chei2);
     se(k[4],c);
     copy(k[5],chei2);
     se(k[5],p);
     copy(k[6],chei2);
     se(k[6],k[4]);
     copy(k[7],chei1);
     se(k[7],chei2);
     pi=prim;
     prim=NULL;
     
     for(i=0;i<8;i++)
          adaug(k[i],p,c);
     q=prim;
     prim=pi;
     return q;
}
void mutatie(unsigned char chei[8],int n)
{
     int i,j;
     int nb,poz;
     for(i=0;i<n;i++)
     {
          nb=rand()%64;
          for(j=0;j<(nb/8);j++);
          poz=rand()%8;
          chei[j]=chei[j]^(1<<poz);
     }
}

lista* ag(unsigned char p[8],unsigned char c[8],int nm,double ri,double rm)
{
     lista *best;
     lista *lb;
     lista *incrusisate;
     lista *k1,*k2;
     best=elitist(p,c);
     while(best->fitness>0)
     {
          k1=elitist(p,c);
          k2=elitist(p,c);
          if((double)(rand()-1)/(double)RAND_MAX<ri)
               incrusisate=incrusisare(k1->chei,k2->chei,p,c);
          if((double)(rand()-1)/(double)RAND_MAX<rm)
               for(k1=prim;k1!=NULL;k1=k1->urm)
               {
                    mutatie(k1->chei,nm);
                    k1->selected_eli=0;
                    k1->fitness=fitness(k1->chei,p,c);
               }
          ultim->urm=incrusisate;
          incrusisate->prec=ultim;
          lb=elitist(p,c);
          if(lb->fitness<best->fitness)
          {
               best=lb;
          
          }
     }
     return best;
}
int main(int argc,char **argv)
{
     unsigned char *p,*c;
     int nm,npop;
     double ri,rm;
     lista *bestos;
     p=(unsigned char*)argv[1];
     c=(unsigned char*)argv[2];
     nm=atoi((const char*)argv[3]);
     npop=atoi((const char*)argv[6]);
ri=strtod((const char*)argv[4],NULL);
rm=strtod((const char*)argv[5],NULL);
     
     
     bestos=ag(p,c,nm,ri,rm);
     puts((const char*)(bestos->chei));
     return 0;
}

          
Comments: