Grupo - Dilema Do Prisioneiro: mudanças entre as edições

De Física Computacional
Ir para navegação Ir para pesquisar
Linha 17: Linha 17:
[[Arquivo:placeholder |frame|500px|center|PlaceHolder]]
[[Arquivo:placeholder |frame|500px|center|PlaceHolder]]


==Programas==
[[https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Dilema_Do_Prisioneiro/Programas]]
Spatial_PD.c
[[Programas]]https://fiscomp.if.ufrgs.br/index.php/Grupo_-_Dilema_Do_Prisioneiro/Programas
<source>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
#include <time.h>
 
//Tamanho da população da matriz n x n
#define n_ 50
 
double sum_matrix(int matrix[][n_],int n);
double fermi_dirac(double p1, double p2, double k);
double PD_DILEMMA(double b, double c, double k, int n, int gen_num, double freq_coop,double ratio);
 
 
void main()
{
    double b,c,k,freq_coop;
    int n,gen_num;
 
    FILE *arq;
    arq = fopen("results.txt","w+");
 
    k = 0.1;
    n = n_;
 
    //Beneficio em cooperar
    b = 2;
 
    //Custo em cooperar
    c = 1;
 
    //Numero de geracoes
    gen_num = 1000;
 
    //Frequencia de cooperadores inicialmente
    freq_coop = 0.5;
 
    double ratio = c / (b-c);
    printf("%lf\n", ratio);
    double media = PD_DILEMMA(b,c,k,n,gen_num,freq_coop,ratio);
    printf("%lf\n",media);
 
 
}
double PD_DILEMMA(double b, double c, double k, int n, int gen_num, double freq_coop,double ratio)
{
    srand( (unsigned) time(NULL));
 
    char filename1[64],filename2[64],filename3[64];
    sprintf(filename1, "COOP_FREQ_B_%.2lf__C_%.2lf.txt", b,c);
    sprintf(filename2, "INITIAL_MATRIX_B_%.2lf__C_%.2lf.txt", b,c);
    sprintf(filename3, "FINAL_MATRIX_B_%.2lf__C_%.2lf.txt", b,c);
 
 
    FILE *arq,*arq2,*arq3;
    arq = fopen(filename1,"w+");
    arq2 = fopen(filename2,"w+");
    arq3 = fopen(filename3,"w+");
 
    double R,T,S,P,num_compet;
    double payoff_matrix[2][2];
    int i,j;
    double w,p1,p2;
    int pop[n][n];
    double sum = 0,sum2=0;
 
    num_compet = gen_num * n;
 
    //reward
    R = b-c;
 
    //temptation
    T = b;
 
    //sucker's payoff
    S = -c;
 
    //punishment
    P = 0;
 
    payoff_matrix[0][0] = P;
 
    payoff_matrix[0][1] = T;
 
    payoff_matrix[1][0] = S;
 
    payoff_matrix[1][1] = R;
 
 
 
    // 0  for defectors
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            double temp = rand() / (RAND_MAX + 1.0);
 
            if(temp < freq_coop)
                pop[i][j] = 1;
            else
                pop[i][j] = 0;
        }
    }
 
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
 
            fprintf(arq2,"%d ",pop[i][j]);
 
        }
        fprintf(arq2,"\n");
    }
 
    fclose(arq2);
 
 
 
    sum = sum_matrix(pop,n)/(double)n;
 
    fprintf(arq,"%d %lf\n",0,sum);
 
 
 
    for(i = 1; i <= num_compet; i++)
    {
        int x[2],y[2];
        x[0] = (n) * rand() / (RAND_MAX + 1.0) ;
        x[1] = (n) * rand() / (RAND_MAX + 1.0) ;
 
        int vizin[4][2];
 
        if(x[0] == 0)
        {
            vizin[0][0] = n-1;
            vizin[1][0] = x[0]+1;
            vizin[2][0] = x[0];
            vizin[3][0] = x[0];
        }
        else if(x[0] == n-1)
        {
            vizin[0][0] = x[0]-1;
            vizin[1][0] = 0;
            vizin[2][0] = x[0];
            vizin[3][0] = x[0];
        }
        else
        {
            vizin[0][0] = x[0]-1;
            vizin[1][0] = x[0]+1;
            vizin[2][0] = x[0];
            vizin[3][0] = x[0];
        }
        ////////
        if(x[1] == 0)
        {
            vizin[0][1] = x[1];
            vizin[1][1] = x[1];
            vizin[2][1] = n-1;
            vizin[3][1] = x[1]+1;
        }
        else if(x[1] == n-1)
        {
            vizin[0][1] = x[1];
            vizin[1][1] = x[1];
            vizin[2][1] = x[1]-1;
            vizin[3][1] = 0;
 
        }
        else
        {
 
            vizin[0][1] = x[1];
            vizin[1][1] = x[1];
            vizin[2][1] = x[1]-1;
            vizin[3][1] = x[1]+1;
        }
 
        p1=0;
        for(int l = 0; l < 4; l++)
        {
            p1 += payoff_matrix[pop[x[0]][x[1]]][pop[vizin[l][0]][vizin[l][1]]];
        }
 
 
 
        int temp = 4 * rand() / (RAND_MAX + 1.0);
 
        y[0] = vizin[temp][0];
        y[1] = vizin[temp][1];
 
        if(y[0] == 0)
        {
            vizin[0][0] = n-1;
            vizin[1][0] = y[0]+1;
            vizin[2][0] = y[0];
            vizin[3][0] = y[0];
        }
        else if(y[0] == n-1)
        {
            vizin[0][0] = y[0]-1;
            vizin[1][0] = 0;
            vizin[2][0] = y[0];
            vizin[3][0] = y[0];
        }
        else
        {
            vizin[0][0] = y[0]-1;
            vizin[1][0] = y[0]+1;
            vizin[2][0] = y[0];
            vizin[3][0] = y[0];
        }
        ////////
        if(y[1] == 0)
        {
            vizin[0][1] = y[1];
            vizin[1][1] = y[1];
            vizin[2][1] = n-1;
            vizin[3][1] = y[1]+1;
        }
        else if(y[0] == n-1)
        {
            vizin[0][1] = y[1];
            vizin[1][1] = y[1];
            vizin[2][1] = y[1]-1;
            vizin[3][1] = 0;
 
        }
        else
        {
 
            vizin[0][1] = y[1];
            vizin[1][1] = y[1];
            vizin[2][1] = y[1]-1;
            vizin[3][1] = y[1]+1;
        }
 
 
        p2=0;
        for(int l = 0; l < 4; l++)
        {
            p2 += payoff_matrix[pop[y[0]][y[1]]][pop[vizin[l][0]][vizin[l][1]]];
        }
 
        //Competir para ver se p1 assume a estrategia de p2
        w = fermi_dirac(p1, p2, k);
 
        if(w >= (rand() / (RAND_MAX + 1.0) ))
        {
            pop[x[0]][x[1]] = pop[y[0]][y[1]];
        }
 
        sum = sum_matrix(pop,n)/(double)n;
        fprintf(arq,"%d %lf\n",i,sum);
        sum2+=sum;
    }
 
    fclose(arq);
 
 
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
 
            fprintf(arq3,"%d ",pop[i][j]);
 
        }
        fprintf(arq3,"\n");
    }
 
    fclose(arq3);
 
 
    return (sum2/100.);
 
 
}
 
