# ECOLI4a: Back to School

**URL:** <http://discourse.iapct.org/t/ecoli4a-back-to-school/3741>\
**Category:** CSG1994\
**Created:** [November 22, 1994, 9:38pm UTC](http://discourse.iapct.org/t/ecoli4a-back-to-school/3741 "1994-11-22T21:38:01Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Abbott\_Bruce\_Indiana](http://discourse.iapct.org/letter_avatar_proxy/v4/letter/a/ee59a6/32.png) [@Abbott\_Bruce\_Indiana](http://discourse.iapct.org/u/Abbott_Bruce_Indiana)\
**Post date:** [November 22, 1994, 9:38pm UTC](http://discourse.iapct.org/t/ecoli4a-back-to-school/3741/1 "1994-11-22T21:38:01Z")

</div>

[From Bruce Abbott (941122.1615 EST)]

> Bill Powers (941122.0730 MST) --

> Let's cut to the chase:

> Your program says

> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If NutSave \> 0 then { If S+ present during tumble then ...

> Here you are defining Nutsave as S+.

> I have already pointed out that in DoTumble, NutSave is actually set to  
> the value of dNut \_prior\_ to the tumble, even though your comment says  
> it is dNut \_after\_ the tumble.

Yes, I must be getting dyslexic. It is the value of dNut PRIOR to a tumble.  
When going back later to add comments, I was confused by the statement's  
position AFTER the tumble, but of course dNut is still its pre-tumble value.  
I apologize for any confusion this may have caused. However, the logic  
implemented in StepEColi is correct, even if my description of the identity of  
NutSave was not.

Below is the relevant code from ECOLI4a. Let's step through StepEColi to see  
what happens:

procedure StepEColi;  
begin

[This section steps e. coli forward along its current trajectory]  
&nbsp;&nbsp;EcoliX := EcoliX + Speed \* cos(Angle);  
&nbsp;&nbsp;EcoliY := EcoliY + Speed \* sin(Angle);  
&nbsp;&nbsp;X := Round(EcoliX);  
&nbsp;&nbsp;Y := Round(EcoliY);  
&nbsp;&nbsp;PutPixel(X, Y, white);

[Now we determine the nutrient level at e. coli's new position.]  
&nbsp;&nbsp;NewNut := NutConcen(EcoliX, EcoliY);

[ Next we compare the new nutrient concentration against its previous value  
&nbsp;&nbsp;and save the change in dNut.]

&nbsp;&nbsp;dNut := (NewNut - NutCon);

[ If e. coli just tumbled (on the previous iteration) then JustTumbled will  
&nbsp;&nbsp;be true, otherwise it will be false. Call ReinforceOrPunish if JustTumbled  
&nbsp;&nbsp;is true. JustTumbled is initialized to false, so this will not happen on  
&nbsp;&nbsp;the first iteration.]

&nbsp;&nbsp;if JustTumbled then ReinforceOrPunish;

[ If the change in dNut on THIS iteration is positive, then use pTS+ to  
&nbsp;&nbsp;determine the probability of a tumble, otherwise use pTS-. Determine  
&nbsp;&nbsp;whether or not to tumble on this iteration.]

&nbsp;&nbsp;if dNut \> 0 then { S+ present; tumble probability determined by current S+}  
&nbsp;&nbsp;&nbsp;&nbsp;begin  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Random \< pTumbleGivenSplus) then DoTumble  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else JustTumbled := false;  
&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;else { S- present; tumble probability determined by current S-}  
&nbsp;&nbsp;&nbsp;&nbsp;begin  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Random \< pTumbleGivenSminus) then DoTumble  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else JustTumbled := false;  
&nbsp;&nbsp;&nbsp;&nbsp;end;

[Save the current value of NewNut in NutCon for use next iteration.]  
&nbsp;&nbsp;NutCon := NewNut;  
end;

Now let's assume that a tumble DID occur in the above iteration. The  
following happens via the call to DoTumble:

&nbsp;&nbsp;procedure DoTumble;  
&nbsp;&nbsp;begin  
&nbsp;&nbsp;&nbsp;&nbsp;NutSave := dNut; { NutSave is nutrient rate of change immediately }  
&nbsp;&nbsp;&nbsp;&nbsp;Tumble(Angle); { PRIOR to a tumble }  
&nbsp;&nbsp;&nbsp;&nbsp;JustTumbled := true;  
&nbsp;&nbsp;end;

(I moved the NutSave statement to make its relationship to a tumble clearer.)  
The current value of dNut is saved, a new angle is selected, and JustTumbled  
is set to true.

On the NEXT iteration following the tumble, the following happens:

[We move e. coli forward along its new, post-tumble trajectory]  
&nbsp;&nbsp;EcoliX := EcoliX + Speed \* cos(Angle);  
&nbsp;&nbsp;EcoliY := EcoliY + Speed \* sin(Angle);  
&nbsp;&nbsp;X := Round(EcoliX);  
&nbsp;&nbsp;Y := Round(EcoliY);  
&nbsp;&nbsp;PutPixel(X, Y, white);

[Now we determine the nutrient level at e. coli's new position.]  
&nbsp;&nbsp;NewNut := NutConcen(EcoliX, EcoliY);

[ Next we compare the new nutrient concentration against its previous value  
&nbsp;&nbsp;and save the change in dNut.]

&nbsp;&nbsp;dNut := (NewNut - NutCon);

[ dNut is now the change in nutrient concentration AFTER the tumble AND the  
&nbsp;&nbsp;current change in nutrient concentration.]

[ Next we check to see if e. coli tumbled on the previous iteration.  
&nbsp;&nbsp;It did, so we call ReinforceOrPunish.]

&nbsp;&nbsp;if JustTumbled then ReinforceOrPunish;

&nbsp;&nbsp;procedure ReinforceOrPunish;  
&nbsp;&nbsp;var  
&nbsp;&nbsp;&nbsp;&nbsp;DeltaNutRate: real;  
&nbsp;&nbsp;begin

[ We compare the value of dNut immediately after the tumble with its value  
&nbsp;&nbsp;immediately before the tumble. DeltaNutRate will be positive if the new  
&nbsp;&nbsp;value is greater than the old (an improvement) and negative if the new value  
&nbsp;&nbsp;is less than the old (a deterioration).]

&nbsp;&nbsp;&nbsp;&nbsp;DeltaNutRate := dNut - NutSave; { Change in the rate of change in }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ nutrient following a tumble. }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ + = improvement = reinforcement }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ - = deterioration = punishment }

