Tillbaka till svenska Fidonet
English   Information   Debug  
ECHOLIST   0/18295
EC_SUPPORT   0/318
ELECTRONICS   0/359
ELEKTRONIK.GER   1534
ENET.LINGUISTIC   0/13
ENET.POLITICS   0/4
ENET.SOFT   0/11701
ENET.SYSOP   33945
ENET.TALKS   0/32
ENGLISH_TUTOR   0/2000
EVOLUTION   0/1335
FDECHO   0/217
FDN_ANNOUNCE   0/7068
FIDONEWS   24159
FIDONEWS_OLD1   0/49742
FIDONEWS_OLD2   0/35949
FIDONEWS_OLD3   0/30874
FIDONEWS_OLD4   0/37224
FIDO_SYSOP   12852
FIDO_UTIL   0/180
FILEFIND   0/209
FILEGATE   0/212
FILM   0/18
FNEWS_PUBLISH   4436
FN_SYSOP   41706
FN_SYSOP_OLD1   71952
FTP_FIDO   0/2
FTSC_PUBLIC   0/13613
FUNNY   0/4886
GENEALOGY.EUR   0/71
GET_INFO   105
GOLDED   0/408
HAM   0/16074
HOLYSMOKE   0/6791
HOT_SITES   0/1
HTMLEDIT   0/71
HUB203   466
HUB_100   264
HUB_400   39
HUMOR   0/29
IC   0/2851
INTERNET   0/424
INTERUSER   0/3
IP_CONNECT   719
JAMNNTPD   0/233
JAMTLAND   0/47
KATTY_KORNER   0/41
LAN   0/16
LINUX-USER   0/19
LINUXHELP   0/1155
LINUX   0/22112
LINUX_BBS   0/957
mail   18.68
mail_fore_ok   249
MENSA   0/341
MODERATOR   0/102
MONTE   0/992
MOSCOW_OKLAHOMA   0/1245
MUFFIN   0/783
MUSIC   0/321
N203_STAT   930
N203_SYSCHAT   313
NET203   321
NET204   69
NET_DEV   0/10
NORD.ADMIN   0/101
NORD.CHAT   0/2572
NORD.FIDONET   189
NORD.HARDWARE   0/28
NORD.KULTUR   0/114
NORD.PROG   0/32
NORD.SOFTWARE   0/88
NORD.TEKNIK   0/58
NORD   0/453
OCCULT_CHAT   0/93
OS2BBS   0/787
OS2DOSBBS   0/580
OS2HW   0/42
OS2INET   0/37
OS2LAN   0/134
OS2PROG   0/36
OS2REXX   0/113
OS2USER-L   207
OS2   0/4786
OSDEBATE   0/18996
PASCAL   0/490
PERL   0/457
PHP   0/45
POINTS   0/405
POLITICS   0/29554
POL_INC   0/14731
PSION   103
R20_ADMIN   1123
R20_AMATORRADIO   0/2
R20_BEST_OF_FIDONET   13
R20_CHAT   0/893
R20_DEPP   0/3
R20_DEV   399
R20_ECHO2   1379
R20_ECHOPRES   0/35
R20_ESTAT   0/719
R20_FIDONETPROG...
...RAM.MYPOINT
  0/2
R20_FIDONETPROGRAM   0/22
R20_FIDONET   0/248
R20_FILEFIND   0/24
R20_FILEFOUND   0/22
R20_HIFI   0/3
R20_INFO2   3249
R20_INTERNET   0/12940
R20_INTRESSE   0/60
R20_INTR_KOM   0/99
R20_KANDIDAT.CHAT   42
R20_KANDIDAT   28
R20_KOM_DEV   112
R20_KONTROLL   0/13300
R20_KORSET   0/18
R20_LOKALTRAFIK   0/24
R20_MODERATOR   0/1852
R20_NC   76
R20_NET200   245
R20_NETWORK.OTH...
...ERNETS
  0/13
R20_OPERATIVSYS...
...TEM.LINUX
  0/44
