#include #include #include #include #include #define N 2000 //Numero de agentes #define delta_teta 0.015 //Variacion de sensibilidad #define r 1900.0 //Factor de multiplicacion #define cant 1.000 #define alpha 1.0 //Peso de la norma #define ciclos 25000 //Número de ciclos en actualización asíncrona #define umbral 4.0000 //con 0.0 habrá un 100% de cooperadores iniciales y con 10.0 un 0% #define X 2.5 //SENSIBILIDAD MAXIMA, LA SENSIBILIDAD ESTARA EN EL INTERVALO [0,X] CON X:(Xentera+Xdecimal) #define Max 3 //Max=Xentera+1 using namespace std; /* ESTRUCTURA INDIVIDUO */ struct individuo { double u; //resultado de la función de utilidad indivdual double trib; //variable "booleana" que indica si el individuo contribuye o no double teta; //sensibilidad hacia la norma }; /* FUNCIONES */ //FUNCION PARA INICIALIZAR ".teta" double p_decimal() { double c; double d; c=1+(rand()%1000); d=c/1000; return d; } void inicializar_teta(struct individuo u[],int tam) { double Num; double Numd;//parte decimal, nuestro numero es un decimal Num(Nume,Numd) double Nume;//parte entera //tenemos un limite X(Xe,Xd), (parte entera,parte decimal) for (int cont=0;contX) {Num=X*Num/Max;} //HISTOGRAMA A DERECHAS [0, 2.5](Dominio de potenciales agentes cooperadores) /* if (Num>X) //HISTOGRAMA A IZQUIERDAS [0, 2.5](Dominio de potenciales agentes defectores) { Num=X*Num/Max; Num=Num-2.0; } */ /* if (Num>X) {Num=Num-1;} //HISTOGRAMA CENTRADO [0, 1.5] (Dominio de agentes indecisos) if (Num>X) {Num=13*Num/28;} //HISTOGRAMA CENTRADO [0, 3.5] (Dominio de agentes indecisos) if (Num>X) {Num=5*Num/11;} //HISTOGRAMA CENTRADO [0, 2.5] (Dominio de agentes indecisos) */ u[cont].teta=Num; } } //FUNCION PARA INICIALIZAR EL VECTOR DE INDIVIDUOS void inicializar_vector(struct individuo w[], int tam) { int cont; double aux1=0.0; double aux2=0.0; double aux=0.0; //INICIALIZACION DE ".trib" for (cont=0;contumbral) w[cont].trib=1.0; else w[cont].trib=0.0; } inicializar_teta (w,tam); } //FUNCION QUE CALCULA EL NUMERO DE CONTRIBUYENTES int contribuyentes (struct individuo w[], int tam) { int cont; int nc; nc=0; for (cont=0;cont(w[b].u))&&(aux.trib==0.0)) { w[b].teta=(w[b].teta)-delta_teta; w[b].trib=0.0; } if (((aux.u)<(w[b].u))&&(aux.trib==1.0)) { w[b].teta=(w[b].teta)-delta_teta; } if (((aux.u)>(w[b].u))&&(aux.trib==1.0)) { w[b].teta=(w[b].teta)+delta_teta; w[b].trib=1.0; } } /* FUNCION PRINCIPAL */ void main() { /* - REPRESENTAR GRAFICAMENTE LOS RESULTADOS */ ofstream sout("contr.txt"); ofstream hist1("sensi.txt"); ofstream hist2("sensf.txt"); ofstream fout("salida.txt"); struct individuo v[N]; struct individuo w[N]; double sens_media; int *a; int cont; //PARA RECORRER EL ARRAY double num_trib; //NUMERO DE CONTRIBUYENTES double norma; srand(time(NULL)); //INICIALIZACION DE CONDICIONES DE PARTIDA inicializar_vector(v,N); num_trib=contribuyentes(v,N); norma=alpha*(num_trib)/N; funcion_utilidad(v,N,num_trib,norma); for (cont=0;cont>b; fout.close(); sout.close(); hist1.close(); hist2.close(); free (a); }