[ If things have gotten better, then this is reinforcement. Increase the  
probability of a tumble given the condition present prior to the tumble (i.e.,  
positive or negative NutSave).]  
&nbsp;&nbsp;&nbsp;&nbsp;If DeltaNutRate \> 0 then { Nutrient rate increased by tumble: reinforce }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { tumbling }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If NutSave \> 0 then { If S+ present during tumble then }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { increase probability of tumble given S+ }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTumbleGivenSplus := pTumbleGivenSplus + LearnRate;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pTumbleGivenSplus \> pMax then pTumbleGivenSplus := pMax;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { S- present when last tumbled then }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { increase probability of tumble given S- }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTumbleGivenSminus := pTumbleGivenSminus + LearnRate;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pTumbleGivenSminus \> pMax then pTumbleGivenSminus := pMax;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;else

[If things have gotten worse, then this is punishment. Decrease the  
probability of a tumble given the condition present prior to the tumble  
(positive or negative NutSave).]  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if DeltaNutrate \< 0 then { Nutrient rate decreased by tumble: punish }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If NutSave \> 0 then { If S+ present when last tumbled then }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { decrease probability of tumble given S+ }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTumbleGivenSplus := pTumbleGivenSplus - LearnRate;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pTumbleGivenSplus \< pMin then pTumbleGivenSplus := pMin;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { If S- present when last tumbled then }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { decrease probability of tumble given S- }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTumbleGivenSminus := pTumbleGivenSminus - LearnRate;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pTumbleGivenSminus \< pMin then pTumbleGivenSminus := pMin;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;  
&nbsp;&nbsp;end;

Thus, other than my gaff in describing what NutSave is, everything works as  
advertised.

