Re: Code problem
- To: mathgroup at smc.vnet.net
- Subject: [mg65640] Re: Code problem
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Tue, 11 Apr 2006 04:04:54 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <e17fne$omi$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Eoin Gleeson wrote: > Dear Group, > > I am trying to execute the model below in Mathematica 5.2 (student), > but no matter what values I input for the initial conditions, the > output values for ST and T fail to change. I wonder if anyone would be > so good as to have a look at where I am going wrong with the code? Or > even suggest an appropriate forum to pursue this problem. > > Kind regards, > Eoin Gleeson > Trinity College Dublin > > In[1]:= > > Clear[PopSize]; > Clear[Wealth] > Clear[Iteration]; > Clear[SampleSize]; > Clear[Cost]; > Clear[Benefit]; > Clear[Tol]; > > PopSize = 100; > Iteration =20; > SampleSize = 10; > Cost = 1; > Benefit = SampleSize; > Tol = 8; > Tol2 =3; > > Wealth = Table [1, {PopSize}]; > Clear[Status] > Status = Table [0, {PopSize}]; > Clear[PopString] > PopString = Table[Random[], {PopSize}]; > Return["Initial Wealth"] > Return[Wealth] > Return["Initial Status"] > Return[Status] > > > Do[ > > {Clear[a]; > a = Table[Random[Integer, {1, PopSize}], {SampleSize}]; > Clear[S]; > S = Table[Status[[a[[m]]]], {m, 1, SampleSize}]; > Clear[ST]; > SS = SampleSize*SampleSize; > ST=Table[0,{ SS}]; > For[i=1, i<SampleSize+1, i++, {For[j=1, j<Samplesize+1, j++, > {For[k=0, k<SS+1, k++, ST[[k]]=S[[i]]-S[[j]]]}]}]; > Clear[T]; > T=0; > For[j=0,j<SS+1, j++,{If[ST[[j]]<Tol2, T++]}]; > For[i=1, i<SampleSize+1, i++, > {If[T>Tol+Tol+2, > > {If[Status[[a[[i]]]]â? 5, Status[[a[[i]]]]++], > Wealth[[a[[i]]]] = Wealth[[a[[i]]]] - Cost +Benefit}, > > > {If[Status[[a[[i]]]]â? -5, Status[[a[[i]]]]--]} > ]}] > }, {Iteration}] > Return["ST"] > Return[ST] > Return["T"] > Return[T] > Return["Final Wealth"] > Return[Wealth] > Return["Final Status"] > Return[Status] > > > > Out[20]= > Return[Initial Wealth] > > Out[21]= > Return[{1,1,1, > > 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, > > 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, > 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}] > > Out[22]= > Return[Initial Status] > > Out[23]= > Return[{0,0,0, > > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, > > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}] > > Out[25]= > Return[ST] > > Out[26]= > Return[{0,0,0, > > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, > > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, > 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}] > > Out[27]= > Return[T] > > Out[28]= > Return[100] > > Out[29]= > Return[Final Wealth] > > Out[30]= > Return[{19,19, > > 1,28,1,10,1,37,10,19,19,1,28,1,10,28,1,10,1,28,10,19,19,28,10,46,55,10, > 19,28,10,37,19,46,10,46,37,10, > > 1,28,10,28,19,19,28,10,10,19,10,37,10,28,19,28,19,19,10,28,28,1,10,10,10, > > 19,19,28,19,19,10,46,28,37,10,19,19,10,37,28,10,10,19,37,1,28,19,1,19, > 28,19,28,19,19,10,10,1,28,19,37,1,19}] > > Out[31]= > Return[Final Status] > > Out[32]= > Return[{2,2,0, > > 3,0,1,0,4,1,2,2,0,3,0,1,3,0,1,0,3,1,2,2,3,1,5,5,1,2,3,1,4,2,5,1,5,4,1,0,3, > > 1,3,2,2,3,1,1,2,1,4,1,3,2,3,2,2,1,3,3,0,1,1,1,2,2,3,2,2,1,5,3,4,1,2,2,1, > 4,3,1,1,2,4,0,3,2,0,2,3,2,3,2,2,1,1,0,3,2,4,0,2}] > Hi Eoin, Please find hereunder a slightly modified version of your code, with some additional comments, that is doing what you are looking for PopSize = 100; Iteration = 20; SampleSize = 10; Cost = 1; Benefit = SampleSize; Tol = 8; Tol2 = 3; Print["Initial Wealth: "] Wealth = Table[1, {PopSize}] Print["Initial Status: "] Status = Table[0, {PopSize}] (* Constant values should be initialized outside a loop *) SS = SampleSize2; Print["SS: ", SS]; Do[{ a = Table[Random[Integer, {1, PopSize}], {SampleSize}]; Print["----------------------------------------"]; Print["a: ", a]; S = Table[Status[[a[[m]]]], {m, 1, SampleSize}]; Print["S: ", S]; ST = Table[0, {SS}]; (*For[i = 1, i <= SampleSize, i++, (* Beware : Mathematica is case sensitive Samplesize is not SampleSize! *) For[j = 1, j <= SampleSize, j++, For[k = 0, k <= SS, k++, ST[[k]] = S[[i]] - S[[j]]; (*Print["i: ", i, " j: ", j, " k: ", k, " S[[i]]: ", S[[i]], " S[[j]]: ", S[[j]], " ST[[k]]: ", ST[[k]]]; *) ] ] ];*) (* The triple For loop can be replaced conveniently by the \ expression below -- functional programming approach *) ST = Flatten[Outer[Plus, S, -S]]; Print["ST: ", ST]; T = 0; (* j should start at 1 not 0 *) For[j = 1, j <= SS, j++, If[ST[[j]] < Tol2, T++]]; Print["T: ", T]; For[i = 1, i <= SampleSize, i++, If[T > 2Tol + 2, If[Status[[a[[i]]]] <= 5(* Here I have changed the test because the character was not readable in the email *), Status[[ a[[i]]]]++]; Wealth[[a[[i]]]] = Wealth[[a[[i]]]] - Cost + Benefit; If[Status[[a[[i]]]] <= -5 (* Here too I have changed the test for the same reason as above *), Status[[a[[i]]]]-- ] ] ]}, {Iteration}] Print["ST: ", ST] Print["T: ", T] Print["Final Wealth: ", Wealth] Print["Final Status: ", Status] Hope this helps, Jean-Marc