R20_PROGRAMVAROR   0/1
R20_REC2NEC   534
R20_SFOSM   0/341
R20_SF   0/108
R20_SPRAK.ENGLISH   0/1
R20_SQUISH   107
R20_TEST   2
R20_WORST_OF_FIDONET   12
RAR   0/9
RA_MULTI   106
RA_UTIL   0/162
REGCON.EUR   0/2056
REGCON   0/13
SCIENCE   0/1206
SF   0/239
SHAREWARE_SUPPORT   0/5146
SHAREWRE   0/14
SIMPSONS   0/169
STATS_OLD1   0/2539.065
STATS_OLD2   0/2530
STATS_OLD3   0/2395.095
STATS_OLD4   0/1692.25
SURVIVOR   0/495
SYSOPS_CORNER   0/3
SYSOP   0/84
TAGLINES   0/112
TEAMOS2   0/4530
TECH   0/2617
TEST.444   0/105
TRAPDOOR   0/19
TREK   0/755
TUB   0/290
UFO   0/40
UNIX   0/1316
USA_EURLINK   0/102
USR_MODEMS   0/1
VATICAN   0/2740
VIETNAM_VETS   0/14
VIRUS   0/378
VIRUS_INFO   0/201
VISUAL_BASIC   0/473
WHITEHOUSE   0/5187
WIN2000   0/101
WIN32   0/30
WIN95   0/4289
WIN95_OLD1   0/70272
WINDOWS   0/1517
WWB_SYSOP   0/419
WWB_TECH   0/810
ZCC-PUBLIC   0/1
ZEC   4

 
4DOS   0/134
ABORTION   0/7
ALASKA_CHAT   0/506
ALLFIX_FILE   0/1313
ALLFIX_FILE_OLD1   0/7997
ALT_DOS   0/152
AMATEUR_RADIO   0/1039
AMIGASALE   0/14
AMIGA   0/331
AMIGA_INT   0/1
AMIGA_PROG   0/20
AMIGA_SYSOP   0/26
ANIME   0/15
ARGUS   0/924
ASCII_ART   0/340
ASIAN_LINK   0/651
ASTRONOMY   0/417
AUDIO   0/92
AUTOMOBILE_RACING   0/105
BABYLON5   0/17862
BAG   135
BATPOWER   0/361
BBBS.ENGLISH   0/382
BBSLAW   0/109
BBS_ADS   0/5290
BBS_INTERNET   0/507
BIBLE   0/3563
BINKD   0/1119
BINKLEY   0/215
BLUEWAVE   0/2173
CABLE_MODEMS   0/25
CBM   0/46
CDRECORD   0/66
CDROM   0/20
CLASSIC_COMPUTER   0/378
COMICS   0/15
CONSPRCY   0/899
COOKING   33421
COOKING_OLD1   0/24719
COOKING_OLD2   0/40862
COOKING_OLD3   0/37489
COOKING_OLD4   0/35496
COOKING_OLD5   9370
C_ECHO   0/189
C_PLUSPLUS   0/31
DIRTY_DOZEN   0/201
DOORGAMES   0/2065
DOS_INTERNET   0/196
duplikat   6002
Möte EVOLUTION, 1335 texter
 lista första sista föregående nästa
Text 161, 403 rader
Skriven 2004-09-25 21:57:00 av Malcolm (1:278/230)
Ärende: Re: Fixation rates for mu
=================================



"phillip smith" <deletethis-phills@ihug.co.nz> wrote
>
> From Kimura the time for a neutral mutation to be fixed is the mutation
> rate.
> If I have ten genes each of which can have a neutral mutation. What is the
> mean time taken  for there to be no individuals which are free of
mutation.
> That is the whole population carries at least one of the ten mutations
>

Here's a simulation for you, written in C.

(It is portable and should work on any computer with a C compiler. Post here
if you want me to send you a PC executable compiled by me).

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>


#define WILD 0
#define MUTANT 1

typedef struct
{
  char *maternal;    /* maternal genes */
  char *paternal;    /* paternal genes */
} ORGANISM;


typedef struct
{
  int Nmales;          /* number of males */
  int Nfemales;        /* number of females */
  ORGANISM *males;     /* list of males */
  ORGANISM *females;   /* list of females */
  int Ngenes;          /* no genes each organism has */
} GENERATION;