> In the section that actually implements the tumbles, you say
> 
> &nbsp;&nbsp;&nbsp;if dNut \> 0 then { S+ present; tumble probability determined by S+ }
> 
> Note that now the \_present\_ value of dNut is said to be S+. If you had  
> not changed the definition of S+ within the same iteration, you would  
> have had to say
> 
> &nbsp;&nbsp;if NutSave \> 0 then {S+ present ...

Not so. A positive nutrient change is always S+; a negative nutrient change  
is always S-. dNut, the current value of nutrient change, establishes which  
discriminative stimulus is currently present, and thus which tumbling  
probability should be in effect. NutSave, the value immediately before the  
tumble, saves the previous value of dNut in order to allow the consequences of  
a tumble to be referred to the discriminative stimulus present at the time the  
tumble took place. So I have not changed the definition of S+ and S-, I am  
using different variables to represent the discriminative stimuli that are  
present before and after a tumble. The table below summarizes what happens in  
ReinforceOrPunish:

&nbsp;&nbsp;S Before Tumble\* Consequence of Tumble Result

> **···**
>
> -----------------------------------------------------------------  
> &nbsp;&nbsp;positive dNut (S+) increased dNut (reinf) increase p(Tumble|S+)  
> &nbsp;&nbsp;positive dNut (S+) decreased dNut (punis) decrease p(Tumble|S+)
> 
> &nbsp;&nbsp;negative dNut (S-) increased dNut (reinf) increase p(Tumble|S-)  
> &nbsp;&nbsp;negative dNut (S-) decreased dNut (punis) decrease p(Tumble|S-)  
> &nbsp;&nbsp;------------------------------------------------------------------  
> &nbsp;&nbsp;\*Stored in NutSave
> 
> In a currently positive nutrient gradient (S+ present, stored in dNut),  
> p(Tumble|S+) controls, er, sets the probability of a tumble. In a currently  
> negative nutrient gradient (S- present), p(Tumble|S- sets the probability of a  
> tumble. Thus the program implements the proper three-term contingency as  
> specified by the reinforcement model.
> 
> If you define S+ and S- as two "situations" in which responses (tumbles)  
> occur, you will see that, in a given situation, those responses which are  
> followed by a satisfying state of affairs (more positive nutrient rate) have  
> their "connections" to the situation "strengthened" (probability of a tumble  
> increased) so that, when the situation recurs, the response (tumbling) will be  
> more likely to occur (p(Tumble|S) increased). In a given situation, those  
> responses which are followed by an annoying state of affairs (less positive  
> nutrient rate) will have their connection to the situation weakened (reduced  
> p(Tumble|S), so that, when the situation recurs, the response (Tumbling) will  
> be less likely to occur. This is just a restatement of the law of effect.
> 
> > You have offered a program which does in fact produce the right  
> > behavior. But you have not considered the question of whether your  
> > explanation is unique, or if not unique then best. There are several  
> > other models that will create the same results, only faster. The  
> > simplest one is
> > 
> > if dNut \> 0 then decrease(PTS+); (toward 0)  
> > if dNut \<= 0 then increase(PTS-); (toward 1)
> > 
> > This modification will produce "learning" just as your program does, but  
> > much faster and without using any knowledge about previous values of  
> > dNut. Aside from the goal of making the model fit the language of  
> > operant conditioning, what motive could we have for preferring your  
> > model over the alternate one, which works even better? Yours is  
> > computationally more complex, and results in slower learning with at  
> > least some probability of failure. The modification is very simple and  
> > also infallible.
> 
> Your simplified model does not learn anything: it is just a pair of one-way  
> control systems that force the two probabilities to opposite extremes.  
> ECOLI4a actually does learn, and fairly rapidly, I might add. To learn,  
> ECOLI4a must first try out tumbling under different conditions and discover  
> what happens. If the geometry of the situation were changed so that tumbles  
> during S+ tended to make things better more often than worse, and tumbles  
> during S- tended to make things worse more often than better, ECOLI4a would  
> learn to tumble in a positive gradient and not to tumble in a negative  
> gradient. The simulation is completely unbiased in the sense that ECOLI4a  
> will learn the correct behavior regardless of what the "correct" behavior is,  
> and will thus find its way up the nutrient gradient. Your "improved" model  
> will not. This is the basis for my preferring the more complex model.
> 
> > I have shown a modification of the model which WILL "learn" appropriate  
> > behavior in the same sense that yours does, and which does not use the  
> > change in probability across a tumble, DeltaNutRate.
> 
> [Minor correction: DeltaNutRate is not the change in probability across a  
> tumble, it is the change in the nutrient rate across a tumble.]
> 
> I'm sorry, but I just can't see any learning going on in your model.  
> Learning, as envisioned in PCT, involves a reorganization of the system in  
> such a was as to establish or improve negative-feedback control over some  
> perceptual variable. All I see is a fairly ordinary two-level control system,  
> one for regulating rate of change in nutrients and one, operating through the  
> first, for regulating nutrient concentration. My ECOLI6 works in a similar  
> way to control stored nutrient levels. It's entertaining, it may represent  
> the actual way some organism regulates its nutrient levels, but it does not  
> model learning. In contrast, ECOLI4a alters its response probabilities in the  
> presence of increasing or decreasing nutrient gradients as a result of  
> experience with the consequences of its behavior. Its program code does not  
> tell it how to behave in order to climb the nutrient gradient; instead it must  
> learn what works, under what conditions.
> 
> > It proposes ONE possible mechanism, but it is a very elaborate mechanism  
> > and others would work equally well or better.
> 
> O.K., then here's a challenge: start with an e. coli model that wants to  
> perceive increasing nutrient levels but (and this is crucial) does NOT know  
> how to get them. That is, it does not know when to tumble or not tumble; it  
> does not know how its rate of tumble should vary with the change in nutrient  
> levels. In the absence of learning it should just do a random walk. It  
> should then attempt to "find" the right relationship by (1) varying its  
> behavior and (2) using the results of its "experiments" to develop an  
> appropriate (negative feedback) relationship between its behavior and error.
> 
> When you have such a model, we will compare its complexity to the complexity  
> of ECOLI4a; otherwise we are comparing apples and oranges.
> 
> > And I am not convinced  
> > that your model actually does embody the law of effect as you state it.  
> > You will have to be much more precise about your definitions before I  
> > will believe that.
> 
> I hope I have been able to do that. (:-\>
> 
> Sincerely,
> 
> Bruce

---

<div class="post-metadata">

**Author:** ![Tom\_BOURBON3](http://discourse.iapct.org/letter_avatar_proxy/v4/letter/t/85e7bf/32.png) [@Tom\_BOURBON3](http://discourse.iapct.org/u/Tom_BOURBON3)\
**Post date:** [November 22, 1994, 11:54pm UTC](http://discourse.iapct.org/t/ecoli4a-back-to-school/3741/2 "1994-11-22T23:54:18Z")

</div>

Tom Bourbon [941122.1743]

> [From Bruce Abbott (941122.1615 EST)]
> 
> > Bill Powers (941122.0730 MST) --
> 
> > Let's cut to the chase:

And in reply to Bill, Bruce delivered a few cuts of his own. 😉

I only have time for a quick question, Bruce. What is a "probability" that  
it can be altered deliberately, as in the following quote from you?

> [ If things have gotten better, then this is reinforcement. Increase the  
> probability of a tumble given the condition present prior to the tumble (i.e.,  
> positive or negative NutSave).]  
> &nbsp;&nbsp;&nbsp;If DeltaNutRate \> 0 then { Nutrient rate increased by tumble: reinforce }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { tumbling }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If NutSave \> 0 then { If S+ present during tumble then }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { increase probability of tumble given S+ }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTumbleGivenSplus := pTumbleGivenSplus + LearnRate;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pTumbleGivenSplus \> pMax then pTumbleGivenSplus := pMax;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { S- present when last tumbled then }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { increase probability of tumble given S- }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTumbleGivenSminus := pTumbleGivenSminus + LearnRate;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pTumbleGivenSminus \> pMax then pTumbleGivenSminus := pMax;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
> &nbsp;&nbsp;&nbsp;else
> 
> [If things have gotten worse, then this is punishment. Decrease the  
> probability of a tumble given the condition present prior to the tumble  
> (positive or negative NutSave).]  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if DeltaNutrate \< 0 then { Nutrient rate decreased by tumble: punish }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If NutSave \> 0 then { If S+ present when last tumbled then }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { decrease probability of tumble given S+ }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTumbleGivenSplus := pTumbleGivenSplus - LearnRate;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pTumbleGivenSplus \< pMin then pTumbleGivenSplus := pMin;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { If S- present when last tumbled then }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin { decrease probability of tumble given S- }  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTumbleGivenSminus := pTumbleGivenSminus - LearnRate;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if pTumbleGivenSminus \< pMin then pTumbleGivenSminus := pMin;  
> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;  
> end;

In your model, "probability" seems to be controllable entity. It looks to  
me as though you include in the model a feature that guarantees the outward  
appearances of behavior will be right, but the added feature implies some  
(to my thinking) unlikely properties of the system (E. coli).

In your model, what is this thing called "probability?"

Later,

Tom
