/* aoc.scs : apportionment of credit routines. */ /* Procedure to initialize clearinghouse. */ initaoc (clearingrec) crecord *clearingrec; { char ch; fscanf (cfile, "%c%s", &ch, d_str); clearingrec -> bucketbrigadeflag = ((ch == 'y') || (ch == 'Y')); clearingrec -> winner = 0; clearingrec -> oldwinner = 0; /* First classifier picked as oldwinner. */ } /* Initial report of clearinghouse parameters. */ initrepaoc (rep, clearingrec) FILE *rep; crecord *clearingrec; { fprintf (rep, "\n"); fprintf (rep, "Apportionment of Credit Parameters\n"); fprintf (rep, "----------------------------------\n"); fprintf (rep, "Bucket brigade flag = "); if (clearingrec -> bucketbrigadeflag) fprintf (rep, " true\n"); else fprintf (rep, "false\n"); } /* Auction among currently matched classifiers - return winner. */ int auction (population, matchlist, oldwinner) poptype *population; classlist *matchlist; int oldwinner; { int j, k, f, winner; double s, bidmaximum=0.0; winner = oldwinner; /* If no match, oldwinner wins again. */ for (j=0; jnactive; j++) { k = matchlist->clist[j]; s = population -> classifier[k].strength; f = population -> classifier[k].specificity; population->classifier[k].bid = population -> cbid * (population -> bid1 + population -> bid2 * f) * s; population->classifier[k].ebid = population -> cbid * (population -> ebid1 + population -> ebid2 * f) * s + noise (0.0, population -> bidsigma); if (population->classifier[k].ebid > bidmaximum) { winner = k; bidmaximum = population->classifier[k].ebid; } } return (winner); } /* Procedure to distribute payment from recent winner to old winner. */ clearinghouse (population, clearingrec) poptype *population; crecord *clearingrec; { double payment; int w, o; w = clearingrec -> winner; o = clearingrec -> oldwinner; payment = population->classifier[w].bid; population->classifier[w].strength -= payment; if (clearingrec -> bucketbrigadeflag) /* Pay oldwinner receipt if bbf is on. */ population->classifier[o].strength += payment; } /* Function to collect existance and bidding taxes from population members. */ taxcollector (population) poptype *population; { int j; double k, bidtaxswitch; /* Lifetax from everyone, bidtax from actives. */ if ((population->lifetax != 0.0) || (population->bidtax != 0.0)) for (j=0; jnclassifier; j++) { if (population->classifier[j].matchflag) bidtaxswitch = 1.0; else bidtaxswitch = 0.0; k = population->classifier[j].strength * (population->lifetax + population->bidtax * bidtaxswitch); population->classifier[j].strength -= k; } } /* Procedure to report who pays to whom. */ reportaoc (rep, clearingrec) FILE *rep; crecord *clearingrec; { fprintf (rep, "\n"); fprintf (rep, "New winner [%d] : Old winner [%d]\n", clearingrec -> winner, clearingrec -> oldwinner); } /* Apportionment of credit coordinator. */ aoc (population, matchlist, clearingrec) poptype *population; classlist *matchlist; crecord *clearingrec; { clearingrec -> winner = auction (population, matchlist, clearingrec -> oldwinner); taxcollector (population); clearinghouse (population, clearingrec); }