double sum_matrix(int matrix[][n_],int n)
{
    double sum = 0;
 
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
 
            sum += matrix[i][j];
 
        }
    }
    return sum;
 
 
}
 
double fermi_dirac(double p1, double p2, double k)
{
    double f;
    f = 1.0 / (1.0 + exp((p1 - p2) / k));
    return f;
}
 
</source>


==Bibliografia==
==Bibliografia==

Edição das 18h24min de 20 de janeiro de 2018

Integrantes do grupo: Leonardo Xavier Rodrigues (262696) e Rodrigo Lopes de Sousa Silva (262705)

Introdução

Dilema Do Prisioneiro

Dilema SnowDrift

Algorítmo De Jogos

Algorítmo Dilema do prisioneiro (População Misturada)

Algorítmo Dilema do prisioneiro (População Estruturada

Algorítmo Dilema SnowDrift

Resultados

[[1]] Programashttps://fiscomp.if.ufrgs.br/index.php/Grupo_-_Dilema_Do_Prisioneiro/Programas

Bibliografia

  • Dusan Misevic,Sebastian Bonhoeffer, Spatial cooperation games

https://www.ethz.ch/content/dam/ethz/special-interest/usys/ibz/theoreticalbiology/education/learningmaterials/701-1424-00L/scg.pdf

  • Game theory and physics, American Journal of Physics 73, 405 (2005)

http://dx.doi.org/10.1119/1.1848514

  • MARTIN A. NOWAK, SEBASTIAN BONHOEFFER, AND ROBERT M. MAY,Spatial games and the maintenance of cooperation

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC43892/pdf/pnas01133-0277.pdf

  • Behavioural evolution: Cooperate with thy neighbour?

https://www.nature.com/articles/428611a