GENERATION *generation(int N, int Ngenes);
void killgeneration(GENERATION *g);
void addwild(GENERATION *g);
void nextgen(GENERATION *prev, GENERATION *next);
int countmutants(GENERATION *g);
void breed(ORGANISM *mother, ORGANISM *father, ORGANISM *child, int Ngenes);
int hasmutant(ORGANISM *org, int Ngenes);
int random(int N);


int main(int argc, char **argv)
{
  int N;
  int Ngenes;
  int gen = 0;
  GENERATION *g1;
  GENERATION *g2;
  GENERATION *gtemp;
  int muts;

  srand(time(0));

  printf("Traces fixation of mutant genes through a population\n, by genetic
drift.");
  printf("Each mutant is originally present in a single copy\n");
  printf("The population is diploid and sexual\n");

  printf("Population size (min 4)\n");
  while( scanf("%d", &N) != 1)
    printf("Bad input\n");
  if(N < 4)
  {
    printf("Bad input\n");
 exit(EXIT_FAILURE);
  }

  printf("Number of genes (min 1)\n");
  while(scanf("%d", &Ngenes) != 1)
    printf("Bad input\n");
  if(Ngenes < 1)
  {
    printf("Bad Input\n");
 exit(EXIT_FAILURE);
  }

  printf("N = %d, Ngenes = %d\n", N, Ngenes);

  g1 = generation(N, Ngenes);
  if(!g1)
  {
    printf("Out of memory\n");
 exit(EXIT_FAILURE);
  }

  g2 = generation(N, Ngenes);
  if(!g2)
  {
    killgeneration(g1);
 printf("Out of memory\n");
 exit(EXIT_FAILURE);
  }

  addwild(g1);

  printf("Gen 0 mutants %d\n", countmutants(g1));

  do
  {
 gen++;
    nextgen( g1, g2);
 muts = countmutants(g2);

 printf("Gen %d mutants %d\n", gen, muts);

    gtemp = g1;
 g1 = g2;
 g2 = gtemp;
  }
  while(muts > 0 && muts < N);

  return 0;
}

/*
  Creates the gereration structure
  Params: N - population size
          Ngenes - number of loci
*/
GENERATION *generation(int N, int Ngenes)
{
  GENERATION *answer;
  int i;
  int ii;

  assert(N >= 4);
  assert(Ngenes > 0);

  answer = malloc(sizeof(GENERATION));
  if(!answer)
    return 0;

  answer->Nmales = N/2;
  answer->Nfemales = N - answer->Nmales;

  answer->males = malloc( answer->Nmales * sizeof(ORGANISM));
  if(!answer->males)
  {
    killgeneration(answer);
 return 0;
  }

  for(i=0;i<answer->Nmales;i++)
  {
    answer->males[i].maternal = 0;
 answer->males[i].paternal = 0;
  }

  answer->females = malloc(answer->Nfemales * sizeof(ORGANISM));
  if(!answer->females)
  {
    killgeneration(answer);
 return 0;
  }

  for(i=0;i<answer->Nfemales;i++)
  {
    answer->females[i].maternal = 0;
    answer->females[i].paternal = 0;
  }

  for(i=0;i<answer->Nmales;i++)
  {
    answer->males[i].maternal = malloc(Ngenes);

    if(!answer->males[i].maternal)
 {
   killgeneration(answer);
   return 0;
 }

 for(ii=0;ii<Ngenes;ii++)
      answer->males[i].maternal[ii] = WILD;

 answer->males[i].paternal = malloc(Ngenes);

 if(!answer->males[i].paternal)
 {
   killgeneration(answer);
   return 0;
 }

 for(ii=0;ii<Ngenes;ii++)
   answer->males[i].paternal[ii] = WILD;
  }

  for(i=0;i<answer->Nfemales;i++)
  {
    answer->females[i].maternal = malloc(Ngenes);

 if(!answer->females[i].maternal)
 {
   killgeneration(answer);
   return 0;
 }

 for(ii=0;ii<Ngenes;ii++)
   answer->females[i].maternal[ii] = WILD;

 answer->females[i].paternal = malloc(Ngenes);

 if(!answer->females[i].paternal)
 {
   killgeneration(answer);
   return 0;
 }

 for(ii=0;ii<Ngenes;ii++)
   answer->females[i].paternal[ii] = WILD;
  }

  answer->Ngenes = Ngenes;

  return answer;
}

/*
  GENERATION structure destructor
*/
void killgeneration(GENERATION *g)
{
  int i;

  if(g->males)
  {
    for(i=0;i<g->Nmales;i++)
    {
      free(g->males[i].maternal);
   free(g->males[i].paternal);
    }
  }

  if(g->females)
  {
    for(i=0;i<g->Nfemales;i++)
    {
      free(g->females[i].maternal);
   free(g->females[i].paternal);
    }
  }

  free(g->males);
  free(g->females);

  free(g);
}


/*
  add the mutant alleles to the population
  adds one per gene.
*/
void addwild(GENERATION *g)
{
  int i;
  int target;

  for(i=0;i<g->Ngenes;i++)
  {
    if(random(2) == 0)
 {
   target = random(g->Nmales);
   if(random(2) == 0)
     g->males[target].maternal[i] = MUTANT;
   else
     g->males[target].paternal[i] = MUTANT;
 }
 else
 {
   target = random(g->Nfemales);
   if(random(2) == 0)
     g->females[target].maternal[i] = MUTANT;
   else
     g->females[target].paternal[i] = MUTANT;
 }
  }
}

/*
  run the simulation for one generation
*/
void nextgen(GENERATION *prev, GENERATION *next)
{
  int i;
  int mummy;
  int daddy;

  for(i=0;i<next->Nmales;i++)
  {
    mummy = random(prev->Nfemales);
 daddy = random(prev->Nmales);

 breed(&prev->females[mummy], &prev->males[daddy], &next->males[i],
prev->Ngenes);
  }

  for(i=0;i<next->Nfemales;i++)
  {
    mummy = random(prev->Nfemales);
 daddy = random(prev->Nmales);

 breed(&prev->females[mummy], &prev->males[daddy], &next->females[i],
prev->Ngenes);
  }

}

/*
  return the number of organisms with at least one mutant allele
*/
int countmutants(GENERATION *g)
{
  int answer = 0;
  int i;

  for(i=0;i<g->Nmales;i++)
    if(hasmutant(&g->males[i], g->Ngenes))
   answer++;

  for(i=0;i<g->Nfemales;i++)
    if(hasmutant(&g->females[i], g->Ngenes))
   answer++;

  return answer;

}

/*
  produce random offspring.
  Params: mother - parent 1
          father - parent 2
    child - child to fill
    Ngenes - number of genes
*/
void breed(ORGANISM *mother, ORGANISM *father, ORGANISM *child, int Ngenes)
{
  int i;

  for(i=0;i<Ngenes;i++)
  {
    if(random(2) == 0)
   child->maternal[i] = mother->maternal[i];
 else
   child->maternal[i] = mother->paternal[i];

 if(random(2) == 0)
   child->paternal[i] = father->maternal[i];
 else
   child->paternal[i] = father->paternal[i];
  }
}

/*
  test if the organism has any mutant alleles
  Returns 1 if has mutant, 0 if not.
*/
int hasmutant(ORGANISM *org, int Ngenes)
{
  int i;

  for(i=0;i<Ngenes;i++)
  {
    if(org->maternal[i] == MUTANT)
   return 1;
 if(org->paternal[i] == MUTANT)
   return 1;
  }

  return 0;
}



/*
  random - produce an random number 0 - N-1.
  Notes could be tweaked to make simulation better.
*/
int random(int N)
{
  if(N == 2)
   return rand() < RAND_MAX / 2 ? 0 : 1;

  return rand() % N;
}
---
ū RIMEGate(tm)/RGXPost V1.14 at BBSWORLD * Info@bbsworld.com

---
 * RIMEGate(tm)V10.2á˙* RelayNet(tm) NNTP Gateway * MoonDog BBS
 * RgateImp.MoonDog.BBS at 9/25/04 9:57:21 PM
 * Origin: MoonDog BBS, Brooklyn,NY, 718 692-2498, 1:278/230 (1:278/230)