From 751195f55a507905805fb6c0dc8f6f262c405fa1 Mon Sep 17 00:00:00 2001 From: Zening Li <zeningl@student.unimelb.edu.au> Date: Sun, 4 Apr 2021 19:36:30 +1000 Subject: [PATCH] Initial commit --- Automail/.classpath | 11 + Automail/.project | 17 + Automail/.settings/org.eclipse.jdt.core.prefs | 14 + Automail/WifiModem.jar | Bin 0 -> 4235 bytes Automail/automail.properties | 15 + Automail/bin/automail/Automail.class | Bin 0 -> 757 bytes Automail/bin/automail/MailItem.class | Bin 0 -> 1890 bytes Automail/bin/automail/MailPool$Item.class | Bin 0 -> 631 bytes .../automail/MailPool$ItemComparator.class | Bin 0 -> 1042 bytes Automail/bin/automail/MailPool.class | Bin 0 -> 2678 bytes Automail/bin/automail/Robot$RobotState.class | Bin 0 -> 1125 bytes Automail/bin/automail/Robot.class | Bin 0 -> 4581 bytes .../ExcessiveDeliveryException.class | Bin 0 -> 422 bytes .../exceptions/ItemTooHeavyException.class | Bin 0 -> 382 bytes .../MailAlreadyDeliveredException.class | Bin 0 -> 410 bytes Automail/bin/simulation/Building.class | Bin 0 -> 380 bytes Automail/bin/simulation/Clock.class | Bin 0 -> 510 bytes Automail/bin/simulation/IMailDelivery.class | Bin 0 -> 161 bytes Automail/bin/simulation/MailGenerator.class | Bin 0 -> 3797 bytes .../Simulation$ReportDelivery.class | Bin 0 -> 1495 bytes Automail/bin/simulation/Simulation.class | Bin 0 -> 6480 bytes Automail/expected.txt | 742 ++++++++++++++++++ Automail/src/automail/Automail.java | 20 + Automail/src/automail/MailItem.java | 82 ++ Automail/src/automail/MailPool.java | 100 +++ Automail/src/automail/Robot.java | 176 +++++ .../ExcessiveDeliveryException.java | 10 + .../src/exceptions/ItemTooHeavyException.java | 10 + .../MailAlreadyDeliveredException.java | 10 + Automail/src/simulation/Building.java | 15 + Automail/src/simulation/Clock.java | 18 + Automail/src/simulation/IMailDelivery.java | 16 + Automail/src/simulation/MailGenerator.java | 135 ++++ Automail/src/simulation/Simulation.java | 181 +++++ 34 files changed, 1572 insertions(+) create mode 100644 Automail/.classpath create mode 100644 Automail/.project create mode 100644 Automail/.settings/org.eclipse.jdt.core.prefs create mode 100644 Automail/WifiModem.jar create mode 100644 Automail/automail.properties create mode 100644 Automail/bin/automail/Automail.class create mode 100644 Automail/bin/automail/MailItem.class create mode 100644 Automail/bin/automail/MailPool$Item.class create mode 100644 Automail/bin/automail/MailPool$ItemComparator.class create mode 100644 Automail/bin/automail/MailPool.class create mode 100644 Automail/bin/automail/Robot$RobotState.class create mode 100644 Automail/bin/automail/Robot.class create mode 100644 Automail/bin/exceptions/ExcessiveDeliveryException.class create mode 100644 Automail/bin/exceptions/ItemTooHeavyException.class create mode 100644 Automail/bin/exceptions/MailAlreadyDeliveredException.class create mode 100644 Automail/bin/simulation/Building.class create mode 100644 Automail/bin/simulation/Clock.class create mode 100644 Automail/bin/simulation/IMailDelivery.class create mode 100644 Automail/bin/simulation/MailGenerator.class create mode 100644 Automail/bin/simulation/Simulation$ReportDelivery.class create mode 100644 Automail/bin/simulation/Simulation.class create mode 100644 Automail/expected.txt create mode 100644 Automail/src/automail/Automail.java create mode 100644 Automail/src/automail/MailItem.java create mode 100644 Automail/src/automail/MailPool.java create mode 100644 Automail/src/automail/Robot.java create mode 100644 Automail/src/exceptions/ExcessiveDeliveryException.java create mode 100644 Automail/src/exceptions/ItemTooHeavyException.java create mode 100644 Automail/src/exceptions/MailAlreadyDeliveredException.java create mode 100644 Automail/src/simulation/Building.java create mode 100644 Automail/src/simulation/Clock.java create mode 100644 Automail/src/simulation/IMailDelivery.java create mode 100644 Automail/src/simulation/MailGenerator.java create mode 100644 Automail/src/simulation/Simulation.java diff --git a/Automail/.classpath b/Automail/.classpath new file mode 100644 index 0000000..445b8e9 --- /dev/null +++ b/Automail/.classpath @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"> + <attributes> + <attribute name="module" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="lib" path="WifiModem.jar"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/Automail/.project b/Automail/.project new file mode 100644 index 0000000..29e4846 --- /dev/null +++ b/Automail/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>Automail</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/Automail/.settings/org.eclipse.jdt.core.prefs b/Automail/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f2525a8 --- /dev/null +++ b/Automail/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/Automail/WifiModem.jar b/Automail/WifiModem.jar new file mode 100644 index 0000000000000000000000000000000000000000..b4b61f012b7dcd3929dd5628cfd89bff93880b75 GIT binary patch literal 4235 zcmWIWW@Zs#;Nak3VA@n3#DD}u7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onm14?0e?4 zkGHPgMP6@Rt#fD2Zw@lJV*KFgqo+&^0p9E!o9da~Ni#4oNHQ=m1i&ruPsl;BfP;a7 zL9d`FKPxr4q%^>m|B!;n9Mg~XCU<pB)s8XVKG^R&J!_8OJYL^Mwv5N;#RW`F3#-fD zzq`w*C%?#-?LwROPEYa3d1?wPlVYyT{!(Oj=6Yu2nPodJuVTz9PgwD6ZfVwWzYQu( zU9Wc8>wdP0kNr7UUX-~pFrtDr)Tv<$tK0jNn?KIsWaz!H_POqAs|9kdJ4(ZpA`_BU zTq<ST@^o(Fnnbh3Ub`E4R3segwJq2$mcHNYdnCgr;md5HndQ9Vnbo|3f0_PE@A<aR z;X-TiedhVk`~H981o{7A$=%LV3=9lijL7~!x)C*iy%-o6lJj%*OY<^wQ*)B^i_25< zj13G7%=F7M(=v1OQ&MyF!!y$|eL*ah;MAhB%;Z$x#Jt4x)ZEm(63@Jn)S|S+<W#-n zoW$bdsiAj+r9(yj$1>fVq^Fp&U}}??=1~<_p|yW6xY(&EZDh>KTzK^S>1RUIa>@!f zFDyBBKJ&Qw{JFm#_{{(HqGXw;wbkPvtKRSX@#OwPgI7DvPfu@XKAG~~^7*{#^Y6>; z%=Z8Ldf1;q@8G2iM<$rgDcY1ZJ2g>PReO7Dt=&|wSf6`l)6Z@S7I^xE$@6lM)C}Qw zyD~d6^FA-q;J$tO=DdRGI~7e#j9tQhTKPxa(NjyG9@hHMaLc-#B?|dr9`DYr{<|tY z>g1lx=`M*~;bF^uM$P*3?98IGdsk^o9OL_Z`bjy{i4(35mzB@l<X3u9=%wH;y&$t( z`8P+n%DYRnPaAFVwJ1CKc$@k8wW~M|{r9NfxAC~Wh1kto-Fma77i}mn|I)wq?gph9 zn|Z@kRV;p;uKoFQn&OMKGp06*9Nzh7qOs3~X35KDdj;Db-uQ1JK0iHUp2Ehd2DYmo ztIXq6Y`AQ->*8^Nj-$_?`t9!vYguBlK>5xDw$c)lB{TZ`T1-?V{N#d~1Rh!F*2Z7C z*p$$*WJ%wYo{O1gMcGCEF?Uy1S<e+WzWQlW!TRD={HiAJCGO06zD~3B{tcbYM-3`V z&i%jG`%*yf(WW+U9@*bfZpT+w^g2dQw>8*(ra)<0xBP|3wI>o>4!`F4sGNMsu*-1O z!qab?f~SR)f2#1k$#F~iMAnQOQqyCrt?nIBIoqUbw#W1I!+BbFQaFMuqMh^3H<-?f zE!uhLg6QdE-}#%?T;0+qdFGOBcId9RMLPfA3;Mp_e&qY?jFJ`G)}`NaWqP*5#E)fp z?zzWqox2XLPi)!dWq$3?E+4MQuv58VOf#=<Y?#e+ocH)Qi>;?b3*DLQ75*&x5`X2R z-aX|9u8s%T`9IyxpEUEA!}0bX9ZaGjVpo=|wn<BUHoZhbBj9Ul-^xq8Ek~9vRto(6 z<x^5@1dndkHc6*qzpJWF%Ty%q>3!SKbAG||oai0GV(UX#N<XYTe0$Qv8$By3g8hy< z%lrB@+*5EgIq9h6tGt%;xWH6puU~~rUoUAdfBAMv`I}3Nzr4M(wA@vx=!YlYgloOQ zTP{1_l3mLDT=;p`3tyXq#hnGb=hdw)#vPW7T4XwB>C)A0;zIUHb+0*36lw$>|Das@ z(fi9A^@;{(hH%ah&e#nXx{b~y@E-mlp?`R(Jcr5Tg)e@0S<MbAQSI>;NmP(LVRIzm zkzrfayhluH_x4X*m;5LDP%xLY|Hm-dpRLtBUtPHP|NZ+r@sYBk%SE5_T2FIi(=%m{ zwQ*H0DtudZLNVs3wa6E#%rEBKJH@W~zmi$^+oNuA_mj}>XoXih3gvgozP)yS#;V7E z=kWWjZf2KH&~URfD*BT1|Cx2hmK^!cpDX0OicQ3S*GYd-NcAb=e;j=3NIJ{s;+O;C z633^re9}wY)js=&m!PLfz)zPYDk2l@E=^x~!S~6{C*G4{q?u+*@c-$2p~l3>6%q0$ zJmHeo@1~2@Ia761Q_ufl1{Ghg^qxe!voJ9HW5-u~>621?LCUDLVXuRwuZ#ZI74kTd zeZXkhHU)|62L+W(6RgV&Zg92+bbEA2D24AZj9VhQM)&QbsVsiKJmNE#z28+R?>Bqf z%j91R=XK5&nZ0uPS)b1fjsFIJS~=f(=C=LC;T()FeT;$+W}UbFey6zZdF9vs`u{)I zGn{)+&S;YH;<VM##;#n^vxgozWS-sP&&S6%PcCBfr?87BXC7_zUNXsv^}+QEWoIKy z*|^&FnoNk=la_W`>f00E)d|m@tyr|gu{+x$A!YN_q@@W{&fZz`a$Qtp@g<X;<_i<= zH>FNL<<_Vk^eyFJVT{&R?W3-jeV-mrd-V9uqFHJFXU=_!sDGrKEOYU~j)bW}X1!-G zN36_>Rg_uY(zf?;-=!Eo>DI27zxnN@oI)L$E*Sj0_|`V6R6p~^u}P68Z;S5e&Ca`b zVphu|{h4X!*!Rr8df|yw**VQD4)qWY?bOu<1%V$mZpN78txA}p(Kn~fdD&~LyiHrS z2y74UZJO%6cE-BEZ8E!;IjSaZdlU6d$h2f7^P@-4IG5%}xtew4E$Z}Nu5K!GM<_(E zM>OX0iM=ys@jc>bowRb}l(q*M+Y)Yu{oKPAzeV47pG-zuTe8(R2Y#hfCgHqauWX2Y zr@L3d$xv3XBrC%=V%tl{8OCDV%M!{rxhdxEn6_s1nPnGO>DHUvo6dKz-BEV_p}@dW zCwJvpEmljF8x{mCFEy#&qh8u#^J-1s-VDL45ck!`t=BJ>^<}i#8@avIF~8;4p832F zHGMjErXTqi5+CJP=jP6Crx+4*-0|YaHEo^$-6LBJT9?e2eXYRem!Z~eX0yf0J%3%I z;<nvT%iTRY^ZX>w?Ad#Z=Lr6dcq?4>EbUs%#FS}FJC-E=4_kY+%<05~B8Jbmk2QvO zTG_RW&$zhfu^2C3`@<LSlJ?HIVd>)btIWG~!m%cnS6bR{ows-_%!m-_eEjCs%}o>c z&NB%M@nm(l9=*M<N4!VqZse_J=k9EJy(W~qVBMozm!jTY<ab^4a91BwpOMYFNTbun zZP_Bt4;r1d@@((@l>4_@$3wnl1Cx1!^c<&Xsii#Ae8Sy1dHfPW-2$}MFLb`N#k=Pv zhsN2TH3HdE^Hv*AJD<O~Y+HKOaURikkBj+MH*XHt-J`i<ZKQLB;C%iEOLJ$=DbVWa zO8C>%QnyHM=63bcM`1aVKRMe2-zM$4&SS3L_FP6O!o%X+*Hfo@vONX8qWwKY_Ah$8 z`p2v`vDGdMyO&Lj{U&rk(O7@($F9Eo2dRq|#$TTwe{+}3tb2c#U*EvfxjFLH?BLnI z7yY%i+SmPlBlDU|OSZnav8Pq%{Et03{~eC&-pt$TW&Fl<+TAz3T@O#~J<_$WSDyWY zveWHPrkPWwm;Pa~pXyn6Shsr}XW<jGxa%K{|IC@*`#R*!ob86LuI4{asCrnLybg&; z+I(dHw5V=b@xM}EcI3`px5|5`sq+8ogbVXCH;4GmnsiU7?}G47<){k^%@aeKdtATf zty|~(N_LXt+G{dBHSMW7pGsywdi!|RWS5V(U;kj=@$5zLpXSm(&R34l^s{Qx+h_i> zzo2$U-d*RN3U-}~pV)Yv<J|XD_|iSc{2v?3FMM}by}rIi!2jDp|F>taeB5zsV!Lgu z?f(gJT={0-7?=(3TeT(WzP6CejyNv7$woQ;@FtngR{k}QW8NsvJGCYG4db!vhLYK* z*FI*d43^aLSfl*(WcjBbViPuNImEJTn(h$w<NB!!TMQWzt#-_RC*v?B(emtpo=L@w zcRen>?Jfy-D6bIsIEQOTfOzPOS)OML-&cP66SI7(cYVSkmpYqIY)bqS&+X~8`yc<{ z^p8XRXYw9w<}Y}9cl*WP<uaVvGmqRCx%o*TO6?N^+u|Gl@4dfx<^Q}BcNQ;7mQd69 zV7dOD-P0iR-iF8*OHL}kSb8P7Me6DMeQ|LWf4R1;D>7bpfGN^0_d|JI!#Rc`Va6x_ zUEfMgOMF}OP&I4%X623ci9gQy=~tQU?YMh<>x}sy`Na3?cG+)abpQ7L>VmeF5)uke z9Nnrq9Q>~wlwRp(y86l1JR@zFC!xo6m8J*G<6h6UP4dJK&$)pi$}1;J@35Smsbm^r zIzQmX60u+JufBR9Va%3hdBULeql$LYj6Iumj$J-ta_D_v-Tc+3f9}-UC7iQOf0bFr zgziOL`9T8S5wE$zv&vR~vblde;>rB9$32_hslBSnU!8URgX*4`t3RbupPpG6(I)q6 zy%+bL<I~?iP}u8Tdhhu4$D4|cW-Z<NBHD?+^GbkqTy3^{Wz2%J7SaV>zJGMKs=vtX zikuNBQ58}>Z&m15&6?oQ(w5ixhHkvGEiK(974PLTSh=c=aT1To-p(+6;rsiV-R{T! zzbn-;fh%Fw<>x_jPs`rEeAmyA@9U~pKB1-M2AgCe`C{%K_#W?mBl^jeq}`nP2VxS# z^##68wKBf@BXRAE%w^qac~{SzF+NbVLHW}wwz%5|<}T-#-=?(w&a$fivG@J>i*%$m zuT!!5&=z#pXY>98`YVHb3<~5I#D4kbrTX9ZPgLdwi5lMhiqE%S<(vIWA5>wlQTV(j zgq?w55ifFujo#nl0`<4ReT9O=l8n-RM{j0Bf!6b)fA|yM`R+33-#tx9RAfy+`1(n{ zZMnDJq<E?w{a0PS`e@jT+<g!C&isDrXZZ7@a>+%FS{hGySSE2^3yeNk{nuh|^UuF; zeKYs?t-QWRGU1cEhYWwx^AlkSOpOxLMO$uoncVxz`SjYRFIJOp@|ZvUT=nzkhh3}0 z{Z~JY`g`3nsb|UFEjONorG0;WMB{$M<f|9!_FQR~yL#>2vZDgwV#X56zFuc#Vkb*p zo_JoYsia-B<X~FA!na$`87<RTzCI3}{wyd~Y|lMQ*Wy<;eXn*IrMxqqf24Qu;va7= zJKP5ajrk>8>&FZX41M6P7$cJi1ERN!+)V}bc9A;23=BB?z5(6{Q$RtC+}Q(lX%VI* zf&v`c!9~^u>IfpYu|OR`BwdWu>=vTii=0$IEjWa|3T!0U3u(_G8x9Hz<iG}{HiY39 ec^McWdO&F}z?+o~B*)6Y%FxNk!0?6-!~+1b-hXHS literal 0 HcmV?d00001 diff --git a/Automail/automail.properties b/Automail/automail.properties new file mode 100644 index 0000000..a2e6ec2 --- /dev/null +++ b/Automail/automail.properties @@ -0,0 +1,15 @@ +# Seed +#Seed=2020 +Seed=30006 +# Floors +Floors=12 +# Mail_To_Create +Mail_to_Create=200 +# Mail_Max_Weight +Mail_Max_Weight=2000 +# The duration of receiving new mails +Mail_Receving_Length=120 +# Robots +Robots=3 +ChargeThreshold=0 +CommercialDisplay=false diff --git a/Automail/bin/automail/Automail.class b/Automail/bin/automail/Automail.class new file mode 100644 index 0000000000000000000000000000000000000000..62843ad187fb228ee40a5d26040d3cea93fada0d GIT binary patch literal 757 zcmX^0Z`VEs1_pBm4R!`5Mh3ye(vtk##LOIhM<|1xfrXJlAS<yfQ9ma!FJ0e1DJwO( zgpq-*C_gE`q?nOGFxm&MDF`HH&B(w3G9n;9KZlV)7$NJMn3)3-v}R;rv&qcMEU{x` zFx0>z?^B$aTbh$tl9`{U?+Mc7lA4oQmReM4?Wq~Y$iU*9pOVVOz|6qQ!@$YF$H>5} zp&7=>z{nuL!@$nK!OkGW$iRo{CXlQM4+AR$8yABhgBVDkIM{NWHeqoV*m8cK%)C^; z(%hufqL9R-oK!{zA)ox@#GJ6iqD&AUD#%ijky(u5dsu*if+q#)A4Uc#+<s+b;LIz{ z1qW#{BLkx+BLib5BLi=6Nn&!gZ(;%1B6bF4<VXXB6)1$+8B`e=ByjnSk%22XzqBYh z)h!d`eqNZ%^gyx9pvb_;z|6qFz{J1^3NHo*21Zb*f@wwuP6jRpMh0#M28Im`><p|7 z3=GCv+ZlMYw6`+wYsv0q5ZuZj%xuQ8oIyfs3xlvI%Wek2NF8lamhB9p!7VI|qAaot z|G(JCz`(%FAi==EAO<#qi-CoKmw}T(fI*N!kim#Sh(VHpfx!eUXUrhQAk6>*#$abK zf~;haVUT5D0<+{8<QbS5L>S~46d2?gSQr!;7#KtunEo?}GqAEVFtRf!u`{SJGBPlT MFfcNxf&HZp0R0QDHvj+t literal 0 HcmV?d00001 diff --git a/Automail/bin/automail/MailItem.class b/Automail/bin/automail/MailItem.class new file mode 100644 index 0000000000000000000000000000000000000000..a7c448693495b3db5f22c336e5b7ff348c696be8 GIT binary patch literal 1890 zcmX^0Z`VEs1_pD6D0T)WMh3ye(vtk##LOIh-^9!u&yv(!b_Nzk27#=^vPAuy#JqHU z|D>$c<Pt^(!IaeElFYoslFa<P__Un-{31pMMo&ftrpy#Z1|c7WhTxK-%)E4KMh2e5 zqN2>Q#GLq&%-mE)2Db9l%=C;BMh4d8{L;J<Mh5nb#NrI!!~#YJeu(zc60kc8tQi?N zgEQ0f5=%;pQW+V{QDto)T(ILj^GZ_FQ;V#z2-#UPGH}===Vaz(me?^eFl%UrF*2|? z=clA{GB7fT@Gx*Qu(30UF)|2(oes7;q$oAjH?e?=L6kv)he47-kdcAS25bOGk2DVh z4+AgAwV8RTex<odsYM})Nja$?@8>5c=7c2{WrFxnK{gFfPfyJ-E(T@>36OS09tKth zHZBH624x-w6$VvC1`bdFfLsK2o+lTBI)f%Vg9b|QLqd~>L5o3~k%7G|F{d=uKaG(= zRKrsf$<q*3)*x$ic^KFkI6y3Y9tKVZHW15@hk=WMjgf(+BqOt!kwMr8Bi5}M8Mr_Z z42xNgl6;7nj0_?gSZv~8uwZ0x2BjGVP@=K2Qt))KQcyK3R;W>MghacQf~rZ1LXCn8 zBHdUis2YKU!oev4tbmKbiou4R!5S71$k7V&wJjrq7^+`kaSjSDdmaV{21iB)wzT}B z+{6+_21^ahP>Dtof~00^EIwjn;7Ly{0XfzUlDJvZQ%gKk7#aA|Q%j&;3IQi%&h*q0 zhz~$<tIW;d!QjQt;K|6qi%3bni3L0i-V8pB49w}NC5#Me$nL`82&fRqEI%Fwe}(`? z2Ihj&5=I6KEE@6q2Wk{3V1sxVg24$bGp{5Jlyn#wSV3vd0F(y6jztb`YeohZkSrqu zZ*WOsa<*?`0W>Ld1?QI*C8xS&f)YC~DAqxdt_L!KL6L!xfti7UfsH`~l)f1l7(_q` z5KMD2uz_hVFwF(ZatsU%T%c^kz{tSIz`(%7z|X+Jz`-EEAjrVTAjH7HV9db800R8X zn;C?6Gl)iRXAs}aAhi*!SO%;eq`-rLg~5|S7A(rZz{nuUAO|&|nt_Rdg@J)VUTZsp zyq5G<1_dpxZ462~7}T~h=xE7oWzf@--O6BqFi;BYIvEBQ23ZD91~~>126+Za1_cH= z21T$1S`gzHj2MhT4r7pKFkxV0U<6qK%3xsk%7Zc(12Y37gDHa<)FF`!tYB68Lgwsy z8JHuPwYD(m1V^%HZDG*c!C)C2$*Q%5K>^HS)7rvd0AlT6u-gFk6Ue6!OH{#*;DHzg zbp#`W6N4($8hr*vupHR5HE5c3ku<ZyH9N!Ih^$!$-DXp)nq9EktcPy1EmqC0ST!4< zYj(w|Sp}|nA_Frx(V1y&XK>rWVCl1oK}vfkgF6$$0R}5yo#PDBn;3*6SrRrg2=8F9 z^aaW4>}2p|W(e2W#t;ayjhO)y!b0Gv^=05-@M92V@Mkb&2msrx05KgJU>pp33?U4m p42%q-42le4451864B-q64BQNie;Ewf8LZeDtQZ&>BEVrE2>>LHaL@n% literal 0 HcmV?d00001 diff --git a/Automail/bin/automail/MailPool$Item.class b/Automail/bin/automail/MailPool$Item.class new file mode 100644 index 0000000000000000000000000000000000000000..3d1e38b51eec6c8c4e1491fb8dbf424bf38c1fc0 GIT binary patch literal 631 zcmX^0Z`VEs1_pBm4R!`5Mh3CO(vtk##LOIh-^9$Efc*R%70;5?Ty_Q)Mh1bb#Ii*F zoW#6zegCAa)Z`LI2JV#9;*!j~#FEVXJVpjaPeuj~kY<n;Mh0OY6vIG*){G2nB^jB; zDh3$RAiF@)Hko;uC3cJqni{Cu!Sbj=U=uaN7#Ucc^HWke85kM(c^EhuxVRXY83cJ4 zxEX{P8JIOR!?+kk7{u5aL>U<bF<ivMAkHAc$iS1HTH=ygT;i6KpI-#l<q0xRiid%f zfeplx;bCBB;9z9n_sPsl^()OyN-YXWOv*`RWDxSnPfpAUODxI+@u7k&AYU>vNT50x z<OgtgS~D_m1?QI*C8xS&g3REBg|;3jj2RhtJoEBWi=1;3i;Gi>*%?&PT@Esck%0vi z0E`SAeyPPJ9{I&33<?a449pA+V9d(E#sC8B3>*v$0s^3LVPIfjWME|AX5e99WZ-3B zU<hYm0;?6*(%#Czr?s6yKuc#EgYZ@cNiChN4AL7J7#NrsWEmJ3gcw*D7#PGDI2ptl z1Q{e4#26$Q<iH|K3=9n74Dt*LAiEgEL4gD|R1vIKi9wlxfq@HbtqOx00~3QfSX>1F DJjaH> literal 0 HcmV?d00001 diff --git a/Automail/bin/automail/MailPool$ItemComparator.class b/Automail/bin/automail/MailPool$ItemComparator.class new file mode 100644 index 0000000000000000000000000000000000000000..c805875b7dcc0b6cb1b79f61cc9a1ab251999238 GIT binary patch literal 1042 zcmX^0Z`VEs1_pBmeRc*WMh1n%(vtk##LOIh-^9$Efc*R%70;5?T<84Ug2bZ4lKdie z1{OvJfvm)`ME#t^ymWp4q^#8B5_SeQMg|eEXlY4ijy^&?BLiDWMrN^!0V9L34~F5^ zj0|ixnR%Hdc8m;S8d&5t!x$M@obyvsIT;ukczGDu892BYm>Kwa7&sXO7#Wx~KnnPM zGV@aXN^_G^i$W5Ua#9%?gnaUo6LZ26i!wocs2~f-A&d-4nAV{A(VCHgJsIrdR7M74 zEY1R}x5i<PwWcR0g9L*VJA))6gBXUF!FqWZq#0xw8MsqYi%T-|5=%1k^B5TzJsBC8 zG7T9SBygDwk~d;xV9hT|NiAYz;0-QGOwRUAEP#4YUBd?)1xOKNjVYq($;H6Ppu)o- z${@zbz!jWdT9lmXmI(?rURb2-fy`lK;0(@8&r2*RElOo%aKbbRB7zp-Hn<#bXU)jK z<C&M2TI8IQSX`W1%+8?A$RLOjK#UA5pd`o0zz3p`Qxb<?YH^82esKwdA_F4>GXo<7 zD+8l|04Px~Fo5}-3?RR8GcYiiFfcJNF)%Q2X=!g|;L+O7z_*csfq{uZkb!}Lje(JY zfkB2rh=GBD2h8ST5M~fzU|?Vb1quTr1IUCf1||j;1_lO2W;^XI4B|Rl7{nJbaIn}d zXApq#moTt0*~zW}TMjZ<ih+%RfkB>ui9vyZmqC$%pFxR1mO+_8o<S9CnHI!AsAUWc ziVU(0a$pB2GRQN?ft@VRpuix*z|5e?z`(%H!1RYfh>=IYkwKI}3F<Cg24)6k1_lOR zE$ssg5;_MMB(^aqgWQ1ZIYzL3pa5WDPz8HjjX@nuYcOasFfa%)Ffm9lXffz8FflMP OXffzAFf!<Y<+T7Cb><lW literal 0 HcmV?d00001 diff --git a/Automail/bin/automail/MailPool.class b/Automail/bin/automail/MailPool.class new file mode 100644 index 0000000000000000000000000000000000000000..da791cb42c34ef784d112335c4fd4a04fff77586 GIT binary patch literal 2678 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 JoWVfirT~1kVaosj literal 0 HcmV?d00001 diff --git a/Automail/bin/automail/Robot$RobotState.class b/Automail/bin/automail/Robot$RobotState.class new file mode 100644 index 0000000000000000000000000000000000000000..7a06471d0faeef4b50a6c1f2aab1f1b56ddc5cb7 GIT binary patch literal 1125 zcmX^0Z`VEs1_pBmb9M$MMh3~m(vtk##LOK1p!}r#5*08RT#{Il%Fe*T$iSDCSeB@t zlbDyT@0wSd%gDgx;_BlW<{ISb=g!C=?SoUdH6sIixT9wXSRH4OYe;C2ADGSU>KE#( z66WX=>Ke?*AQO$(2o9U%oXot;5<5l)W)00SMg|t={FGD<239TxMg{>M20;cPMg}$; zs1h*^AB1y*ONuh{(ycu;!#Eij8ANy(SQ*$j7}!A^aUKSC5QhWAk>X+CU|<8WWOx`j z8Mqi3_<b_-QvFJElTwR95|eUL85x9p@{<#D!V-%zL42?v7Xvec03!oSNk(QdBLiDm zVoqslF(ZSVh9*8AaWSYcsIfDsGBOAtxwNvlBsG_ZL7hQ^k%2R@s3@^AIlrKikwFXD zKmJKssmUeQo=9GV33-A-h8^q#|1?GhePnIWV9>-9%pkAm@GxjH=rS^xBI|X|Nh~h5 zMzRoY7{c+ORAJ4?z!jWdT9lmXmI(?jE^s2!11Vx;;0(@8&r2*RElOo%&_yx}q|pYC ztL&^98F)PN@=}Yy&PXk0XE0%8;6qJtj0_OFzzLR-fx|DgxWpsBxWvJbfsuikfq{X= zK@t@43=9sEpg0H991Ls>3<6T1$Ofrk;9%fp;9+27;ALQ7NMvAP00GC{42+RNe9YS! z_%|~MgE^usV2&7=Bf$#hNV4r^V2otm#2_3T$+C$-EI5*N6N6;%W(Mhv3=9lR46+Oi z3~UUH3=9my402!*kf<Po5Y#$D24=7`*|oG~wlm0M*93AK0|PsQ0?6GAoD7N#N>J@) z46I=7Vw)JGBfXim_C?x&+~dnEy@NqnX9L(mgcBIyPT*wFWYB_|p~b)ib|9A!qt*@v p?E?&qxb?9x=z-1DXD|TMh73jw3=E*W$jD&KVCo>rU<MX91^}D&@uL6$ literal 0 HcmV?d00001 diff --git a/Automail/bin/automail/Robot.class b/Automail/bin/automail/Robot.class new file mode 100644 index 0000000000000000000000000000000000000000..54873ff5cbd973888165384dff98f9f32f788e79 GIT binary patch literal 4581 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 literal 0 HcmV?d00001 diff --git a/Automail/bin/exceptions/ExcessiveDeliveryException.class b/Automail/bin/exceptions/ExcessiveDeliveryException.class new file mode 100644 index 0000000000000000000000000000000000000000..0d6e88683faf2307f1bb3fe254dd791494a2bdd9 GIT binary patch literal 422 zcmX^0Z`VEs1_pBmVRi;4Mh4Z?isaOSlFa<PVtv<&<kaHg%(7IM)SS$+)S^m|09cNl zfrXJlI4iL%Q9ma!FI_(*qbR>TF)1gNk%7%7GcU8mj*)>`Lo<w#fyFsLC6$ALlaay7 zv7{t5x1c05FI}M|Um*ozrb2FhQK~{oMq-|Vi9%*cYHqPYW}ZT#LUCqZdQPfBNl|8j zq9PXqGXpmd11kd$BZH`h55nHylA_GKbZd}B{63j^seYxoNvTC45SIw~<R>TQge4Yb zg7{EDmXeIjVnzmaAENwe&B(wNoL^d$oa&Yd@|-*<1h5B*9>`S;iVTbl%nTsF$iT?J z%D~3J$iU9Pz+lS2#K6eFz`(90#Ic=$Ya;^#0}}%;0|NsW0}}%S0|x^e11AF?0|NsO TL>U7=g8%~q10#bVSfvmEN6Bp1 literal 0 HcmV?d00001 diff --git a/Automail/bin/exceptions/ItemTooHeavyException.class b/Automail/bin/exceptions/ItemTooHeavyException.class new file mode 100644 index 0000000000000000000000000000000000000000..7d360f113a93bcd944eb5bc9d8d26901f2713688 GIT binary patch literal 382 zcmX^0Z`VEs1_pBmVRi;4Mh1n{isaOSlFa<PVtvn&)ZCE#e2>(`vPxH&FgpVaBZF{O zVp*boPGVlVK3sy4fz2i}FSEpsk%3u5GmMde#W_DEm4ktkkwFn;l0r#-zCs4bEJX#E zqWpq_)D(rJN`<2Qr2G;+E(T@>ZXO0!1|CKRQ4Jr2@xdiUnR)5fAoKWrGV@aXN^_G^ zi$W5Ua#9%?gnaUo6LZ26i!wocs31#8MrJW1gOU#+pI9?8a0Ta=7A2>;Wr9qT0=W{y zzj`3IFeoxGGB7iM03!n<11kd?10w@F0|SF80}}%y0|NuQmJr8w2Cj_^3=B*RybKHs kTntPM3=A9$Yz&+Xd<+Z>JP>6J{0ssN3=E76f?$<G0O~MZIsgCw literal 0 HcmV?d00001 diff --git a/Automail/bin/exceptions/MailAlreadyDeliveredException.class b/Automail/bin/exceptions/MailAlreadyDeliveredException.class new file mode 100644 index 0000000000000000000000000000000000000000..85bf1e255d75951054ad85d843a11d84a881c709 GIT binary patch literal 410 zcmX^0Z`VEs1_pBmVRi;4Mh1=4isaOSlFa<PVtwDl%pAv@qSVBcN|)4}%(B#?)D%~k zG&=(eBZF{OVp*boPGVlVen>`9etBY2PAVe<n@wh3W{Djm1G9!^7$XCVbAC!H2LmS~ zgK9`dX0bwUVrGs)Mq;r-BE)Qkq}0?rg%p?#id+oL4BR{ntPDJi45Au72rGh1iZb)k ztwCn;`();&`jzG;r51%iEEV#}PfpAUODxI+@u7k&B^jB;j0{>n#QMsbk%22XzqBYh z)h!d`6(zi3pa*grgCYYX12Y2%FfuSQurjbQFfy<+Fff=hFflMPFfg!d32|&^;M&N* sz`(@7%fP_E#lXbCz`()4#=yzI$H2hA15w7n&mh3Sz`)2L2v#Ws080gEOaK4? literal 0 HcmV?d00001 diff --git a/Automail/bin/simulation/Building.class b/Automail/bin/simulation/Building.class new file mode 100644 index 0000000000000000000000000000000000000000..6678acdcf8ae93daeab7e80009725a553edc9b4c GIT binary patch literal 380 zcmX^0Z`VEs1_pBmF?I$fMh4;H%-qtP#FEVXJbkCq%$$_WymWR37Dfhvti-ZJ{hY+S zbbbG%tkmQZMg}%FAAkR#U`7T;PeukFAOCRI;E;H*7$XC(bADcNNn&0}SYl3TDl-EE z10y4Yps%B+PmsUAZ@iDcvtx*-zaJw5n@wh3W{Djm1G9!^7$XCVbAC!H7Xvc`KMw;p z0}mquzfWdfs$XetQfg61Vp2{jBZH7nesW??SYlBohz}KHDaptzW@Hfc!Qy^vMh33n z{L-T2RJTl!0lYAe>4E&jpvb_;0CFHR11AG30~-SagCqkx0~-S)0|x^G0}}%$gCqkN z3ZIdI5#%@qMh0F61_pfw5TAj8Rcku~-$t+&0R{%J1_lOZ20;b}1|9}R1_lOJ1|bGv MP)IO{fK`bC0NK(>umAu6 literal 0 HcmV?d00001 diff --git a/Automail/bin/simulation/Clock.class b/Automail/bin/simulation/Clock.class new file mode 100644 index 0000000000000000000000000000000000000000..6c169fe5d8969d75545edc3b0f1e2cb80c815fe2 GIT binary patch literal 510 zcmX^0Z`VEs1_pBm33di1Mh1c6%-qtP#FEVXJbmY!{N!wQ1{OvJfvm)`ME#t^ymWp4 zq^#8B5=I7=kj&gvMg~StMg|dIM^B&lAXjJCFi$`Ccpq0k_Ye<81`eC#oXot;5<5l) zW)00SMg|t={FGEq21W)R9tKthHbw@1pUk{eztY^K)S{5Yq?}Yn1|gsP<iwn?#G*_P zA1cUZ12%?>ftf*&hk>7glaYa?BqOsJq#WJ3)?mv#!R|}WW@O+B&Mz%WPIb!!na&0F zksio142lel49pA+3``7MAjdE;FmN)kGq5o*Ft9LiFmNz{+{wkjz@W*%$N&PY%$pgw zH-a_rGB7Z3F)%SOFt9POFmN*Pfkhb@7(s4hU}OMk(`R4=Yh=~h&LDu$#s(H-25aE~ zvsoF07=*#LvoeT4HLHMS7#LVKF>tQ|8xFD(qL&A(7i2jngDBjUx?txpFmP^S;ATm{ T;!*(y4hBKERz?Ofu(9F*t{+LA literal 0 HcmV?d00001 diff --git a/Automail/bin/simulation/IMailDelivery.class b/Automail/bin/simulation/IMailDelivery.class new file mode 100644 index 0000000000000000000000000000000000000000..bb88966905293af8ebdb81a32c69b4fa75f977ce GIT binary patch literal 161 zcmX^0Z`VEs1_pBmPId++Mh1!E%-qtP#FEVXJbh2!#LOI*)SS$+)S^mu1{OvJfvm)` zME#t^ymWp4q^#8B5=I906o>*w1~Cnv#L|-d+{DZreUMJilGI#l%`ip=uHgLAqU2P! r%$!t41|bwv^*{!)F)}bRFf)JvBMTz~D+3z?0|O%iI|Bm)69WeTB*`f* literal 0 HcmV?d00001 diff --git a/Automail/bin/simulation/MailGenerator.class b/Automail/bin/simulation/MailGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..5badad3f6cf87e7380200279401e7f23cb2ae704 GIT binary patch literal 3797 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 S4hBXLmw|zi;TSl(90vfj^?oP- literal 0 HcmV?d00001 diff --git a/Automail/bin/simulation/Simulation$ReportDelivery.class b/Automail/bin/simulation/Simulation$ReportDelivery.class new file mode 100644 index 0000000000000000000000000000000000000000..01d9be852ee89259d1d5038192494a2d315fb797 GIT binary patch literal 1495 zcmX^0Z`VEs1_pD67<L9GMh2DQ%-qtP#FEVXJpEueQza<1Ait=@B{e6rEVZbToq>gs zK_Dx!EKxrvF)v-;KPf9UxrCj8jgdhDNx!FWVrC9Z4<iGcO=ezZi5(*Yvxa6EBLj<b zeo87A12Y3R4+A>`2O|T&Pi9`KUukYqYEejHQcfx(gOE>ta$-(cVo@fD4;5r7$;d2b zWKi=#vI(b4tr;2EQy{KpWDwKvNh~eN&rQtC(FZxrvm`awS~HB3L6||5ok4_=K@_Wz zJPcwC;*1P@zK)(g@h+}Do?)&*t}cuWqCVgdC@sm%(RVB=O04wBEH1I;VvuBzW@nIM zWDv$8&BGwWAj`<Wk({4bl9-uS%*Y_B0Wk(CAgwi{K&Hs^Ferc&Gbg5`a55+{sIW6A zqXc_!WpPPrE)Rn$gBl|PbAD+F+)bJJ`T<3mc_qOmMX8Co)*K8Pj0|!iRtl=dDGGK9 z&?rew(NHx>(Nu_5Esj;q<6_Wa&|zoLW@HdR3I*q!{N!vN23-a{Mh2FU%-mFP?0IrA z7%&*IGZ->52!cHccD!d^Nosm(5f6hgg9#%8ds$*mX{vu3DA+wUk^Bf%1`a4Q9tLx; z(Z!insay<}4A$%nR*VdS7}3PTV8dX`$iPvOA6!zDnU~JUAfkb6C`8nni@~13k)6Q- z7Wk;)z{B9g;LOOtRsaf`G)4v+<e-O|5RK$gNV2wu+JkDAH7M1%@-VnDxHB?vm*kfu z=ESF@<|I}!GBCPuF$gnw@-TQYcr!AHB`4-2gK|_VG}tR$Aj+_(Mi+JlUq%Lv)QaTP z0#GI_2B%cVoTAjk6p&6({!2}9g-LTU_%LvThyWgjKyW4kdoH*nF*!S=C^0#ek%0%A z{wqProsmHpOCDfkU`%CX(DEVHR%=EEUa%Fui3QMH$rYSmT9lmXmI=zY{D}Oh2TC7| z3_PBBd8tLtIf=!^sl|*8e5mCKBLjzDYH^82esKwd0s|uhGXo<7D+2=q69WUNXkcJu z;ACK6&}U#|U}RumVAa~rz_k%9&BMUJzy=na%)raQz`z4$voi28@G~$lFfs@*2tqZV zWng1qW?*0l-^3uKy^TR)7K0OnB^SPlK~YGZZ7&0JB=Zgi%^eK-!I3PR7=*Sln1b1? z+S?c`g10f)g>PbT(cZz}k-V9~WjTYuZU&#o?F@eVeRZ}m_-|xjWbkANWC&#NVPIwe zIZF-f=IIPv3^N#n7-lk9Gt6diW0=F>$uOTGkYNEs5W_--Foq>yXDdLQ26Z+ALpVba zLofp)Ll6TCLkL4C0~13S0|NsW1M_bNPj_|(9~K5?hH!8IL@-2xWk4Y#%n-%E!4M4= G7X|=nn|nF{ literal 0 HcmV?d00001 diff --git a/Automail/bin/simulation/Simulation.class b/Automail/bin/simulation/Simulation.class new file mode 100644 index 0000000000000000000000000000000000000000..a783d4b0ac2713bda772c7af90b274741cafaf18 GIT binary patch literal 6480 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 SgMpE;mVtw@4(xVDh8X~x3bz;l literal 0 HcmV?d00001 diff --git a/Automail/expected.txt b/Automail/expected.txt new file mode 100644 index 0000000..8075c2a --- /dev/null +++ b/Automail/expected.txt @@ -0,0 +1,742 @@ +#Floors: 12 +#Created mails: 200 +#Maximum weight: 2000 +#Mail receiving length: 120 +#Robots: 3 +#Charge Threshold: 0.0 +#Charge Display: false +#A Random Seed: 30006 +Setting up Wifi Modem +Modem Turnon on Floor[1] +T: 0 > R0(0) changed from RETURNING to WAITING +T: 0 > R1(0) changed from RETURNING to WAITING +T: 0 > R2(0) changed from RETURNING to WAITING +T: 1 > new addToPool [Mail Item:: ID: 129 | Arrival: 1 | Destination: 3 | Weight: 1812] +T: 1 > R0(0) changed from WAITING to DELIVERING +T: 1 > R0(0)-> [Mail Item:: ID: 129 | Arrival: 1 | Destination: 3 | Weight: 1812] +T: 2 > new addToPool [Mail Item:: ID: 69 | Arrival: 2 | Destination: 6 | Weight: 439] +T: 2 > R1(0) changed from WAITING to DELIVERING +T: 2 > R1(0)-> [Mail Item:: ID: 69 | Arrival: 2 | Destination: 6 | Weight: 439] +T: 4 > new addToPool [Mail Item:: ID: 23 | Arrival: 4 | Destination: 11 | Weight: 2000] +T: 4 > new addToPool [Mail Item:: ID: 96 | Arrival: 4 | Destination: 8 | Weight: 490] +T: 4 > Delivered( 1) [Mail Item:: ID: 129 | Arrival: 1 | Destination: 3 | Weight: 1812] +T: 4 > R0(0) changed from DELIVERING to RETURNING +T: 4 > R2(1) changed from WAITING to DELIVERING +T: 4 > R2(1)-> [Mail Item:: ID: 23 | Arrival: 4 | Destination: 11 | Weight: 2000] +T: 5 > new addToPool [Mail Item:: ID: 46 | Arrival: 5 | Destination: 3 | Weight: 903] +T: 5 > new addToPool [Mail Item:: ID: 85 | Arrival: 5 | Destination: 9 | Weight: 389] +T: 5 > new addToPool [Mail Item:: ID: 108 | Arrival: 5 | Destination: 3 | Weight: 478] +T: 7 > R0(0) changed from RETURNING to WAITING +T: 8 > R0(1) changed from WAITING to DELIVERING +T: 8 > R0(1)-> [Mail Item:: ID: 85 | Arrival: 5 | Destination: 9 | Weight: 389] +T: 8 > Delivered( 2) [Mail Item:: ID: 69 | Arrival: 2 | Destination: 6 | Weight: 439] +T: 8 > R1(0) changed from DELIVERING to RETURNING +T: 9 > new addToPool [Mail Item:: ID: 41 | Arrival: 9 | Destination: 11 | Weight: 1544] +T: 10 > new addToPool [Mail Item:: ID: 102 | Arrival: 10 | Destination: 1 | Weight: 676] +T: 12 > new addToPool [Mail Item:: ID: 36 | Arrival: 12 | Destination: 3 | Weight: 710] +T: 12 > new addToPool [Mail Item:: ID: 137 | Arrival: 12 | Destination: 7 | Weight: 2000] +T: 13 > new addToPool [Mail Item:: ID: 10 | Arrival: 13 | Destination: 11 | Weight: 684] +T: 13 > new addToPool [Mail Item:: ID: 97 | Arrival: 13 | Destination: 9 | Weight: 825] +T: 13 > new addToPool [Mail Item:: ID: 134 | Arrival: 13 | Destination: 9 | Weight: 1729] +T: 14 > new addToPool [Mail Item:: ID: 121 | Arrival: 14 | Destination: 4 | Weight: 1538] +T: 14 > R1(0) changed from RETURNING to WAITING +T: 15 > new addToPool [Mail Item:: ID: 1 | Arrival: 15 | Destination: 4 | Weight: 1198] +T: 15 > new addToPool [Mail Item:: ID: 15 | Arrival: 15 | Destination: 6 | Weight: 847] +T: 15 > new addToPool [Mail Item:: ID: 51 | Arrival: 15 | Destination: 4 | Weight: 933] +T: 15 > new addToPool [Mail Item:: ID: 148 | Arrival: 15 | Destination: 12 | Weight: 586] +T: 15 > new addToPool [Mail Item:: ID: 150 | Arrival: 15 | Destination: 10 | Weight: 846] +T: 15 > R1(1) changed from WAITING to DELIVERING +T: 15 > R1(1)-> [Mail Item:: ID: 148 | Arrival: 15 | Destination: 12 | Weight: 586] +T: 15 > Delivered( 3) [Mail Item:: ID: 23 | Arrival: 4 | Destination: 11 | Weight: 2000] +T: 15 > R2(0)-> [Mail Item:: ID: 96 | Arrival: 4 | Destination: 8 | Weight: 490] +T: 16 > new addToPool [Mail Item:: ID: 12 | Arrival: 16 | Destination: 6 | Weight: 1193] +T: 16 > new addToPool [Mail Item:: ID: 64 | Arrival: 16 | Destination: 7 | Weight: 1146] +T: 16 > new addToPool [Mail Item:: ID: 90 | Arrival: 16 | Destination: 6 | Weight: 1392] +T: 16 > new addToPool [Mail Item:: ID: 124 | Arrival: 16 | Destination: 7 | Weight: 1580] +T: 16 > new addToPool [Mail Item:: ID: 130 | Arrival: 16 | Destination: 5 | Weight: 1580] +T: 17 > new addToPool [Mail Item:: ID: 56 | Arrival: 17 | Destination: 9 | Weight: 1298] +T: 17 > new addToPool [Mail Item:: ID: 63 | Arrival: 17 | Destination: 5 | Weight: 2000] +T: 17 > new addToPool [Mail Item:: ID: 114 | Arrival: 17 | Destination: 12 | Weight: 1738] +T: 17 > Delivered( 4) [Mail Item:: ID: 85 | Arrival: 5 | Destination: 9 | Weight: 389] +T: 17 > R0(0)-> [Mail Item:: ID: 46 | Arrival: 5 | Destination: 3 | Weight: 903] +T: 18 > new addToPool [Mail Item:: ID: 79 | Arrival: 18 | Destination: 4 | Weight: 2000] +T: 18 > new addToPool [Mail Item:: ID: 131 | Arrival: 18 | Destination: 2 | Weight: 1514] +T: 19 > new addToPool [Mail Item:: ID: 22 | Arrival: 19 | Destination: 3 | Weight: 1129] +T: 19 > Delivered( 5) [Mail Item:: ID: 96 | Arrival: 4 | Destination: 8 | Weight: 490] +T: 19 > R2(0) changed from DELIVERING to RETURNING +T: 21 > new addToPool [Mail Item:: ID: 42 | Arrival: 21 | Destination: 5 | Weight: 215] +T: 21 > new addToPool [Mail Item:: ID: 122 | Arrival: 21 | Destination: 10 | Weight: 1706] +T: 22 > new addToPool [Mail Item:: ID: 34 | Arrival: 22 | Destination: 7 | Weight: 245] +T: 22 > new addToPool [Mail Item:: ID: 107 | Arrival: 22 | Destination: 4 | Weight: 1290] +T: 23 > new addToPool [Mail Item:: ID: 82 | Arrival: 23 | Destination: 6 | Weight: 1348] +T: 24 > new addToPool [Mail Item:: ID: 62 | Arrival: 24 | Destination: 3 | Weight: 401] +T: 24 > Delivered( 6) [Mail Item:: ID: 46 | Arrival: 5 | Destination: 3 | Weight: 903] +T: 24 > R0(0) changed from DELIVERING to RETURNING +T: 25 > new addToPool [Mail Item:: ID: 33 | Arrival: 25 | Destination: 6 | Weight: 1819] +T: 25 > new addToPool [Mail Item:: ID: 117 | Arrival: 25 | Destination: 10 | Weight: 1152] +T: 25 > new addToPool [Mail Item:: ID: 153 | Arrival: 25 | Destination: 11 | Weight: 479] +T: 27 > R0(0) changed from RETURNING to WAITING +T: 27 > Delivered( 7) [Mail Item:: ID: 148 | Arrival: 15 | Destination: 12 | Weight: 586] +T: 27 > R1(0)-> [Mail Item:: ID: 41 | Arrival: 9 | Destination: 11 | Weight: 1544] +T: 27 > R2(0) changed from RETURNING to WAITING +T: 28 > new addToPool [Mail Item:: ID: 5 | Arrival: 28 | Destination: 10 | Weight: 1045] +T: 28 > new addToPool [Mail Item:: ID: 123 | Arrival: 28 | Destination: 12 | Weight: 1555] +T: 28 > new addToPool [Mail Item:: ID: 139 | Arrival: 28 | Destination: 2 | Weight: 603] +T: 28 > new addToPool [Mail Item:: ID: 152 | Arrival: 28 | Destination: 1 | Weight: 220] +T: 28 > R0(1) changed from WAITING to DELIVERING +T: 28 > R0(1)-> [Mail Item:: ID: 114 | Arrival: 17 | Destination: 12 | Weight: 1738] +T: 28 > R2(1) changed from WAITING to DELIVERING +T: 28 > R2(1)-> [Mail Item:: ID: 10 | Arrival: 13 | Destination: 11 | Weight: 684] +T: 29 > new addToPool [Mail Item:: ID: 13 | Arrival: 29 | Destination: 10 | Weight: 564] +T: 29 > new addToPool [Mail Item:: ID: 54 | Arrival: 29 | Destination: 2 | Weight: 575] +T: 29 > new addToPool [Mail Item:: ID: 73 | Arrival: 29 | Destination: 11 | Weight: 1282] +T: 29 > new addToPool [Mail Item:: ID: 81 | Arrival: 29 | Destination: 2 | Weight: 1748] +T: 29 > Delivered( 8) [Mail Item:: ID: 41 | Arrival: 9 | Destination: 11 | Weight: 1544] +T: 29 > R1(0) changed from DELIVERING to RETURNING +T: 30 > new addToPool [Mail Item:: ID: 149 | Arrival: 30 | Destination: 6 | Weight: 436] +T: 32 > new addToPool [Mail Item:: ID: 14 | Arrival: 32 | Destination: 3 | Weight: 1598] +T: 32 > new addToPool [Mail Item:: ID: 68 | Arrival: 32 | Destination: 9 | Weight: 1581] +T: 33 > new addToPool [Mail Item:: ID: 27 | Arrival: 33 | Destination: 11 | Weight: 923] +T: 34 > new addToPool [Mail Item:: ID: 110 | Arrival: 34 | Destination: 9 | Weight: 1265] +T: 34 > new addToPool [Mail Item:: ID: 113 | Arrival: 34 | Destination: 11 | Weight: 681] +T: 35 > new addToPool [Mail Item:: ID: 88 | Arrival: 35 | Destination: 12 | Weight: 778] +T: 35 > new addToPool [Mail Item:: ID: 140 | Arrival: 35 | Destination: 7 | Weight: 1468] +T: 36 > new addToPool [Mail Item:: ID: 136 | Arrival: 36 | Destination: 6 | Weight: 1494] +T: 36 > new addToPool [Mail Item:: ID: 146 | Arrival: 36 | Destination: 11 | Weight: 598] +T: 37 > new addToPool [Mail Item:: ID: 78 | Arrival: 37 | Destination: 8 | Weight: 973] +T: 37 > new addToPool [Mail Item:: ID: 143 | Arrival: 37 | Destination: 9 | Weight: 227] +T: 38 > new addToPool [Mail Item:: ID: 44 | Arrival: 38 | Destination: 9 | Weight: 653] +T: 38 > new addToPool [Mail Item:: ID: 100 | Arrival: 38 | Destination: 4 | Weight: 269] +T: 39 > new addToPool [Mail Item:: ID: 58 | Arrival: 39 | Destination: 11 | Weight: 415] +T: 39 > new addToPool [Mail Item:: ID: 74 | Arrival: 39 | Destination: 3 | Weight: 787] +T: 39 > Delivered( 9) [Mail Item:: ID: 10 | Arrival: 13 | Destination: 11 | Weight: 684] +T: 39 > R2(0)-> [Mail Item:: ID: 153 | Arrival: 25 | Destination: 11 | Weight: 479] +T: 40 > new addToPool [Mail Item:: ID: 76 | Arrival: 40 | Destination: 4 | Weight: 1385] +T: 40 > Delivered( 10) [Mail Item:: ID: 114 | Arrival: 17 | Destination: 12 | Weight: 1738] +T: 40 > R0(0)-> [Mail Item:: ID: 123 | Arrival: 28 | Destination: 12 | Weight: 1555] +T: 40 > R1(0) changed from RETURNING to WAITING +T: 40 > Delivered( 11) [Mail Item:: ID: 153 | Arrival: 25 | Destination: 11 | Weight: 479] +T: 40 > R2(0) changed from DELIVERING to RETURNING +T: 41 > new addToPool [Mail Item:: ID: 132 | Arrival: 41 | Destination: 11 | Weight: 1193] +T: 41 > Delivered( 12) [Mail Item:: ID: 123 | Arrival: 28 | Destination: 12 | Weight: 1555] +T: 41 > R0(0) changed from DELIVERING to RETURNING +T: 41 > R1(1) changed from WAITING to DELIVERING +T: 41 > R1(1)-> [Mail Item:: ID: 88 | Arrival: 35 | Destination: 12 | Weight: 778] +T: 42 > new addToPool [Mail Item:: ID: 103 | Arrival: 42 | Destination: 12 | Weight: 323] +T: 42 > new addToPool [Mail Item:: ID: 128 | Arrival: 42 | Destination: 12 | Weight: 943] +T: 43 > new addToPool [Mail Item:: ID: 20 | Arrival: 43 | Destination: 11 | Weight: 972] +T: 43 > new addToPool [Mail Item:: ID: 141 | Arrival: 43 | Destination: 5 | Weight: 362] +T: 45 > new addToPool [Mail Item:: ID: 119 | Arrival: 45 | Destination: 1 | Weight: 302] +T: 46 > new addToPool [Mail Item:: ID: 72 | Arrival: 46 | Destination: 1 | Weight: 1996] +T: 49 > new addToPool [Mail Item:: ID: 18 | Arrival: 49 | Destination: 6 | Weight: 706] +T: 49 > new addToPool [Mail Item:: ID: 99 | Arrival: 49 | Destination: 3 | Weight: 1921] +T: 49 > new addToPool [Mail Item:: ID: 109 | Arrival: 49 | Destination: 8 | Weight: 446] +T: 50 > new addToPool [Mail Item:: ID: 142 | Arrival: 50 | Destination: 2 | Weight: 322] +T: 51 > new addToPool [Mail Item:: ID: 80 | Arrival: 51 | Destination: 2 | Weight: 535] +T: 51 > R2(0) changed from RETURNING to WAITING +T: 52 > new addToPool [Mail Item:: ID: 16 | Arrival: 52 | Destination: 5 | Weight: 2000] +T: 52 > R2(1) changed from WAITING to DELIVERING +T: 52 > R2(1)-> [Mail Item:: ID: 103 | Arrival: 42 | Destination: 12 | Weight: 323] +T: 53 > R0(0) changed from RETURNING to WAITING +T: 53 > Delivered( 13) [Mail Item:: ID: 88 | Arrival: 35 | Destination: 12 | Weight: 778] +T: 53 > R1(0)-> [Mail Item:: ID: 73 | Arrival: 29 | Destination: 11 | Weight: 1282] +T: 54 > new addToPool [Mail Item:: ID: 71 | Arrival: 54 | Destination: 4 | Weight: 2000] +T: 54 > R0(1) changed from WAITING to DELIVERING +T: 54 > R0(1)-> [Mail Item:: ID: 27 | Arrival: 33 | Destination: 11 | Weight: 923] +T: 55 > new addToPool [Mail Item:: ID: 89 | Arrival: 55 | Destination: 9 | Weight: 1749] +T: 55 > new addToPool [Mail Item:: ID: 105 | Arrival: 55 | Destination: 12 | Weight: 799] +T: 55 > Delivered( 14) [Mail Item:: ID: 73 | Arrival: 29 | Destination: 11 | Weight: 1282] +T: 55 > R1(0) changed from DELIVERING to RETURNING +T: 57 > new addToPool [Mail Item:: ID: 7 | Arrival: 57 | Destination: 1 | Weight: 777] +T: 57 > new addToPool [Mail Item:: ID: 65 | Arrival: 57 | Destination: 7 | Weight: 361] +T: 57 > new addToPool [Mail Item:: ID: 84 | Arrival: 57 | Destination: 6 | Weight: 697] +T: 58 > new addToPool [Mail Item:: ID: 35 | Arrival: 58 | Destination: 7 | Weight: 804] +T: 61 > new addToPool [Mail Item:: ID: 40 | Arrival: 61 | Destination: 10 | Weight: 1604] +T: 61 > new addToPool [Mail Item:: ID: 50 | Arrival: 61 | Destination: 6 | Weight: 570] +T: 61 > new addToPool [Mail Item:: ID: 98 | Arrival: 61 | Destination: 7 | Weight: 1029] +T: 61 > new addToPool [Mail Item:: ID: 126 | Arrival: 61 | Destination: 6 | Weight: 1101] +T: 62 > new addToPool [Mail Item:: ID: 3 | Arrival: 62 | Destination: 3 | Weight: 678] +T: 62 > new addToPool [Mail Item:: ID: 94 | Arrival: 62 | Destination: 12 | Weight: 793] +T: 63 > new addToPool [Mail Item:: ID: 29 | Arrival: 63 | Destination: 11 | Weight: 842] +T: 63 > new addToPool [Mail Item:: ID: 159 | Arrival: 63 | Destination: 8 | Weight: 690] +T: 64 > new addToPool [Mail Item:: ID: 49 | Arrival: 64 | Destination: 5 | Weight: 2000] +T: 64 > new addToPool [Mail Item:: ID: 91 | Arrival: 64 | Destination: 10 | Weight: 578] +T: 64 > new addToPool [Mail Item:: ID: 157 | Arrival: 64 | Destination: 3 | Weight: 551] +T: 64 > Delivered( 15) [Mail Item:: ID: 103 | Arrival: 42 | Destination: 12 | Weight: 323] +T: 64 > R2(0)-> [Mail Item:: ID: 128 | Arrival: 42 | Destination: 12 | Weight: 943] +T: 65 > Delivered( 16) [Mail Item:: ID: 27 | Arrival: 33 | Destination: 11 | Weight: 923] +T: 65 > R0(0)-> [Mail Item:: ID: 113 | Arrival: 34 | Destination: 11 | Weight: 681] +T: 65 > Delivered( 17) [Mail Item:: ID: 128 | Arrival: 42 | Destination: 12 | Weight: 943] +T: 65 > R2(0) changed from DELIVERING to RETURNING +T: 66 > new addToPool [Mail Item:: ID: 70 | Arrival: 66 | Destination: 10 | Weight: 299] +T: 66 > new addToPool [Mail Item:: ID: 111 | Arrival: 66 | Destination: 3 | Weight: 1479] +T: 66 > Delivered( 18) [Mail Item:: ID: 113 | Arrival: 34 | Destination: 11 | Weight: 681] +T: 66 > R0(0) changed from DELIVERING to RETURNING +T: 66 > R1(0) changed from RETURNING to WAITING +T: 67 > R1(1) changed from WAITING to DELIVERING +T: 67 > R1(1)-> [Mail Item:: ID: 105 | Arrival: 55 | Destination: 12 | Weight: 799] +T: 68 > new addToPool [Mail Item:: ID: 21 | Arrival: 68 | Destination: 12 | Weight: 992] +T: 68 > new addToPool [Mail Item:: ID: 160 | Arrival: 68 | Destination: 6 | Weight: 832] +T: 70 > new addToPool [Mail Item:: ID: 67 | Arrival: 70 | Destination: 11 | Weight: 1258] +T: 71 > new addToPool [Mail Item:: ID: 8 | Arrival: 71 | Destination: 1 | Weight: 1615] +T: 72 > new addToPool [Mail Item:: ID: 17 | Arrival: 72 | Destination: 7 | Weight: 480] +T: 73 > new addToPool [Mail Item:: ID: 45 | Arrival: 73 | Destination: 9 | Weight: 205] +T: 74 > new addToPool [Mail Item:: ID: 0 | Arrival: 74 | Destination: 12 | Weight: 1711] +T: 74 > new addToPool [Mail Item:: ID: 95 | Arrival: 74 | Destination: 5 | Weight: 424] +T: 77 > new addToPool [Mail Item:: ID: 66 | Arrival: 77 | Destination: 8 | Weight: 312] +T: 77 > R0(0) changed from RETURNING to WAITING +T: 77 > R2(0) changed from RETURNING to WAITING +T: 78 > new addToPool [Mail Item:: ID: 147 | Arrival: 78 | Destination: 9 | Weight: 502] +T: 78 > R0(1) changed from WAITING to DELIVERING +T: 78 > R0(1)-> [Mail Item:: ID: 21 | Arrival: 68 | Destination: 12 | Weight: 992] +T: 78 > R2(1) changed from WAITING to DELIVERING +T: 78 > R2(1)-> [Mail Item:: ID: 146 | Arrival: 36 | Destination: 11 | Weight: 598] +T: 79 > Delivered( 19) [Mail Item:: ID: 105 | Arrival: 55 | Destination: 12 | Weight: 799] +T: 79 > R1(0)-> [Mail Item:: ID: 94 | Arrival: 62 | Destination: 12 | Weight: 793] +T: 80 > new addToPool [Mail Item:: ID: 2 | Arrival: 80 | Destination: 6 | Weight: 1422] +T: 80 > new addToPool [Mail Item:: ID: 116 | Arrival: 80 | Destination: 7 | Weight: 252] +T: 80 > Delivered( 20) [Mail Item:: ID: 94 | Arrival: 62 | Destination: 12 | Weight: 793] +T: 80 > R1(0) changed from DELIVERING to RETURNING +T: 81 > new addToPool [Mail Item:: ID: 30 | Arrival: 81 | Destination: 3 | Weight: 590] +T: 81 > new addToPool [Mail Item:: ID: 47 | Arrival: 81 | Destination: 8 | Weight: 450] +T: 82 > new addToPool [Mail Item:: ID: 112 | Arrival: 82 | Destination: 8 | Weight: 2000] +T: 82 > new addToPool [Mail Item:: ID: 120 | Arrival: 82 | Destination: 9 | Weight: 907] +T: 83 > new addToPool [Mail Item:: ID: 106 | Arrival: 83 | Destination: 8 | Weight: 461] +T: 84 > new addToPool [Mail Item:: ID: 158 | Arrival: 84 | Destination: 9 | Weight: 723] +T: 85 > new addToPool [Mail Item:: ID: 83 | Arrival: 85 | Destination: 11 | Weight: 380] +T: 85 > new addToPool [Mail Item:: ID: 86 | Arrival: 85 | Destination: 7 | Weight: 1137] +T: 86 > new addToPool [Mail Item:: ID: 133 | Arrival: 86 | Destination: 3 | Weight: 743] +T: 88 > new addToPool [Mail Item:: ID: 156 | Arrival: 88 | Destination: 8 | Weight: 703] +T: 89 > new addToPool [Mail Item:: ID: 118 | Arrival: 89 | Destination: 2 | Weight: 1204] +T: 89 > Delivered( 21) [Mail Item:: ID: 146 | Arrival: 36 | Destination: 11 | Weight: 598] +T: 89 > R2(0)-> [Mail Item:: ID: 58 | Arrival: 39 | Destination: 11 | Weight: 415] +T: 90 > Delivered( 22) [Mail Item:: ID: 21 | Arrival: 68 | Destination: 12 | Weight: 992] +T: 90 > R0(0)-> [Mail Item:: ID: 0 | Arrival: 74 | Destination: 12 | Weight: 1711] +T: 90 > Delivered( 23) [Mail Item:: ID: 58 | Arrival: 39 | Destination: 11 | Weight: 415] +T: 90 > R2(0) changed from DELIVERING to RETURNING +T: 91 > Delivered( 24) [Mail Item:: ID: 0 | Arrival: 74 | Destination: 12 | Weight: 1711] +T: 91 > R0(0) changed from DELIVERING to RETURNING +T: 92 > R1(0) changed from RETURNING to WAITING +T: 93 > new addToPool [Mail Item:: ID: 24 | Arrival: 93 | Destination: 10 | Weight: 1337] +T: 93 > R1(1) changed from WAITING to DELIVERING +T: 93 > R1(1)-> [Mail Item:: ID: 132 | Arrival: 41 | Destination: 11 | Weight: 1193] +T: 94 > new addToPool [Mail Item:: ID: 59 | Arrival: 94 | Destination: 12 | Weight: 1790] +T: 96 > new addToPool [Mail Item:: ID: 43 | Arrival: 96 | Destination: 7 | Weight: 1180] +T: 96 > new addToPool [Mail Item:: ID: 77 | Arrival: 96 | Destination: 5 | Weight: 361] +T: 97 > new addToPool [Mail Item:: ID: 19 | Arrival: 97 | Destination: 11 | Weight: 881] +T: 97 > new addToPool [Mail Item:: ID: 75 | Arrival: 97 | Destination: 1 | Weight: 2000] +T: 97 > new addToPool [Mail Item:: ID: 104 | Arrival: 97 | Destination: 2 | Weight: 778] +T: 101 > new addToPool [Mail Item:: ID: 6 | Arrival: 101 | Destination: 5 | Weight: 1000] +T: 101 > new addToPool [Mail Item:: ID: 37 | Arrival: 101 | Destination: 11 | Weight: 830] +T: 101 > new addToPool [Mail Item:: ID: 127 | Arrival: 101 | Destination: 8 | Weight: 685] +T: 101 > new addToPool [Mail Item:: ID: 138 | Arrival: 101 | Destination: 3 | Weight: 834] +T: 101 > R2(0) changed from RETURNING to WAITING +T: 102 > new addToPool [Mail Item:: ID: 38 | Arrival: 102 | Destination: 10 | Weight: 685] +T: 102 > R2(1) changed from WAITING to DELIVERING +T: 102 > R2(1)-> [Mail Item:: ID: 59 | Arrival: 94 | Destination: 12 | Weight: 1790] +T: 103 > R0(0) changed from RETURNING to WAITING +T: 104 > new addToPool [Mail Item:: ID: 31 | Arrival: 104 | Destination: 6 | Weight: 1107] +T: 104 > R0(1) changed from WAITING to DELIVERING +T: 104 > R0(1)-> [Mail Item:: ID: 67 | Arrival: 70 | Destination: 11 | Weight: 1258] +T: 104 > Delivered( 25) [Mail Item:: ID: 132 | Arrival: 41 | Destination: 11 | Weight: 1193] +T: 104 > R1(0)-> [Mail Item:: ID: 20 | Arrival: 43 | Destination: 11 | Weight: 972] +T: 105 > new addToPool [Mail Item:: ID: 28 | Arrival: 105 | Destination: 12 | Weight: 863] +T: 105 > new addToPool [Mail Item:: ID: 87 | Arrival: 105 | Destination: 8 | Weight: 878] +T: 105 > Delivered( 26) [Mail Item:: ID: 20 | Arrival: 43 | Destination: 11 | Weight: 972] +T: 105 > R1(0) changed from DELIVERING to RETURNING +T: 106 > new addToPool [Mail Item:: ID: 32 | Arrival: 106 | Destination: 3 | Weight: 702] +T: 108 > new addToPool [Mail Item:: ID: 125 | Arrival: 108 | Destination: 6 | Weight: 273] +T: 108 > new addToPool [Mail Item:: ID: 154 | Arrival: 108 | Destination: 8 | Weight: 286] +T: 109 > new addToPool [Mail Item:: ID: 4 | Arrival: 109 | Destination: 9 | Weight: 1030] +T: 109 > new addToPool [Mail Item:: ID: 52 | Arrival: 109 | Destination: 3 | Weight: 308] +T: 109 > new addToPool [Mail Item:: ID: 93 | Arrival: 109 | Destination: 4 | Weight: 702] +T: 109 > new addToPool [Mail Item:: ID: 101 | Arrival: 109 | Destination: 8 | Weight: 373] +T: 109 > new addToPool [Mail Item:: ID: 155 | Arrival: 109 | Destination: 8 | Weight: 2000] +T: 110 > new addToPool [Mail Item:: ID: 60 | Arrival: 110 | Destination: 7 | Weight: 223] +T: 111 > new addToPool [Mail Item:: ID: 53 | Arrival: 111 | Destination: 10 | Weight: 2000] +T: 111 > new addToPool [Mail Item:: ID: 57 | Arrival: 111 | Destination: 1 | Weight: 1270] +T: 112 > new addToPool [Mail Item:: ID: 55 | Arrival: 112 | Destination: 10 | Weight: 1743] +T: 112 > new addToPool [Mail Item:: ID: 145 | Arrival: 112 | Destination: 10 | Weight: 686] +T: 113 > new addToPool [Mail Item:: ID: 25 | Arrival: 113 | Destination: 12 | Weight: 793] +T: 114 > Delivered( 27) [Mail Item:: ID: 59 | Arrival: 94 | Destination: 12 | Weight: 1790] +T: 114 > R2(0)-> [Mail Item:: ID: 29 | Arrival: 63 | Destination: 11 | Weight: 842] +T: 115 > new addToPool [Mail Item:: ID: 115 | Arrival: 115 | Destination: 11 | Weight: 980] +T: 115 > new addToPool [Mail Item:: ID: 144 | Arrival: 115 | Destination: 1 | Weight: 405] +T: 115 > Delivered( 28) [Mail Item:: ID: 67 | Arrival: 70 | Destination: 11 | Weight: 1258] +T: 115 > R0(0)-> [Mail Item:: ID: 83 | Arrival: 85 | Destination: 11 | Weight: 380] +T: 116 > new addToPool [Mail Item:: ID: 11 | Arrival: 116 | Destination: 9 | Weight: 879] +T: 116 > Delivered( 29) [Mail Item:: ID: 83 | Arrival: 85 | Destination: 11 | Weight: 380] +T: 116 > R0(0) changed from DELIVERING to RETURNING +T: 116 > R1(0) changed from RETURNING to WAITING +T: 116 > Delivered( 30) [Mail Item:: ID: 29 | Arrival: 63 | Destination: 11 | Weight: 842] +T: 116 > R2(0) changed from DELIVERING to RETURNING +T: 117 > new addToPool [Mail Item:: ID: 26 | Arrival: 117 | Destination: 4 | Weight: 1164] +T: 117 > new addToPool [Mail Item:: ID: 48 | Arrival: 117 | Destination: 7 | Weight: 412] +T: 117 > R1(1) changed from WAITING to DELIVERING +T: 117 > R1(1)-> [Mail Item:: ID: 28 | Arrival: 105 | Destination: 12 | Weight: 863] +T: 118 > new addToPool [Mail Item:: ID: 39 | Arrival: 118 | Destination: 4 | Weight: 1282] +T: 118 > new addToPool [Mail Item:: ID: 135 | Arrival: 118 | Destination: 3 | Weight: 373] +T: 119 > new addToPool [Mail Item:: ID: 61 | Arrival: 119 | Destination: 2 | Weight: 747] +T: 120 > new addToPool [Mail Item:: ID: 9 | Arrival: 120 | Destination: 5 | Weight: 678] +T: 120 > new addToPool [Mail Item:: ID: 92 | Arrival: 120 | Destination: 2 | Weight: 1185] +T: 120 > new addToPool [Mail Item:: ID: 151 | Arrival: 120 | Destination: 10 | Weight: 1552] +T: 127 > R0(0) changed from RETURNING to WAITING +T: 127 > R2(0) changed from RETURNING to WAITING +T: 128 > R0(1) changed from WAITING to DELIVERING +T: 128 > R0(1)-> [Mail Item:: ID: 19 | Arrival: 97 | Destination: 11 | Weight: 881] +T: 128 > R2(1) changed from WAITING to DELIVERING +T: 128 > R2(1)-> [Mail Item:: ID: 115 | Arrival: 115 | Destination: 11 | Weight: 980] +T: 129 > Delivered( 31) [Mail Item:: ID: 28 | Arrival: 105 | Destination: 12 | Weight: 863] +T: 129 > R1(0)-> [Mail Item:: ID: 25 | Arrival: 113 | Destination: 12 | Weight: 793] +T: 130 > Delivered( 32) [Mail Item:: ID: 25 | Arrival: 113 | Destination: 12 | Weight: 793] +T: 130 > R1(0) changed from DELIVERING to RETURNING +T: 139 > Delivered( 33) [Mail Item:: ID: 19 | Arrival: 97 | Destination: 11 | Weight: 881] +T: 139 > R0(0)-> [Mail Item:: ID: 37 | Arrival: 101 | Destination: 11 | Weight: 830] +T: 139 > Delivered( 34) [Mail Item:: ID: 115 | Arrival: 115 | Destination: 11 | Weight: 980] +T: 139 > R2(0)-> [Mail Item:: ID: 150 | Arrival: 15 | Destination: 10 | Weight: 846] +T: 140 > Delivered( 35) [Mail Item:: ID: 37 | Arrival: 101 | Destination: 11 | Weight: 830] +T: 140 > R0(0) changed from DELIVERING to RETURNING +T: 141 > Delivered( 36) [Mail Item:: ID: 150 | Arrival: 15 | Destination: 10 | Weight: 846] +T: 141 > R2(0) changed from DELIVERING to RETURNING +T: 142 > R1(0) changed from RETURNING to WAITING +T: 143 > R1(1) changed from WAITING to DELIVERING +T: 143 > R1(1)-> [Mail Item:: ID: 122 | Arrival: 21 | Destination: 10 | Weight: 1706] +T: 151 > R0(0) changed from RETURNING to WAITING +T: 151 > R2(0) changed from RETURNING to WAITING +T: 152 > R0(1) changed from WAITING to DELIVERING +T: 152 > R0(1)-> [Mail Item:: ID: 5 | Arrival: 28 | Destination: 10 | Weight: 1045] +T: 152 > R2(1) changed from WAITING to DELIVERING +T: 152 > R2(1)-> [Mail Item:: ID: 40 | Arrival: 61 | Destination: 10 | Weight: 1604] +T: 153 > Delivered( 37) [Mail Item:: ID: 122 | Arrival: 21 | Destination: 10 | Weight: 1706] +T: 153 > R1(0)-> [Mail Item:: ID: 117 | Arrival: 25 | Destination: 10 | Weight: 1152] +T: 154 > Delivered( 38) [Mail Item:: ID: 117 | Arrival: 25 | Destination: 10 | Weight: 1152] +T: 154 > R1(0) changed from DELIVERING to RETURNING +T: 162 > Delivered( 39) [Mail Item:: ID: 5 | Arrival: 28 | Destination: 10 | Weight: 1045] +T: 162 > R0(0)-> [Mail Item:: ID: 13 | Arrival: 29 | Destination: 10 | Weight: 564] +T: 162 > Delivered( 40) [Mail Item:: ID: 40 | Arrival: 61 | Destination: 10 | Weight: 1604] +T: 162 > R2(0)-> [Mail Item:: ID: 91 | Arrival: 64 | Destination: 10 | Weight: 578] +T: 163 > Delivered( 41) [Mail Item:: ID: 13 | Arrival: 29 | Destination: 10 | Weight: 564] +T: 163 > R0(0) changed from DELIVERING to RETURNING +T: 163 > Delivered( 42) [Mail Item:: ID: 91 | Arrival: 64 | Destination: 10 | Weight: 578] +T: 163 > R2(0) changed from DELIVERING to RETURNING +T: 164 > R1(0) changed from RETURNING to WAITING +T: 165 > R1(1) changed from WAITING to DELIVERING +T: 165 > R1(1)-> [Mail Item:: ID: 70 | Arrival: 66 | Destination: 10 | Weight: 299] +T: 173 > R0(0) changed from RETURNING to WAITING +T: 173 > R2(0) changed from RETURNING to WAITING +T: 174 > R0(1) changed from WAITING to DELIVERING +T: 174 > R0(1)-> [Mail Item:: ID: 38 | Arrival: 102 | Destination: 10 | Weight: 685] +T: 174 > R2(1) changed from WAITING to DELIVERING +T: 174 > R2(1)-> [Mail Item:: ID: 55 | Arrival: 112 | Destination: 10 | Weight: 1743] +T: 175 > Delivered( 43) [Mail Item:: ID: 70 | Arrival: 66 | Destination: 10 | Weight: 299] +T: 175 > R1(0)-> [Mail Item:: ID: 24 | Arrival: 93 | Destination: 10 | Weight: 1337] +T: 176 > Delivered( 44) [Mail Item:: ID: 24 | Arrival: 93 | Destination: 10 | Weight: 1337] +T: 176 > R1(0) changed from DELIVERING to RETURNING +T: 184 > Delivered( 45) [Mail Item:: ID: 38 | Arrival: 102 | Destination: 10 | Weight: 685] +T: 184 > R0(0)-> [Mail Item:: ID: 53 | Arrival: 111 | Destination: 10 | Weight: 2000] +T: 184 > Delivered( 46) [Mail Item:: ID: 55 | Arrival: 112 | Destination: 10 | Weight: 1743] +T: 184 > R2(0)-> [Mail Item:: ID: 145 | Arrival: 112 | Destination: 10 | Weight: 686] +T: 185 > Delivered( 47) [Mail Item:: ID: 53 | Arrival: 111 | Destination: 10 | Weight: 2000] +T: 185 > R0(0) changed from DELIVERING to RETURNING +T: 185 > Delivered( 48) [Mail Item:: ID: 145 | Arrival: 112 | Destination: 10 | Weight: 686] +T: 185 > R2(0) changed from DELIVERING to RETURNING +T: 186 > R1(0) changed from RETURNING to WAITING +T: 187 > R1(1) changed from WAITING to DELIVERING +T: 187 > R1(1)-> [Mail Item:: ID: 151 | Arrival: 120 | Destination: 10 | Weight: 1552] +T: 195 > R0(0) changed from RETURNING to WAITING +T: 195 > R2(0) changed from RETURNING to WAITING +T: 196 > R0(1) changed from WAITING to DELIVERING +T: 196 > R0(1)-> [Mail Item:: ID: 134 | Arrival: 13 | Destination: 9 | Weight: 1729] +T: 196 > R2(1) changed from WAITING to DELIVERING +T: 196 > R2(1)-> [Mail Item:: ID: 68 | Arrival: 32 | Destination: 9 | Weight: 1581] +T: 197 > Delivered( 49) [Mail Item:: ID: 151 | Arrival: 120 | Destination: 10 | Weight: 1552] +T: 197 > R1(0)-> [Mail Item:: ID: 97 | Arrival: 13 | Destination: 9 | Weight: 825] +T: 199 > Delivered( 50) [Mail Item:: ID: 97 | Arrival: 13 | Destination: 9 | Weight: 825] +T: 199 > R1(0) changed from DELIVERING to RETURNING +T: 205 > Delivered( 51) [Mail Item:: ID: 134 | Arrival: 13 | Destination: 9 | Weight: 1729] +T: 205 > R0(0)-> [Mail Item:: ID: 56 | Arrival: 17 | Destination: 9 | Weight: 1298] +T: 205 > Delivered( 52) [Mail Item:: ID: 68 | Arrival: 32 | Destination: 9 | Weight: 1581] +T: 205 > R2(0)-> [Mail Item:: ID: 110 | Arrival: 34 | Destination: 9 | Weight: 1265] +T: 206 > Delivered( 53) [Mail Item:: ID: 56 | Arrival: 17 | Destination: 9 | Weight: 1298] +T: 206 > R0(0) changed from DELIVERING to RETURNING +T: 206 > Delivered( 54) [Mail Item:: ID: 110 | Arrival: 34 | Destination: 9 | Weight: 1265] +T: 206 > R2(0) changed from DELIVERING to RETURNING +T: 208 > R1(0) changed from RETURNING to WAITING +T: 209 > R1(1) changed from WAITING to DELIVERING +T: 209 > R1(1)-> [Mail Item:: ID: 143 | Arrival: 37 | Destination: 9 | Weight: 227] +T: 215 > R0(0) changed from RETURNING to WAITING +T: 215 > R2(0) changed from RETURNING to WAITING +T: 216 > R0(1) changed from WAITING to DELIVERING +T: 216 > R0(1)-> [Mail Item:: ID: 89 | Arrival: 55 | Destination: 9 | Weight: 1749] +T: 216 > R2(1) changed from WAITING to DELIVERING +T: 216 > R2(1)-> [Mail Item:: ID: 147 | Arrival: 78 | Destination: 9 | Weight: 502] +T: 218 > Delivered( 55) [Mail Item:: ID: 143 | Arrival: 37 | Destination: 9 | Weight: 227] +T: 218 > R1(0)-> [Mail Item:: ID: 44 | Arrival: 38 | Destination: 9 | Weight: 653] +T: 219 > Delivered( 56) [Mail Item:: ID: 44 | Arrival: 38 | Destination: 9 | Weight: 653] +T: 219 > R1(0) changed from DELIVERING to RETURNING +T: 225 > Delivered( 57) [Mail Item:: ID: 89 | Arrival: 55 | Destination: 9 | Weight: 1749] +T: 225 > R0(0)-> [Mail Item:: ID: 45 | Arrival: 73 | Destination: 9 | Weight: 205] +T: 225 > Delivered( 58) [Mail Item:: ID: 147 | Arrival: 78 | Destination: 9 | Weight: 502] +T: 225 > R2(0)-> [Mail Item:: ID: 120 | Arrival: 82 | Destination: 9 | Weight: 907] +T: 226 > Delivered( 59) [Mail Item:: ID: 45 | Arrival: 73 | Destination: 9 | Weight: 205] +T: 226 > R0(0) changed from DELIVERING to RETURNING +T: 226 > Delivered( 60) [Mail Item:: ID: 120 | Arrival: 82 | Destination: 9 | Weight: 907] +T: 226 > R2(0) changed from DELIVERING to RETURNING +T: 228 > R1(0) changed from RETURNING to WAITING +T: 229 > R1(1) changed from WAITING to DELIVERING +T: 229 > R1(1)-> [Mail Item:: ID: 158 | Arrival: 84 | Destination: 9 | Weight: 723] +T: 235 > R0(0) changed from RETURNING to WAITING +T: 235 > R2(0) changed from RETURNING to WAITING +T: 236 > R0(1) changed from WAITING to DELIVERING +T: 236 > R0(1)-> [Mail Item:: ID: 11 | Arrival: 116 | Destination: 9 | Weight: 879] +T: 236 > R2(1) changed from WAITING to DELIVERING +T: 236 > R2(1)-> [Mail Item:: ID: 109 | Arrival: 49 | Destination: 8 | Weight: 446] +T: 238 > Delivered( 61) [Mail Item:: ID: 158 | Arrival: 84 | Destination: 9 | Weight: 723] +T: 238 > R1(0)-> [Mail Item:: ID: 4 | Arrival: 109 | Destination: 9 | Weight: 1030] +T: 239 > Delivered( 62) [Mail Item:: ID: 4 | Arrival: 109 | Destination: 9 | Weight: 1030] +T: 239 > R1(0) changed from DELIVERING to RETURNING +T: 244 > Delivered( 63) [Mail Item:: ID: 109 | Arrival: 49 | Destination: 8 | Weight: 446] +T: 244 > R2(0)-> [Mail Item:: ID: 159 | Arrival: 63 | Destination: 8 | Weight: 690] +T: 245 > Delivered( 64) [Mail Item:: ID: 11 | Arrival: 116 | Destination: 9 | Weight: 879] +T: 245 > R0(0)-> [Mail Item:: ID: 78 | Arrival: 37 | Destination: 8 | Weight: 973] +T: 245 > Delivered( 65) [Mail Item:: ID: 159 | Arrival: 63 | Destination: 8 | Weight: 690] +T: 245 > R2(0) changed from DELIVERING to RETURNING +T: 247 > Delivered( 66) [Mail Item:: ID: 78 | Arrival: 37 | Destination: 8 | Weight: 973] +T: 247 > R0(0) changed from DELIVERING to RETURNING +T: 248 > R1(0) changed from RETURNING to WAITING +T: 249 > R1(1) changed from WAITING to DELIVERING +T: 249 > R1(1)-> [Mail Item:: ID: 66 | Arrival: 77 | Destination: 8 | Weight: 312] +T: 253 > R2(0) changed from RETURNING to WAITING +T: 254 > R2(1) changed from WAITING to DELIVERING +T: 254 > R2(1)-> [Mail Item:: ID: 112 | Arrival: 82 | Destination: 8 | Weight: 2000] +T: 255 > R0(0) changed from RETURNING to WAITING +T: 256 > R0(1) changed from WAITING to DELIVERING +T: 256 > R0(1)-> [Mail Item:: ID: 156 | Arrival: 88 | Destination: 8 | Weight: 703] +T: 257 > Delivered( 67) [Mail Item:: ID: 66 | Arrival: 77 | Destination: 8 | Weight: 312] +T: 257 > R1(0)-> [Mail Item:: ID: 47 | Arrival: 81 | Destination: 8 | Weight: 450] +T: 258 > Delivered( 68) [Mail Item:: ID: 47 | Arrival: 81 | Destination: 8 | Weight: 450] +T: 258 > R1(0) changed from DELIVERING to RETURNING +T: 262 > Delivered( 69) [Mail Item:: ID: 112 | Arrival: 82 | Destination: 8 | Weight: 2000] +T: 262 > R2(0)-> [Mail Item:: ID: 106 | Arrival: 83 | Destination: 8 | Weight: 461] +T: 263 > Delivered( 70) [Mail Item:: ID: 106 | Arrival: 83 | Destination: 8 | Weight: 461] +T: 263 > R2(0) changed from DELIVERING to RETURNING +T: 264 > Delivered( 71) [Mail Item:: ID: 156 | Arrival: 88 | Destination: 8 | Weight: 703] +T: 264 > R0(0)-> [Mail Item:: ID: 127 | Arrival: 101 | Destination: 8 | Weight: 685] +T: 265 > Delivered( 72) [Mail Item:: ID: 127 | Arrival: 101 | Destination: 8 | Weight: 685] +T: 265 > R0(0) changed from DELIVERING to RETURNING +T: 266 > R1(0) changed from RETURNING to WAITING +T: 267 > R1(1) changed from WAITING to DELIVERING +T: 267 > R1(1)-> [Mail Item:: ID: 87 | Arrival: 105 | Destination: 8 | Weight: 878] +T: 271 > R2(0) changed from RETURNING to WAITING +T: 272 > R2(1) changed from WAITING to DELIVERING +T: 272 > R2(1)-> [Mail Item:: ID: 101 | Arrival: 109 | Destination: 8 | Weight: 373] +T: 273 > R0(0) changed from RETURNING to WAITING +T: 274 > R0(1) changed from WAITING to DELIVERING +T: 274 > R0(1)-> [Mail Item:: ID: 137 | Arrival: 12 | Destination: 7 | Weight: 2000] +T: 275 > Delivered( 73) [Mail Item:: ID: 87 | Arrival: 105 | Destination: 8 | Weight: 878] +T: 275 > R1(0)-> [Mail Item:: ID: 154 | Arrival: 108 | Destination: 8 | Weight: 286] +T: 276 > Delivered( 74) [Mail Item:: ID: 154 | Arrival: 108 | Destination: 8 | Weight: 286] +T: 276 > R1(0) changed from DELIVERING to RETURNING +T: 280 > Delivered( 75) [Mail Item:: ID: 101 | Arrival: 109 | Destination: 8 | Weight: 373] +T: 280 > R2(0)-> [Mail Item:: ID: 155 | Arrival: 109 | Destination: 8 | Weight: 2000] +T: 281 > Delivered( 76) [Mail Item:: ID: 137 | Arrival: 12 | Destination: 7 | Weight: 2000] +T: 281 > R0(0)-> [Mail Item:: ID: 64 | Arrival: 16 | Destination: 7 | Weight: 1146] +T: 281 > Delivered( 77) [Mail Item:: ID: 155 | Arrival: 109 | Destination: 8 | Weight: 2000] +T: 281 > R2(0) changed from DELIVERING to RETURNING +T: 282 > Delivered( 78) [Mail Item:: ID: 64 | Arrival: 16 | Destination: 7 | Weight: 1146] +T: 282 > R0(0) changed from DELIVERING to RETURNING +T: 284 > R1(0) changed from RETURNING to WAITING +T: 285 > R1(1) changed from WAITING to DELIVERING +T: 285 > R1(1)-> [Mail Item:: ID: 124 | Arrival: 16 | Destination: 7 | Weight: 1580] +T: 289 > R0(0) changed from RETURNING to WAITING +T: 289 > R2(0) changed from RETURNING to WAITING +T: 290 > R0(1) changed from WAITING to DELIVERING +T: 290 > R0(1)-> [Mail Item:: ID: 140 | Arrival: 35 | Destination: 7 | Weight: 1468] +T: 290 > R2(1) changed from WAITING to DELIVERING +T: 290 > R2(1)-> [Mail Item:: ID: 35 | Arrival: 58 | Destination: 7 | Weight: 804] +T: 292 > Delivered( 79) [Mail Item:: ID: 124 | Arrival: 16 | Destination: 7 | Weight: 1580] +T: 292 > R1(0)-> [Mail Item:: ID: 34 | Arrival: 22 | Destination: 7 | Weight: 245] +T: 293 > Delivered( 80) [Mail Item:: ID: 34 | Arrival: 22 | Destination: 7 | Weight: 245] +T: 293 > R1(0) changed from DELIVERING to RETURNING +T: 297 > Delivered( 81) [Mail Item:: ID: 140 | Arrival: 35 | Destination: 7 | Weight: 1468] +T: 297 > R0(0)-> [Mail Item:: ID: 65 | Arrival: 57 | Destination: 7 | Weight: 361] +T: 297 > Delivered( 82) [Mail Item:: ID: 35 | Arrival: 58 | Destination: 7 | Weight: 804] +T: 297 > R2(0)-> [Mail Item:: ID: 98 | Arrival: 61 | Destination: 7 | Weight: 1029] +T: 298 > Delivered( 83) [Mail Item:: ID: 65 | Arrival: 57 | Destination: 7 | Weight: 361] +T: 298 > R0(0) changed from DELIVERING to RETURNING +T: 298 > Delivered( 84) [Mail Item:: ID: 98 | Arrival: 61 | Destination: 7 | Weight: 1029] +T: 298 > R2(0) changed from DELIVERING to RETURNING +T: 300 > R1(0) changed from RETURNING to WAITING +T: 301 > R1(1) changed from WAITING to DELIVERING +T: 301 > R1(1)-> [Mail Item:: ID: 17 | Arrival: 72 | Destination: 7 | Weight: 480] +T: 305 > R0(0) changed from RETURNING to WAITING +T: 305 > R2(0) changed from RETURNING to WAITING +T: 306 > R0(1) changed from WAITING to DELIVERING +T: 306 > R0(1)-> [Mail Item:: ID: 86 | Arrival: 85 | Destination: 7 | Weight: 1137] +T: 306 > R2(1) changed from WAITING to DELIVERING +T: 306 > R2(1)-> [Mail Item:: ID: 60 | Arrival: 110 | Destination: 7 | Weight: 223] +T: 308 > Delivered( 85) [Mail Item:: ID: 17 | Arrival: 72 | Destination: 7 | Weight: 480] +T: 308 > R1(0)-> [Mail Item:: ID: 116 | Arrival: 80 | Destination: 7 | Weight: 252] +T: 309 > Delivered( 86) [Mail Item:: ID: 116 | Arrival: 80 | Destination: 7 | Weight: 252] +T: 309 > R1(0) changed from DELIVERING to RETURNING +T: 313 > Delivered( 87) [Mail Item:: ID: 86 | Arrival: 85 | Destination: 7 | Weight: 1137] +T: 313 > R0(0)-> [Mail Item:: ID: 43 | Arrival: 96 | Destination: 7 | Weight: 1180] +T: 313 > Delivered( 88) [Mail Item:: ID: 60 | Arrival: 110 | Destination: 7 | Weight: 223] +T: 313 > R2(0)-> [Mail Item:: ID: 48 | Arrival: 117 | Destination: 7 | Weight: 412] +T: 314 > Delivered( 89) [Mail Item:: ID: 43 | Arrival: 96 | Destination: 7 | Weight: 1180] +T: 314 > R0(0) changed from DELIVERING to RETURNING +T: 314 > Delivered( 90) [Mail Item:: ID: 48 | Arrival: 117 | Destination: 7 | Weight: 412] +T: 314 > R2(0) changed from DELIVERING to RETURNING +T: 316 > R1(0) changed from RETURNING to WAITING +T: 317 > R1(1) changed from WAITING to DELIVERING +T: 317 > R1(1)-> [Mail Item:: ID: 15 | Arrival: 15 | Destination: 6 | Weight: 847] +T: 321 > R0(0) changed from RETURNING to WAITING +T: 321 > R2(0) changed from RETURNING to WAITING +T: 322 > R0(1) changed from WAITING to DELIVERING +T: 322 > R0(1)-> [Mail Item:: ID: 90 | Arrival: 16 | Destination: 6 | Weight: 1392] +T: 322 > R2(1) changed from WAITING to DELIVERING +T: 322 > R2(1)-> [Mail Item:: ID: 33 | Arrival: 25 | Destination: 6 | Weight: 1819] +T: 323 > Delivered( 91) [Mail Item:: ID: 15 | Arrival: 15 | Destination: 6 | Weight: 847] +T: 323 > R1(0)-> [Mail Item:: ID: 12 | Arrival: 16 | Destination: 6 | Weight: 1193] +T: 324 > Delivered( 92) [Mail Item:: ID: 12 | Arrival: 16 | Destination: 6 | Weight: 1193] +T: 324 > R1(0) changed from DELIVERING to RETURNING +T: 328 > Delivered( 93) [Mail Item:: ID: 90 | Arrival: 16 | Destination: 6 | Weight: 1392] +T: 328 > R0(0)-> [Mail Item:: ID: 82 | Arrival: 23 | Destination: 6 | Weight: 1348] +T: 328 > Delivered( 94) [Mail Item:: ID: 33 | Arrival: 25 | Destination: 6 | Weight: 1819] +T: 328 > R2(0)-> [Mail Item:: ID: 149 | Arrival: 30 | Destination: 6 | Weight: 436] +T: 329 > Delivered( 95) [Mail Item:: ID: 82 | Arrival: 23 | Destination: 6 | Weight: 1348] +T: 329 > R0(0) changed from DELIVERING to RETURNING +T: 329 > Delivered( 96) [Mail Item:: ID: 149 | Arrival: 30 | Destination: 6 | Weight: 436] +T: 329 > R2(0) changed from DELIVERING to RETURNING +T: 330 > R1(0) changed from RETURNING to WAITING +T: 331 > R1(1) changed from WAITING to DELIVERING +T: 331 > R1(1)-> [Mail Item:: ID: 136 | Arrival: 36 | Destination: 6 | Weight: 1494] +T: 335 > R0(0) changed from RETURNING to WAITING +T: 335 > R2(0) changed from RETURNING to WAITING +T: 336 > R0(1) changed from WAITING to DELIVERING +T: 336 > R0(1)-> [Mail Item:: ID: 84 | Arrival: 57 | Destination: 6 | Weight: 697] +T: 336 > R2(1) changed from WAITING to DELIVERING +T: 336 > R2(1)-> [Mail Item:: ID: 126 | Arrival: 61 | Destination: 6 | Weight: 1101] +T: 337 > Delivered( 97) [Mail Item:: ID: 136 | Arrival: 36 | Destination: 6 | Weight: 1494] +T: 337 > R1(0)-> [Mail Item:: ID: 18 | Arrival: 49 | Destination: 6 | Weight: 706] +T: 338 > Delivered( 98) [Mail Item:: ID: 18 | Arrival: 49 | Destination: 6 | Weight: 706] +T: 338 > R1(0) changed from DELIVERING to RETURNING +T: 342 > Delivered( 99) [Mail Item:: ID: 84 | Arrival: 57 | Destination: 6 | Weight: 697] +T: 342 > R0(0)-> [Mail Item:: ID: 50 | Arrival: 61 | Destination: 6 | Weight: 570] +T: 342 > Delivered( 100) [Mail Item:: ID: 126 | Arrival: 61 | Destination: 6 | Weight: 1101] +T: 342 > R2(0)-> [Mail Item:: ID: 160 | Arrival: 68 | Destination: 6 | Weight: 832] +T: 343 > Delivered( 101) [Mail Item:: ID: 50 | Arrival: 61 | Destination: 6 | Weight: 570] +T: 343 > R0(0) changed from DELIVERING to RETURNING +T: 343 > Delivered( 102) [Mail Item:: ID: 160 | Arrival: 68 | Destination: 6 | Weight: 832] +T: 343 > R2(0) changed from DELIVERING to RETURNING +T: 344 > R1(0) changed from RETURNING to WAITING +T: 345 > R1(1) changed from WAITING to DELIVERING +T: 345 > R1(1)-> [Mail Item:: ID: 2 | Arrival: 80 | Destination: 6 | Weight: 1422] +T: 349 > R0(0) changed from RETURNING to WAITING +T: 349 > R2(0) changed from RETURNING to WAITING +T: 350 > R0(1) changed from WAITING to DELIVERING +T: 350 > R0(1)-> [Mail Item:: ID: 125 | Arrival: 108 | Destination: 6 | Weight: 273] +T: 350 > R2(1) changed from WAITING to DELIVERING +T: 350 > R2(1)-> [Mail Item:: ID: 63 | Arrival: 17 | Destination: 5 | Weight: 2000] +T: 351 > Delivered( 103) [Mail Item:: ID: 2 | Arrival: 80 | Destination: 6 | Weight: 1422] +T: 351 > R1(0)-> [Mail Item:: ID: 31 | Arrival: 104 | Destination: 6 | Weight: 1107] +T: 352 > Delivered( 104) [Mail Item:: ID: 31 | Arrival: 104 | Destination: 6 | Weight: 1107] +T: 352 > R1(0) changed from DELIVERING to RETURNING +T: 355 > Delivered( 105) [Mail Item:: ID: 63 | Arrival: 17 | Destination: 5 | Weight: 2000] +T: 355 > R2(0)-> [Mail Item:: ID: 42 | Arrival: 21 | Destination: 5 | Weight: 215] +T: 356 > Delivered( 106) [Mail Item:: ID: 125 | Arrival: 108 | Destination: 6 | Weight: 273] +T: 356 > R0(0)-> [Mail Item:: ID: 130 | Arrival: 16 | Destination: 5 | Weight: 1580] +T: 356 > Delivered( 107) [Mail Item:: ID: 42 | Arrival: 21 | Destination: 5 | Weight: 215] +T: 356 > R2(0) changed from DELIVERING to RETURNING +T: 358 > Delivered( 108) [Mail Item:: ID: 130 | Arrival: 16 | Destination: 5 | Weight: 1580] +T: 358 > R0(0) changed from DELIVERING to RETURNING +T: 358 > R1(0) changed from RETURNING to WAITING +T: 359 > R1(1) changed from WAITING to DELIVERING +T: 359 > R1(1)-> [Mail Item:: ID: 141 | Arrival: 43 | Destination: 5 | Weight: 362] +T: 361 > R2(0) changed from RETURNING to WAITING +T: 362 > R2(1) changed from WAITING to DELIVERING +T: 362 > R2(1)-> [Mail Item:: ID: 49 | Arrival: 64 | Destination: 5 | Weight: 2000] +T: 363 > R0(0) changed from RETURNING to WAITING +T: 364 > R0(1) changed from WAITING to DELIVERING +T: 364 > R0(1)-> [Mail Item:: ID: 77 | Arrival: 96 | Destination: 5 | Weight: 361] +T: 364 > Delivered( 109) [Mail Item:: ID: 141 | Arrival: 43 | Destination: 5 | Weight: 362] +T: 364 > R1(0)-> [Mail Item:: ID: 16 | Arrival: 52 | Destination: 5 | Weight: 2000] +T: 365 > Delivered( 110) [Mail Item:: ID: 16 | Arrival: 52 | Destination: 5 | Weight: 2000] +T: 365 > R1(0) changed from DELIVERING to RETURNING +T: 367 > Delivered( 111) [Mail Item:: ID: 49 | Arrival: 64 | Destination: 5 | Weight: 2000] +T: 367 > R2(0)-> [Mail Item:: ID: 95 | Arrival: 74 | Destination: 5 | Weight: 424] +T: 368 > Delivered( 112) [Mail Item:: ID: 95 | Arrival: 74 | Destination: 5 | Weight: 424] +T: 368 > R2(0) changed from DELIVERING to RETURNING +T: 369 > Delivered( 113) [Mail Item:: ID: 77 | Arrival: 96 | Destination: 5 | Weight: 361] +T: 369 > R0(0)-> [Mail Item:: ID: 6 | Arrival: 101 | Destination: 5 | Weight: 1000] +T: 370 > Delivered( 114) [Mail Item:: ID: 6 | Arrival: 101 | Destination: 5 | Weight: 1000] +T: 370 > R0(0) changed from DELIVERING to RETURNING +T: 370 > R1(0) changed from RETURNING to WAITING +T: 371 > R1(1) changed from WAITING to DELIVERING +T: 371 > R1(1)-> [Mail Item:: ID: 9 | Arrival: 120 | Destination: 5 | Weight: 678] +T: 373 > R2(0) changed from RETURNING to WAITING +T: 374 > R2(1) changed from WAITING to DELIVERING +T: 374 > R2(1)-> [Mail Item:: ID: 1 | Arrival: 15 | Destination: 4 | Weight: 1198] +T: 375 > R0(0) changed from RETURNING to WAITING +T: 376 > R0(1) changed from WAITING to DELIVERING +T: 376 > R0(1)-> [Mail Item:: ID: 79 | Arrival: 18 | Destination: 4 | Weight: 2000] +T: 376 > Delivered( 115) [Mail Item:: ID: 9 | Arrival: 120 | Destination: 5 | Weight: 678] +T: 376 > R1(0)-> [Mail Item:: ID: 121 | Arrival: 14 | Destination: 4 | Weight: 1538] +T: 378 > Delivered( 116) [Mail Item:: ID: 121 | Arrival: 14 | Destination: 4 | Weight: 1538] +T: 378 > R1(0) changed from DELIVERING to RETURNING +T: 378 > Delivered( 117) [Mail Item:: ID: 1 | Arrival: 15 | Destination: 4 | Weight: 1198] +T: 378 > R2(0)-> [Mail Item:: ID: 51 | Arrival: 15 | Destination: 4 | Weight: 933] +T: 379 > Delivered( 118) [Mail Item:: ID: 51 | Arrival: 15 | Destination: 4 | Weight: 933] +T: 379 > R2(0) changed from DELIVERING to RETURNING +T: 380 > Delivered( 119) [Mail Item:: ID: 79 | Arrival: 18 | Destination: 4 | Weight: 2000] +T: 380 > R0(0)-> [Mail Item:: ID: 107 | Arrival: 22 | Destination: 4 | Weight: 1290] +T: 381 > Delivered( 120) [Mail Item:: ID: 107 | Arrival: 22 | Destination: 4 | Weight: 1290] +T: 381 > R0(0) changed from DELIVERING to RETURNING +T: 382 > R1(0) changed from RETURNING to WAITING +T: 383 > R1(1) changed from WAITING to DELIVERING +T: 383 > R1(1)-> [Mail Item:: ID: 100 | Arrival: 38 | Destination: 4 | Weight: 269] +T: 383 > R2(0) changed from RETURNING to WAITING +T: 384 > R2(1) changed from WAITING to DELIVERING +T: 384 > R2(1)-> [Mail Item:: ID: 71 | Arrival: 54 | Destination: 4 | Weight: 2000] +T: 385 > R0(0) changed from RETURNING to WAITING +T: 386 > R0(1) changed from WAITING to DELIVERING +T: 386 > R0(1)-> [Mail Item:: ID: 26 | Arrival: 117 | Destination: 4 | Weight: 1164] +T: 387 > Delivered( 121) [Mail Item:: ID: 100 | Arrival: 38 | Destination: 4 | Weight: 269] +T: 387 > R1(0)-> [Mail Item:: ID: 76 | Arrival: 40 | Destination: 4 | Weight: 1385] +T: 388 > Delivered( 122) [Mail Item:: ID: 76 | Arrival: 40 | Destination: 4 | Weight: 1385] +T: 388 > R1(0) changed from DELIVERING to RETURNING +T: 388 > Delivered( 123) [Mail Item:: ID: 71 | Arrival: 54 | Destination: 4 | Weight: 2000] +T: 388 > R2(0)-> [Mail Item:: ID: 93 | Arrival: 109 | Destination: 4 | Weight: 702] +T: 389 > Delivered( 124) [Mail Item:: ID: 93 | Arrival: 109 | Destination: 4 | Weight: 702] +T: 389 > R2(0) changed from DELIVERING to RETURNING +T: 390 > Delivered( 125) [Mail Item:: ID: 26 | Arrival: 117 | Destination: 4 | Weight: 1164] +T: 390 > R0(0)-> [Mail Item:: ID: 39 | Arrival: 118 | Destination: 4 | Weight: 1282] +T: 391 > Delivered( 126) [Mail Item:: ID: 39 | Arrival: 118 | Destination: 4 | Weight: 1282] +T: 391 > R0(0) changed from DELIVERING to RETURNING +T: 392 > R1(0) changed from RETURNING to WAITING +T: 393 > R1(1) changed from WAITING to DELIVERING +T: 393 > R1(1)-> [Mail Item:: ID: 108 | Arrival: 5 | Destination: 3 | Weight: 478] +T: 393 > R2(0) changed from RETURNING to WAITING +T: 394 > R2(1) changed from WAITING to DELIVERING +T: 394 > R2(1)-> [Mail Item:: ID: 22 | Arrival: 19 | Destination: 3 | Weight: 1129] +T: 395 > R0(0) changed from RETURNING to WAITING +T: 396 > R0(1) changed from WAITING to DELIVERING +T: 396 > R0(1)-> [Mail Item:: ID: 14 | Arrival: 32 | Destination: 3 | Weight: 1598] +T: 396 > Delivered( 127) [Mail Item:: ID: 108 | Arrival: 5 | Destination: 3 | Weight: 478] +T: 396 > R1(0)-> [Mail Item:: ID: 36 | Arrival: 12 | Destination: 3 | Weight: 710] +T: 397 > Delivered( 128) [Mail Item:: ID: 36 | Arrival: 12 | Destination: 3 | Weight: 710] +T: 397 > R1(0) changed from DELIVERING to RETURNING +T: 397 > Delivered( 129) [Mail Item:: ID: 22 | Arrival: 19 | Destination: 3 | Weight: 1129] +T: 397 > R2(0)-> [Mail Item:: ID: 62 | Arrival: 24 | Destination: 3 | Weight: 401] +T: 398 > Delivered( 130) [Mail Item:: ID: 62 | Arrival: 24 | Destination: 3 | Weight: 401] +T: 398 > R2(0) changed from DELIVERING to RETURNING +T: 399 > Delivered( 131) [Mail Item:: ID: 14 | Arrival: 32 | Destination: 3 | Weight: 1598] +T: 399 > R0(0)-> [Mail Item:: ID: 74 | Arrival: 39 | Destination: 3 | Weight: 787] +T: 400 > Delivered( 132) [Mail Item:: ID: 74 | Arrival: 39 | Destination: 3 | Weight: 787] +T: 400 > R0(0) changed from DELIVERING to RETURNING +T: 400 > R1(0) changed from RETURNING to WAITING +T: 401 > R1(1) changed from WAITING to DELIVERING +T: 401 > R1(1)-> [Mail Item:: ID: 99 | Arrival: 49 | Destination: 3 | Weight: 1921] +T: 401 > R2(0) changed from RETURNING to WAITING +T: 402 > R2(1) changed from WAITING to DELIVERING +T: 402 > R2(1)-> [Mail Item:: ID: 157 | Arrival: 64 | Destination: 3 | Weight: 551] +T: 403 > R0(0) changed from RETURNING to WAITING +T: 404 > R0(1) changed from WAITING to DELIVERING +T: 404 > R0(1)-> [Mail Item:: ID: 30 | Arrival: 81 | Destination: 3 | Weight: 590] +T: 404 > Delivered( 133) [Mail Item:: ID: 99 | Arrival: 49 | Destination: 3 | Weight: 1921] +T: 404 > R1(0)-> [Mail Item:: ID: 3 | Arrival: 62 | Destination: 3 | Weight: 678] +T: 405 > Delivered( 134) [Mail Item:: ID: 3 | Arrival: 62 | Destination: 3 | Weight: 678] +T: 405 > R1(0) changed from DELIVERING to RETURNING +T: 405 > Delivered( 135) [Mail Item:: ID: 157 | Arrival: 64 | Destination: 3 | Weight: 551] +T: 405 > R2(0)-> [Mail Item:: ID: 111 | Arrival: 66 | Destination: 3 | Weight: 1479] +T: 406 > Delivered( 136) [Mail Item:: ID: 111 | Arrival: 66 | Destination: 3 | Weight: 1479] +T: 406 > R2(0) changed from DELIVERING to RETURNING +T: 407 > Delivered( 137) [Mail Item:: ID: 30 | Arrival: 81 | Destination: 3 | Weight: 590] +T: 407 > R0(0)-> [Mail Item:: ID: 133 | Arrival: 86 | Destination: 3 | Weight: 743] +T: 408 > Delivered( 138) [Mail Item:: ID: 133 | Arrival: 86 | Destination: 3 | Weight: 743] +T: 408 > R0(0) changed from DELIVERING to RETURNING +T: 408 > R1(0) changed from RETURNING to WAITING +T: 409 > R1(1) changed from WAITING to DELIVERING +T: 409 > R1(1)-> [Mail Item:: ID: 138 | Arrival: 101 | Destination: 3 | Weight: 834] +T: 409 > R2(0) changed from RETURNING to WAITING +T: 410 > R2(1) changed from WAITING to DELIVERING +T: 410 > R2(1)-> [Mail Item:: ID: 52 | Arrival: 109 | Destination: 3 | Weight: 308] +T: 411 > R0(0) changed from RETURNING to WAITING +T: 412 > R0(1) changed from WAITING to DELIVERING +T: 412 > R0(1)-> [Mail Item:: ID: 131 | Arrival: 18 | Destination: 2 | Weight: 1514] +T: 412 > Delivered( 139) [Mail Item:: ID: 138 | Arrival: 101 | Destination: 3 | Weight: 834] +T: 412 > R1(0)-> [Mail Item:: ID: 32 | Arrival: 106 | Destination: 3 | Weight: 702] +T: 413 > Delivered( 140) [Mail Item:: ID: 32 | Arrival: 106 | Destination: 3 | Weight: 702] +T: 413 > R1(0) changed from DELIVERING to RETURNING +T: 413 > Delivered( 141) [Mail Item:: ID: 52 | Arrival: 109 | Destination: 3 | Weight: 308] +T: 413 > R2(0)-> [Mail Item:: ID: 135 | Arrival: 118 | Destination: 3 | Weight: 373] +T: 414 > Delivered( 142) [Mail Item:: ID: 131 | Arrival: 18 | Destination: 2 | Weight: 1514] +T: 414 > R0(0)-> [Mail Item:: ID: 139 | Arrival: 28 | Destination: 2 | Weight: 603] +T: 414 > Delivered( 143) [Mail Item:: ID: 135 | Arrival: 118 | Destination: 3 | Weight: 373] +T: 414 > R2(0) changed from DELIVERING to RETURNING +T: 415 > Delivered( 144) [Mail Item:: ID: 139 | Arrival: 28 | Destination: 2 | Weight: 603] +T: 415 > R0(0) changed from DELIVERING to RETURNING +T: 416 > R1(0) changed from RETURNING to WAITING +T: 417 > R0(0) changed from RETURNING to WAITING +T: 417 > R1(1) changed from WAITING to DELIVERING +T: 417 > R1(1)-> [Mail Item:: ID: 54 | Arrival: 29 | Destination: 2 | Weight: 575] +T: 417 > R2(0) changed from RETURNING to WAITING +T: 418 > R0(1) changed from WAITING to DELIVERING +T: 418 > R0(1)-> [Mail Item:: ID: 142 | Arrival: 50 | Destination: 2 | Weight: 322] +T: 418 > R2(1) changed from WAITING to DELIVERING +T: 418 > R2(1)-> [Mail Item:: ID: 118 | Arrival: 89 | Destination: 2 | Weight: 1204] +T: 419 > Delivered( 145) [Mail Item:: ID: 54 | Arrival: 29 | Destination: 2 | Weight: 575] +T: 419 > R1(0)-> [Mail Item:: ID: 81 | Arrival: 29 | Destination: 2 | Weight: 1748] +T: 420 > Delivered( 146) [Mail Item:: ID: 142 | Arrival: 50 | Destination: 2 | Weight: 322] +T: 420 > R0(0)-> [Mail Item:: ID: 80 | Arrival: 51 | Destination: 2 | Weight: 535] +T: 420 > Delivered( 147) [Mail Item:: ID: 81 | Arrival: 29 | Destination: 2 | Weight: 1748] +T: 420 > R1(0) changed from DELIVERING to RETURNING +T: 420 > Delivered( 148) [Mail Item:: ID: 118 | Arrival: 89 | Destination: 2 | Weight: 1204] +T: 420 > R2(0)-> [Mail Item:: ID: 104 | Arrival: 97 | Destination: 2 | Weight: 778] +T: 421 > Delivered( 149) [Mail Item:: ID: 80 | Arrival: 51 | Destination: 2 | Weight: 535] +T: 421 > R0(0) changed from DELIVERING to RETURNING +T: 421 > Delivered( 150) [Mail Item:: ID: 104 | Arrival: 97 | Destination: 2 | Weight: 778] +T: 421 > R2(0) changed from DELIVERING to RETURNING +T: 422 > R1(0) changed from RETURNING to WAITING +T: 423 > R0(0) changed from RETURNING to WAITING +T: 423 > R1(1) changed from WAITING to DELIVERING +T: 423 > R1(1)-> [Mail Item:: ID: 61 | Arrival: 119 | Destination: 2 | Weight: 747] +T: 423 > R2(0) changed from RETURNING to WAITING +T: 424 > R0(1) changed from WAITING to DELIVERING +T: 424 > R0(1)-> [Mail Item:: ID: 102 | Arrival: 10 | Destination: 1 | Weight: 676] +T: 424 > R2(1) changed from WAITING to DELIVERING +T: 424 > R2(1)-> [Mail Item:: ID: 119 | Arrival: 45 | Destination: 1 | Weight: 302] +T: 425 > Delivered( 151) [Mail Item:: ID: 102 | Arrival: 10 | Destination: 1 | Weight: 676] +T: 425 > R0(0)-> [Mail Item:: ID: 152 | Arrival: 28 | Destination: 1 | Weight: 220] +T: 425 > Delivered( 152) [Mail Item:: ID: 61 | Arrival: 119 | Destination: 2 | Weight: 747] +T: 425 > R1(0)-> [Mail Item:: ID: 92 | Arrival: 120 | Destination: 2 | Weight: 1185] +T: 425 > Delivered( 153) [Mail Item:: ID: 119 | Arrival: 45 | Destination: 1 | Weight: 302] +T: 425 > R2(0)-> [Mail Item:: ID: 72 | Arrival: 46 | Destination: 1 | Weight: 1996] +T: 426 > Delivered( 154) [Mail Item:: ID: 152 | Arrival: 28 | Destination: 1 | Weight: 220] +T: 426 > R0(0) changed from DELIVERING to RETURNING +T: 426 > Delivered( 155) [Mail Item:: ID: 92 | Arrival: 120 | Destination: 2 | Weight: 1185] +T: 426 > R1(0) changed from DELIVERING to RETURNING +T: 426 > Delivered( 156) [Mail Item:: ID: 72 | Arrival: 46 | Destination: 1 | Weight: 1996] +T: 426 > R2(0) changed from DELIVERING to RETURNING +T: 427 > R0(0) changed from RETURNING to WAITING +T: 427 > R2(0) changed from RETURNING to WAITING +T: 428 > R0(1) changed from WAITING to DELIVERING +T: 428 > R0(1)-> [Mail Item:: ID: 7 | Arrival: 57 | Destination: 1 | Weight: 777] +T: 428 > R1(0) changed from RETURNING to WAITING +T: 428 > R2(1) changed from WAITING to DELIVERING +T: 428 > R2(1)-> [Mail Item:: ID: 75 | Arrival: 97 | Destination: 1 | Weight: 2000] +T: 429 > Delivered( 157) [Mail Item:: ID: 7 | Arrival: 57 | Destination: 1 | Weight: 777] +T: 429 > R0(0)-> [Mail Item:: ID: 8 | Arrival: 71 | Destination: 1 | Weight: 1615] +T: 429 > R1(0) changed from WAITING to DELIVERING +T: 429 > R1(0)-> [Mail Item:: ID: 144 | Arrival: 115 | Destination: 1 | Weight: 405] +T: 429 > Delivered( 158) [Mail Item:: ID: 75 | Arrival: 97 | Destination: 1 | Weight: 2000] +T: 429 > R2(0)-> [Mail Item:: ID: 57 | Arrival: 111 | Destination: 1 | Weight: 1270] +T: 430 > Delivered( 159) [Mail Item:: ID: 8 | Arrival: 71 | Destination: 1 | Weight: 1615] +T: 430 > R0(0) changed from DELIVERING to RETURNING +T: 430 > Delivered( 160) [Mail Item:: ID: 144 | Arrival: 115 | Destination: 1 | Weight: 405] +T: 430 > R1(0) changed from DELIVERING to RETURNING +T: 430 > Delivered( 161) [Mail Item:: ID: 57 | Arrival: 111 | Destination: 1 | Weight: 1270] +T: 430 > R2(0) changed from DELIVERING to RETURNING +T: 431 | Simulation complete! +Final Delivery time: 431 +Delay: 103191.73 \ No newline at end of file diff --git a/Automail/src/automail/Automail.java b/Automail/src/automail/Automail.java new file mode 100644 index 0000000..2eb9e1b --- /dev/null +++ b/Automail/src/automail/Automail.java @@ -0,0 +1,20 @@ +package automail; + +import simulation.IMailDelivery; + +public class Automail { + + public Robot[] robots; + public MailPool mailPool; + + public Automail(MailPool mailPool, IMailDelivery delivery, int numRobots) { + /** Initialize the MailPool */ + + this.mailPool = mailPool; + + /** Initialize robots */ + robots = new Robot[numRobots]; + for (int i = 0; i < numRobots; i++) robots[i] = new Robot(delivery, mailPool, i); + } + +} diff --git a/Automail/src/automail/MailItem.java b/Automail/src/automail/MailItem.java new file mode 100644 index 0000000..785dcfe --- /dev/null +++ b/Automail/src/automail/MailItem.java @@ -0,0 +1,82 @@ +package automail; + +import java.util.Map; +import java.util.TreeMap; + +// import java.util.UUID; + +/** + * Represents a mail item + */ +public class MailItem { + + /** Represents the destination floor to which the mail is intended to go */ + protected final int destination_floor; + /** The mail identifier */ + protected final String id; + /** The time the mail item arrived */ + protected final int arrival_time; + /** The weight in grams of the mail item */ + protected final int weight; + + /** + * Constructor for a MailItem + * @param dest_floor the destination floor intended for this mail item + * @param arrival_time the time that the mail arrived + * @param weight the weight of this mail item + */ + public MailItem(int dest_floor, int arrival_time, int weight){ + this.destination_floor = dest_floor; + this.id = String.valueOf(hashCode()); + this.arrival_time = arrival_time; + this.weight = weight; + } + + @Override + public String toString(){ + return String.format("Mail Item:: ID: %6s | Arrival: %4d | Destination: %2d | Weight: %4d", id, arrival_time, destination_floor, weight); + } + + /** + * + * @return the destination floor of the mail item + */ + public int getDestFloor() { + return destination_floor; + } + + /** + * + * @return the ID of the mail item + */ + public String getId() { + return id; + } + + /** + * + * @return the arrival time of the mail item + */ + public int getArrivalTime(){ + return arrival_time; + } + + /** + * + * @return the weight of the mail item + */ + public int getWeight(){ + return weight; + } + + static private int count = 0; + static private Map<Integer, Integer> hashMap = new TreeMap<Integer, Integer>(); + + @Override + public int hashCode() { + Integer hash0 = super.hashCode(); + Integer hash = hashMap.get(hash0); + if (hash == null) { hash = count++; hashMap.put(hash0, hash); } + return hash; + } +} diff --git a/Automail/src/automail/MailPool.java b/Automail/src/automail/MailPool.java new file mode 100644 index 0000000..b4ed25b --- /dev/null +++ b/Automail/src/automail/MailPool.java @@ -0,0 +1,100 @@ +package automail; + +import java.util.LinkedList; +import java.util.Comparator; +import java.util.ListIterator; + +import exceptions.ItemTooHeavyException; + +/** + * addToPool is called when there are mail items newly arrived at the building to add to the MailPool or + * if a robot returns with some undelivered items - these are added back to the MailPool. + * The data structure and algorithms used in the MailPool is your choice. + * + */ +public class MailPool { + + private class Item { + int destination; + MailItem mailItem; + // Use stable sort to keep arrival time relative positions + + public Item(MailItem mailItem) { + destination = mailItem.getDestFloor(); + this.mailItem = mailItem; + } + } + + public class ItemComparator implements Comparator<Item> { + @Override + public int compare(Item i1, Item i2) { + int order = 0; + if (i1.destination < i2.destination) { + order = 1; + } else if (i1.destination > i2.destination) { + order = -1; + } + return order; + } + } + + private LinkedList<Item> pool; + private LinkedList<Robot> robots; + + public MailPool(int nrobots){ + // Start empty + pool = new LinkedList<Item>(); + robots = new LinkedList<Robot>(); + } + + /** + * Adds an item to the mail pool + * @param mailItem the mail item being added. + */ + public void addToPool(MailItem mailItem) { + Item item = new Item(mailItem); + pool.add(item); + pool.sort(new ItemComparator()); + } + + + + /** + * load up any waiting robots with mailItems, if any. + */ + public void loadItemsToRobot() throws ItemTooHeavyException { + //List available robots + ListIterator<Robot> i = robots.listIterator(); + while (i.hasNext()) loadItem(i); + } + + //load items to the robot + private void loadItem(ListIterator<Robot> i) throws ItemTooHeavyException { + Robot robot = i.next(); + assert(robot.isEmpty()); + // System.out.printf("P: %3d%n", pool.size()); + ListIterator<Item> j = pool.listIterator(); + if (pool.size() > 0) { + try { + robot.addToHand(j.next().mailItem); // hand first as we want higher priority delivered first + j.remove(); + if (pool.size() > 0) { + robot.addToTube(j.next().mailItem); + j.remove(); + } + robot.dispatch(); // send the robot off if it has any items to deliver + i.remove(); // remove from mailPool queue + } catch (Exception e) { + throw e; + } + } + } + + /** + * @param robot refers to a robot which has arrived back ready for more mailItems to deliver + */ + public void registerWaiting(Robot robot) { // assumes won't be there already + robots.add(robot); + } + +} diff --git a/Automail/src/automail/Robot.java b/Automail/src/automail/Robot.java new file mode 100644 index 0000000..4867889 --- /dev/null +++ b/Automail/src/automail/Robot.java @@ -0,0 +1,176 @@ +package automail; + +import exceptions.ExcessiveDeliveryException; +import exceptions.ItemTooHeavyException; +import simulation.Building; +import simulation.Clock; +import simulation.IMailDelivery; + +/** + * The robot delivers mail! + */ +public class Robot { + + static public final int INDIVIDUAL_MAX_WEIGHT = 2000; + + IMailDelivery delivery; + protected final String id; + /** Possible states the robot can be in */ + public enum RobotState { DELIVERING, WAITING, RETURNING } + public RobotState current_state; + private int current_floor; + private int destination_floor; + private MailPool mailPool; + private boolean receivedDispatch; + + private MailItem deliveryItem = null; + private MailItem tube = null; + + private int deliveryCounter; + + + /** + * Initiates the robot's location at the start to be at the mailroom + * also set it to be waiting for mail. + * @param behaviour governs selection of mail items for delivery and behaviour on priority arrivals + * @param delivery governs the final delivery + * @param mailPool is the source of mail items + */ + public Robot(IMailDelivery delivery, MailPool mailPool, int number){ + this.id = "R" + number; + // current_state = RobotState.WAITING; + current_state = RobotState.RETURNING; + current_floor = Building.MAILROOM_LOCATION; + this.delivery = delivery; + this.mailPool = mailPool; + this.receivedDispatch = false; + this.deliveryCounter = 0; + } + + /** + * This is called when a robot is assigned the mail items and ready to dispatch for the delivery + */ + public void dispatch() { + receivedDispatch = true; + } + + /** + * This is called on every time step + * @throws ExcessiveDeliveryException if robot delivers more than the capacity of the tube without refilling + */ + public void operate() throws ExcessiveDeliveryException { + switch(current_state) { + /** This state is triggered when the robot is returning to the mailroom after a delivery */ + case RETURNING: + /** If its current position is at the mailroom, then the robot should change state */ + if(current_floor == Building.MAILROOM_LOCATION){ + if (tube != null) { + mailPool.addToPool(tube); + System.out.printf("T: %3d > old addToPool [%s]%n", Clock.Time(), tube.toString()); + tube = null; + } + /** Tell the sorter the robot is ready */ + mailPool.registerWaiting(this); + changeState(RobotState.WAITING); + } else { + /** If the robot is not at the mailroom floor yet, then move towards it! */ + moveTowards(Building.MAILROOM_LOCATION); + break; + } + case WAITING: + /** If the StorageTube is ready and the Robot is waiting in the mailroom then start the delivery */ + if(!isEmpty() && receivedDispatch){ + receivedDispatch = false; + deliveryCounter = 0; // reset delivery counter + setDestination(); + changeState(RobotState.DELIVERING); + } + break; + case DELIVERING: + if(current_floor == destination_floor){ // If already here drop off either way + /** Delivery complete, report this to the simulator! */ + delivery.deliver(deliveryItem); + deliveryItem = null; + deliveryCounter++; + if(deliveryCounter > 2){ // Implies a simulation bug + throw new ExcessiveDeliveryException(); + } + /** Check if want to return, i.e. if there is no item in the tube*/ + if(tube == null){ + changeState(RobotState.RETURNING); + } + else{ + /** If there is another item, set the robot's route to the location to deliver the item */ + deliveryItem = tube; + tube = null; + setDestination(); + changeState(RobotState.DELIVERING); + } + } else { + /** The robot is not at the destination yet, move towards it! */ + moveTowards(destination_floor); + } + break; + } + } + + /** + * Sets the route for the robot + */ + private void setDestination() { + /** Set the destination floor */ + destination_floor = deliveryItem.getDestFloor(); + } + + /** + * Generic function that moves the robot towards the destination + * @param destination the floor towards which the robot is moving + */ + private void moveTowards(int destination) { + if(current_floor < destination){ + current_floor++; + } else { + current_floor--; + } + } + + private String getIdTube() { + return String.format("%s(%1d)", this.id, (tube == null ? 0 : 1)); + } + + /** + * Prints out the change in state + * @param nextState the state to which the robot is transitioning + */ + private void changeState(RobotState nextState){ + assert(!(deliveryItem == null && tube != null)); + if (current_state != nextState) { + System.out.printf("T: %3d > %7s changed from %s to %s%n", Clock.Time(), getIdTube(), current_state, nextState); + } + current_state = nextState; + if(nextState == RobotState.DELIVERING){ + System.out.printf("T: %3d > %7s-> [%s]%n", Clock.Time(), getIdTube(), deliveryItem.toString()); + } + } + + public MailItem getTube() { + return tube; + } + + public boolean isEmpty() { + return (deliveryItem == null && tube == null); + } + + public void addToHand(MailItem mailItem) throws ItemTooHeavyException { + assert(deliveryItem == null); + deliveryItem = mailItem; + if (deliveryItem.weight > INDIVIDUAL_MAX_WEIGHT) throw new ItemTooHeavyException(); + } + + public void addToTube(MailItem mailItem) throws ItemTooHeavyException { + assert(tube == null); + tube = mailItem; + if (tube.weight > INDIVIDUAL_MAX_WEIGHT) throw new ItemTooHeavyException(); + } + +} diff --git a/Automail/src/exceptions/ExcessiveDeliveryException.java b/Automail/src/exceptions/ExcessiveDeliveryException.java new file mode 100644 index 0000000..a316df4 --- /dev/null +++ b/Automail/src/exceptions/ExcessiveDeliveryException.java @@ -0,0 +1,10 @@ +package exceptions; + +/** + * An exception thrown when the robot tries to deliver more items than its tube capacity without refilling. + */ +public class ExcessiveDeliveryException extends Throwable { + public ExcessiveDeliveryException(){ + super("Attempting to deliver more than 4 items in a single trip!!"); + } +} diff --git a/Automail/src/exceptions/ItemTooHeavyException.java b/Automail/src/exceptions/ItemTooHeavyException.java new file mode 100644 index 0000000..0e8c183 --- /dev/null +++ b/Automail/src/exceptions/ItemTooHeavyException.java @@ -0,0 +1,10 @@ +package exceptions; + +/** + * This exception is thrown when a robot takes a MailItem from its StorageTube which is too heavy for that robot + */ +public class ItemTooHeavyException extends Exception { + public ItemTooHeavyException(){ + super("Item too heavy! Dropped by robot."); + } +} diff --git a/Automail/src/exceptions/MailAlreadyDeliveredException.java b/Automail/src/exceptions/MailAlreadyDeliveredException.java new file mode 100644 index 0000000..cdb62b5 --- /dev/null +++ b/Automail/src/exceptions/MailAlreadyDeliveredException.java @@ -0,0 +1,10 @@ +package exceptions; + +/** + * An exception thrown when a mail that is already delivered attempts to be delivered again. + */ +public class MailAlreadyDeliveredException extends Throwable { + public MailAlreadyDeliveredException(){ + super("This mail has already been delivered!"); + } +} diff --git a/Automail/src/simulation/Building.java b/Automail/src/simulation/Building.java new file mode 100644 index 0000000..303fd79 --- /dev/null +++ b/Automail/src/simulation/Building.java @@ -0,0 +1,15 @@ +package simulation; + +public class Building { + + + /** The number of floors in the building **/ + public static int FLOORS; + + /** Represents the ground floor location */ + public static final int LOWEST_FLOOR = 1; + + /** Represents the mailroom location */ + public static final int MAILROOM_LOCATION = 1; + +} diff --git a/Automail/src/simulation/Clock.java b/Automail/src/simulation/Clock.java new file mode 100644 index 0000000..55beebb --- /dev/null +++ b/Automail/src/simulation/Clock.java @@ -0,0 +1,18 @@ +package simulation; + +public class Clock { + + /** Represents the current time **/ + private static int Time = 0; + + /** The threshold for the latest time for mail to arrive **/ + public static int MAIL_RECEVING_LENGTH; + + public static int Time() { + return Time; + } + + public static void Tick() { + Time++; + } +} diff --git a/Automail/src/simulation/IMailDelivery.java b/Automail/src/simulation/IMailDelivery.java new file mode 100644 index 0000000..5a1355d --- /dev/null +++ b/Automail/src/simulation/IMailDelivery.java @@ -0,0 +1,16 @@ +package simulation; + +import automail.MailItem; + +/** + * a MailDelivery is used by the Robot to deliver mail once it has arrived at the correct location + */ +public interface IMailDelivery { + + /** + * Delivers an item at its floor + * @param mailItem the mail item being delivered. + */ + void deliver(MailItem mailItem); + +} \ No newline at end of file diff --git a/Automail/src/simulation/MailGenerator.java b/Automail/src/simulation/MailGenerator.java new file mode 100644 index 0000000..17a4a15 --- /dev/null +++ b/Automail/src/simulation/MailGenerator.java @@ -0,0 +1,135 @@ +package simulation; + +import java.util.*; + +import automail.MailItem; +import automail.MailPool; + +/** + * This class generates the mail + */ +public class MailGenerator { + + public final int MAIL_TO_CREATE; + public final int MAIL_MAX_WEIGHT; + + private int mailCreated; + + private final Random random; + /** This seed is used to make the behaviour deterministic */ + + private boolean complete; + private MailPool mailPool; + + private Map<Integer,ArrayList<MailItem>> allMail; + + /** + * Constructor for mail generation + * @param mailToCreate roughly how many mail items to create + * @param mailMaxWeight limits the maximum weight of the mail + * @param mailPool where mail items go on arrival + * @param seed random seed for generating mail + */ + public MailGenerator(int mailToCreate, int mailMaxWeight, MailPool mailPool, HashMap<Boolean,Integer> seed){ + if(seed.containsKey(true)){ + this.random = new Random((long) seed.get(true)); + } + else{ + this.random = new Random(); + } + // Vary arriving mail by +/-20% + MAIL_TO_CREATE = mailToCreate*4/5 + random.nextInt(mailToCreate*2/5); + MAIL_MAX_WEIGHT = mailMaxWeight; + // System.out.println("Num Mail Items: "+MAIL_TO_CREATE); + mailCreated = 0; + complete = false; + allMail = new HashMap<Integer,ArrayList<MailItem>>(); + this.mailPool = mailPool; + } + + /** + * @return a new mail item that needs to be delivered + */ + private MailItem generateMail(){ + MailItem newMailItem; + int destinationFloor = generateDestinationFloor(); + int arrivalTime = generateArrivalTime(); + int weight = generateWeight(); + + newMailItem = new MailItem(destinationFloor,arrivalTime,weight); + return newMailItem; + } + + /** + * @return a destination floor between the ranges of GROUND_FLOOR to FLOOR + */ + private int generateDestinationFloor(){ + return Building.LOWEST_FLOOR + random.nextInt(Building.FLOORS); + } + + /** + * @return a random weight + */ + private int generateWeight(){ + final double mean = 200.0; // grams for normal item + final double stddev = 1000.0; // grams + double base = random.nextGaussian(); + if (base < 0) base = -base; + int weight = (int) (mean + base * stddev); + return weight > MAIL_MAX_WEIGHT ? MAIL_MAX_WEIGHT : weight; + } + + /** + * @return a random arrival time before the last delivery time + */ + private int generateArrivalTime(){ + return 1 + random.nextInt(Clock.MAIL_RECEVING_LENGTH); + } + + /** + * This class initializes all mails and sets their corresponding values, + * All generated mails will be saved in allMail + */ + public void generateAllMail(){ + while(!complete){ + MailItem newMail = generateMail(); + int timeToDeliver = newMail.getArrivalTime(); + /** Check if key exists for this time **/ + if(allMail.containsKey(timeToDeliver)){ + /** Add to existing array */ + allMail.get(timeToDeliver).add(newMail); + } + else{ + /** If the key doesn't exist then set a new key along with the array of MailItems to add during + * that time step. + */ + ArrayList<MailItem> newMailList = new ArrayList<MailItem>(); + newMailList.add(newMail); + allMail.put(timeToDeliver,newMailList); + } + /** Mark the mail as created */ + mailCreated++; + + /** Once we have satisfied the amount of mail to create, we're done!*/ + if(mailCreated == MAIL_TO_CREATE){ + complete = true; + } + } + + } + + /** + * Given the clock time, put the generated mails into the mailPool. + * So that the robot will can pick up the mails from the pool. + */ + public void addToMailPool(){ + // Check if there are any mail to create + if(this.allMail.containsKey(Clock.Time())){ + for(MailItem mailItem : allMail.get(Clock.Time())){ + System.out.printf("T: %3d > new addToPool [%s]%n", Clock.Time(), mailItem.toString()); + mailPool.addToPool(mailItem); + } + } + } + +} diff --git a/Automail/src/simulation/Simulation.java b/Automail/src/simulation/Simulation.java new file mode 100644 index 0000000..39c65fb --- /dev/null +++ b/Automail/src/simulation/Simulation.java @@ -0,0 +1,181 @@ +package simulation; + +import exceptions.ExcessiveDeliveryException; +import exceptions.ItemTooHeavyException; +import exceptions.MailAlreadyDeliveredException; + +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Properties; + +import com.unimelb.swen30006.wifimodem.WifiModem; + +import automail.Automail; +import automail.MailItem; +import automail.MailPool; + +/** + * This class simulates the behaviour of AutoMail + */ +public class Simulation { + private static int NUM_ROBOTS; + private static double CHARGE_THRESHOLD; + private static boolean CHARGE_DISPLAY; + + /** Constant for the mail generator */ + private static int MAIL_TO_CREATE; + private static int MAIL_MAX_WEIGHT; + + private static ArrayList<MailItem> MAIL_DELIVERED; + private static double total_delay = 0; + private static WifiModem wModem = null; + + public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IOException { + + /** Load properties for simulation based on either default or a properties file.**/ + Properties automailProperties = setUpProperties(); + + //An array list to record mails that have been delivered + MAIL_DELIVERED = new ArrayList<MailItem>(); + + /** This code section below is to save a random seed for generating mails. + * If a program argument is entered, the first argument will be a random seed. + * If not a random seed will be from a properties file. + * Otherwise, no a random seed. */ + + /** Used to see whether a seed is initialized or not */ + HashMap<Boolean, Integer> seedMap = new HashMap<>(); + if (args.length == 0 ) { // No arg + String seedProp = automailProperties.getProperty("Seed"); + if (seedProp == null) { // and no property + seedMap.put(false, 0); // so randomise + } else { // Use property seed + seedMap.put(true, Integer.parseInt(seedProp)); + } + } else { // Use arg seed - overrides property + seedMap.put(true, Integer.parseInt(args[0])); + } + Integer seed = seedMap.get(true); + System.out.println("#A Random Seed: " + (seed == null ? "null" : seed.toString())); + + // Install the modem & turn on the modem + try { + System.out.println("Setting up Wifi Modem"); + wModem = WifiModem.getInstance(Building.MAILROOM_LOCATION); + System.out.println(wModem.Turnon()); + } catch (Exception mException) { + mException.printStackTrace(); + } + + /** + * This code section is for running a simulation + */ + /* Instantiate MailPool and Automail */ + MailPool mailPool = new MailPool(NUM_ROBOTS); + Automail automail = new Automail(mailPool, new ReportDelivery(), NUM_ROBOTS); + MailGenerator mailGenerator = new MailGenerator(MAIL_TO_CREATE, MAIL_MAX_WEIGHT, mailPool, seedMap); + + /** Generate all the mails */ + mailGenerator.generateAllMail(); + while(MAIL_DELIVERED.size() != mailGenerator.MAIL_TO_CREATE) { + // System.out.printf("Delivered: %4d; Created: %4d%n", MAIL_DELIVERED.size(), mailGenerator.MAIL_TO_CREATE); + mailGenerator.addToMailPool(); + try { + automail.mailPool.loadItemsToRobot(); + for (int i=0; i < NUM_ROBOTS; i++) { + automail.robots[i].operate(); + } + } catch (ExcessiveDeliveryException|ItemTooHeavyException e) { + e.printStackTrace(); + System.out.println("Simulation unable to complete."); + System.exit(0); + } + Clock.Tick(); + } + printResults(); + System.out.println(wModem.Turnoff()); + } + + static private Properties setUpProperties() throws IOException { + Properties automailProperties = new Properties(); + // Default properties + automailProperties.setProperty("Robots", "Standard"); + automailProperties.setProperty("Floors", "10"); + automailProperties.setProperty("Mail_to_Create", "80"); + automailProperties.setProperty("ChargeThreshold", "0"); + automailProperties.setProperty("ChargeDisplay", "false"); + + // Read properties + FileReader inStream = null; + try { + inStream = new FileReader("automail.properties"); + automailProperties.load(inStream); + } finally { + if (inStream != null) { + inStream.close(); + } + } + + // Floors + Building.FLOORS = Integer.parseInt(automailProperties.getProperty("Floors")); + System.out.println("#Floors: " + Building.FLOORS); + // Mail_to_Create + MAIL_TO_CREATE = Integer.parseInt(automailProperties.getProperty("Mail_to_Create")); + System.out.println("#Created mails: " + MAIL_TO_CREATE); + // Mail_to_Create + MAIL_MAX_WEIGHT = Integer.parseInt(automailProperties.getProperty("Mail_Max_Weight")); + System.out.println("#Maximum weight: " + MAIL_MAX_WEIGHT); + // Last_Delivery_Time + Clock.MAIL_RECEVING_LENGTH = Integer.parseInt(automailProperties.getProperty("Mail_Receving_Length")); + System.out.println("#Mail receiving length: " + Clock.MAIL_RECEVING_LENGTH); + // Robots + NUM_ROBOTS = Integer.parseInt(automailProperties.getProperty("Robots")); + System.out.print("#Robots: "); System.out.println(NUM_ROBOTS); + assert(NUM_ROBOTS > 0); + // Charge Threshold + CHARGE_THRESHOLD = Double.parseDouble(automailProperties.getProperty("ChargeThreshold")); + System.out.println("#Charge Threshold: " + CHARGE_THRESHOLD); + // Charge Display + CHARGE_DISPLAY = Boolean.parseBoolean(automailProperties.getProperty("ChargeDisplay")); + System.out.println("#Charge Display: " + CHARGE_DISPLAY); + + return automailProperties; + } + + static class ReportDelivery implements IMailDelivery { + + /** Confirm the delivery and calculate the total score */ + public void deliver(MailItem deliveryItem){ + if(!MAIL_DELIVERED.contains(deliveryItem)){ + MAIL_DELIVERED.add(deliveryItem); + System.out.printf("T: %3d > Delivered(%4d) [%s]%n", Clock.Time(), MAIL_DELIVERED.size(), deliveryItem.toString()); + // Calculate delivery score + total_delay += calculateDeliveryDelay(deliveryItem); + } + else{ + try { + throw new MailAlreadyDeliveredException(); + } catch (MailAlreadyDeliveredException e) { + e.printStackTrace(); + } + } + } + + } + + private static double calculateDeliveryDelay(MailItem deliveryItem) { + // Penalty for longer delivery times + final double penalty = 1.2; + double priority_weight = 0; + // Take (delivery time - arrivalTime)**penalty * (1+sqrt(priority_weight)) + return Math.pow(Clock.Time() - deliveryItem.getArrivalTime(),penalty)*(1+Math.sqrt(priority_weight)); + } + + public static void printResults(){ + System.out.println("T: "+Clock.Time()+" | Simulation complete!"); + System.out.println("Final Delivery time: "+Clock.Time()); + System.out.printf("Delay: %.2f%n", total_delay); + } +} -- GitLab