From 966db6e5add80ec38c140b566e7275263243778b Mon Sep 17 00:00:00 2001 From: Manuel Plonski Date: Thu, 26 Jan 2023 14:58:41 +0100 Subject: [PATCH] some things work --- db/production.yml | 2 +- econ/__pycache__/exchange.cpython-38.pyc | Bin 5834 -> 6286 bytes econ/__pycache__/simulation.cpython-38.pyc | Bin 1581 -> 4949 bytes .../__pycache__/autoproduction.cpython-38.pyc | Bin 1586 -> 1764 bytes .../__pycache__/base_agent.cpython-38.pyc | Bin 1160 -> 1165 bytes .../base_aquire_agent.cpython-38.pyc | Bin 3842 -> 3865 bytes .../price_believe_aquire.cpython-38.pyc | Bin 3584 -> 3680 bytes .../price_believe_distribute.cpython-38.pyc | Bin 3432 -> 3657 bytes econ/agents/autoproduction.py | 22 ++-- econ/agents/base_agent.py | 2 +- econ/agents/base_aquire_agent.py | 5 +- econ/agents/price_believe_aquire.py | 25 ++-- econ/agents/price_believe_distribute.py | 30 ++--- econ/business/Price_Believe_Business.py | 22 ++-- .../Price_Believe_Business.cpython-38.pyc | Bin 1446 -> 1748 bytes .../__pycache__/base_business.cpython-38.pyc | Bin 1212 -> 1833 bytes econ/business/base_business.py | 29 ++++- econ/cells/__pycache__/cell.cpython-38.pyc | Bin 1723 -> 2524 bytes econ/cells/cell.py | 19 ++- .../__pycache__/commoditys.cpython-38.pyc | Bin 1111 -> 1202 bytes econ/commoditys/commoditys.py | 5 +- econ/exchange.py | 16 ++- econ/simulation.py | 114 +++++++++++++++++- main.py | 19 ++- 24 files changed, 242 insertions(+), 68 deletions(-) diff --git a/db/production.yml b/db/production.yml index 0cdc330..ad10190 100644 --- a/db/production.yml +++ b/db/production.yml @@ -1,7 +1,7 @@ kind: production spec: - name: Food - amount: 1 + amount: 100 prod: - "Grain": 1 - "Fruit": 1 diff --git a/econ/__pycache__/exchange.cpython-38.pyc b/econ/__pycache__/exchange.cpython-38.pyc index e5aed517f84353e05149c22b1437f55adcf66b45..31b3e607ee73aa39ce6a73cf4ba38a127a30cc74 100644 GIT binary patch delta 1971 zcmbtV&2Jk;6yNc#owXgWKVmzH^Xa5Xv#IjYCiH_)R8fJ%B?Tpsz@n@i&!o8V7jHKu zEs-KnBrd2T8VP~a10Mo42#HGh3pgP_9FX8L65@iyr6(i~+<0%?rmYomVXghm?0awC z{NBfmf0(&_+F45^Vg^3h%Rg5>9^ZFXS!us=mEGI_c4C*?Ji2F;BBG0%cNmZH_?}g= zc{fj>G|C;G#4*NGJdI;qbct@Bxf9|&Jd1V-p5u9xJG__o;h02iKYA(f0o0~Mnh)aF z5Ff^`3?Jd6Xw$=sd<@4dALl3b(ncxAC-@`^@;tO+xF_Z7Y;~#|+3pyh7@r!<;Kqt^ zz?NO6!XSJR957}1qPB5hKtg^Ox;S7_Y$2Q7Nkemuh7viXf#1S|&qkNIbA4D)%1b?bm2#5=e5_C{VdiCZFK_uE)xF`p^ zeqYuhxFOIEXssJQjtWd1<1uyQ@j+NuvepDH0J8LL>$z9u&?A@P3s;ZJS-1t&ihyadk8Nz#YF=AF z0jjWepdta3x$rwP)a`Gr*RgxF(e=Y0C9s_7G59ZoHk{84{c!SdjM9p(urJ{2jqTB5<>97%LOV>*$ZU&RtV3S1XZ$DJd~UWA7YzC;4u<)?9m z_r|vTGF|8l{~6SMbNEa8?h!lP4)J#R*PG2vU&Zi7;9{e^RSO`3_R6e@hO*YH+*fA3 zysfNFann~;+28b`K-&(GRk#|6x)0|`FhoG-9Qp|Q5nQ`nA3B37)`WQs%%cspR@*7I zsn`w0nw^E1!!^IkQ`tYJsA*iLkD_aK9;e6ZA1F-8h2PfUX7fs7@&*CbbNRZ>7o<$4r(fOO$2!IgL2K|c$+l%-{hInX0RCk zZteCTU2mPH|BsnY@0I_i+4+N;$fNBTJ1TPW1Oz@~sdZzy#x==xl?qil`44YY& z6Sh-!!s)RycEWa2Lw3=&9MhS!d+n%g0WDa@t{RbR`5B9fD&NT$Qk}l#y?o(cbPJcA delta 1571 zcmZux&2Jk;6!)yx>-E=q?bwO!=EF`&+Kos;o3xZb0U?zOjVnYeQA=gzc&25E?RB4> z5D+L5$`MtH=7LZUNC*iFq#k_WfDqz}1P5-cs&YX>T>B5ed$WOpWn253nfEpC{ocO4 zckahk>qaJ%jNtF!CkgOnfH&-_NP|-8*8#wT1CM5#PsJ|(HO}xw!qe}8F+tg7IL|?ga6VA{r zs*DWD62zJhTmWS0Y^uHMaj@j~sf}BcIE(ebYYA}3K6!hu-F8C(6&S=+fWR0)lZ*a1 zL+SqBP6wN-jP8uCrSGvtRg7bY_vc-&A8Or}-|4l*KtM+Rm8leS7+u{7R1B;Ttjjg4 zRy#{ui-78KQX#ufli(b|dD*iXh5z>oE}-T}KC(VyN!iSnYO2ulC=8f4mNl%R_zU@I z*3l`R{A#*#g$DEk_D+PeU7U}hRtG8rU;JcSH1|c{y*qdhd#<9YB*w1aMC+kkwpZBJ z=ykin4lk2?E-XW(ehCHe904^3)(MD%z-ab*qRZhTNfhTvMYh}bu#Hd1QB79d*kqYU z_-6>VNKhqs1_8eS2XZA}8K>xZ)O|gAGyf$sPqNEMvoOcva=B3TisU|x5X8KJ==9-P z5|jvL2&M=M2#y)jKtmTK!}n{)_ji?2nFVY&VEX~{$BADpjvvxR3d7P%Zqh5CaOLSC2ps1lq0fS(JfZht#ZlDH1jDTnW z$^^Cvo?NDO^z8u?A&O6*E;E^~TX{2MO__)#)3WExnyFh+YuTJprgfxbUY1L%^0iWV Zot!5{4a^rhKHqDL7a4`7#_DXA{SErxJ|zGE diff --git a/econ/__pycache__/simulation.cpython-38.pyc b/econ/__pycache__/simulation.cpython-38.pyc index 6345a1fd279b320b2484316ee524c6a53c3832a3..220c4a68c4105f4fffbe61498faec5140f8d8d70 100644 GIT binary patch literal 4949 zcmb7IL2uj073Po>MaiH-8KF&l|?y>0$Y2;o&n}$xqQpLyFk&4QWa%76aj%g8FuB4Q$`$ekHC9 z9N$5oWUGGlXNGiS^@Sm;C#LU8@z7|yudtS}`%0i~i@Y9=27{4|(xU`V?)~TCUT4@- z=wJL&N1+NnS8=4C;yzBIp-PgFrZ4|WC7zAi7zE!>;(ioA;Z zhBUFM?Y#al8jRyk8jXgN2Xzm>dvPa8yzWSQ;b@rZQ5;9Zo|o<^Pe$FY(rTD`VJ8k} zv%Dl#2Z=Z8vdCh!9bRk~fH+#EV?7KBx%tmV$H8?ESJFij8JQ6jt&jqJK!Mic_jZp) zE8KU|YTupKPK_^&$JdWVCZxG#9GjVm=gnh_X7!!SlGc`S$2k1r@K#zsq1kKFz=rKz zO=@TpO>RcA-N@@{6z&Jz@i0vCHLVhr&K`<^a5NsK`MNrYl95zF@mL8}94C4G$;`Ma z$u|!4NRC4SG8m^(oSWgmUt7FP@=BDdL858v7<}Hgb30LSHy8W4h;tErW9Um5`}ark z(?<_S-Sk;Ut4F;keWYNBKn;q{qog$0&cRXc20=88(jXv4Bv;TF!ddxi3KxHyxF+Y9 z%rl=C5)|_v`6TJbW}(G00a#lEFJLt?vo8RuO;CO#cE2(8I%INt*cqs{r9nlbcq2mI zO3_>sM4*Q%O_&V2GnAu& zmnbF6!QHkALht~YU&)!?x#*nHT7Mg#dAC&6o@}hBs$|F@LV$kMFBK%jXBLCKG7GkY zvUip+Gj$Czn&52Ph2dQEeV52UT<~j51?ryBD{pGmi@4nZGo6>@pdYBc1{q<54UId-zp*gHMWp= zojCSbzr>4%UdMY-7~@x3DqV{1wyU`vV>1j#Zttt3M0-#tuO@rrZZ}qX4Ntm(W{%Sb z^x^`^SU~42IF~t^6dw)>I|n2BW*ajSPFr?U)ZzL7>-{B*zHQ!$8&1@0Z{_pq#Sekm<-9 zs%PH)BBzvsi`2B+c9@%tB6}Z$>R&GKOvVQX@e$)WgKQbc!a2oL{T=Krw+X~E$mJC# z_h%TNVMoYq0y{@cT1!sJVsH1r9W2nJ>Ik7nNu^f*xS$tFkpq>#N`HX3mz&y5D&PI>O>}C~= zI+@e2;i=v;kE`k0bS-U6*H01rrJYqXu)ak3Zesq4)P1Aq*S;_ z@?2^ZwTP=`wYlEJY)$OX?eRF0a0;}yI2!5i(HMDByH*6F^$^ysf4E;1n}SC@S4 z>>3@X>;B~h}tqP!==hMR>585h8vVIAZt+|V=06=aM;#6nT;7% zAF_u#%wcQt^U|Pm4%7L7Q1PBc=^it7FY4{7B&D~oA0=TNEK+Y4u*wD47he4bKO|VH ztn%uUPTU!W%HNoEf<0vDkv_`n3(L}}v( z7cFFAn~KnDODMm=?N$OHrEn^hD1#*bLi4rg;>04&7w${Z$EoB*{NAA6ENA?6o{sw_ zG6#6RMJJcv9#>K;s}RG%eVh4P$sF9PoT43Y+kFZ4_8sEr{9RVPY7}f;8LMWHr?DR~ zlMin}zKU-lF1)r*`Th;-ROWML>s}c?lQ+|ef)6!x^uzH^yo4`PFzn;B{73W9 zri@ag&8rYaZEfy+!ciWtY4TEtuiueTnBv%eaQB3krQ@fA!l!ObZZ6sXO@UpeSJWrppygTp>*&z=_3`$+wn&Wv%@eV2YWTz-cq6PTc3>gs<<8Si zJXQ&^+fOh(w@{eo6@G^Ub)D-X#&2bRRLJuF{)9QR{W(VK|Jq-7uMw96Iuh%9G}*%L^n2*}E=7H= z#3@PRd~}~?vNb7JYbyDEhpUL5_62KGI97w%To>Eon%Sfl5p?qI|FCPjMdxQay#_&E z4+8u{XB<<%5d??hPCOf_27w%fL7?gAs;^N)=Q2K^>G!F}WiM6uno1&0Y5G&@-K2&T zUJ6KDdhkvP7o52`Vv*I{aBbIgEBIS;8@TH36}P2H4tdF=b;!3k4;DrtmgpZ-Lm5E- bkQx$y)Aw@sPO-zgHb5TK=%bp|)q5)CxuT z-Zk`7c<@!kJ$MOrBdCLDNl>fmSfr6ok<%YwPY~8sEgZ1}8;L%}Z58+(|1bAeR$V|_k!SzT9 zLcIhTilsgB?lxnnq|wFXi@=8c>D}wrINXtd+WE8x{w-_d%U(!O1!HW`e!g%VwrFYD zU-J307?RjS$%g?gu|${R>svNjy|hW&iLD#m5LTO!W%UOCnELj=P;Re2uVmTR;>#1QqPSe>uATmlMyd72yeE@22RhL1R7Rb z$SyRgamVf91veKGH|$|||8$pPT+gu09#@9^%Kp07HQ4o*9}t_XJp}1T^)R5hi+oDW YW=)*`zw|1+KVPaOV diff --git a/econ/agents/__pycache__/autoproduction.cpython-38.pyc b/econ/agents/__pycache__/autoproduction.cpython-38.pyc index 315daafd736480114a1d960e7e9391997ff9c7f2..944cf38c66b436d71497c3ba12b8df642b169453 100644 GIT binary patch delta 839 zcmZ8fO>fgc5S`gwr%sxL^n;L;f)G8qhqfo^fg7kGAw`0gi$xVh@v3r)?PTp%G;-8K zk>G?>`42SQxp3pk9SLzXS1yP@!Hg4x#I9yEJ8wL*?|DB}f7WU*YPAZ``f%{Q|M{{O zEkB`y1{XbWg@>;68kg@km%X}o?G3p0TTtMZ_rY1Z{PGU(WlwQu1yktS9#B$rjH1t- za(01xYi>ga!&lK+pu?o=hn{|&my(`2(n^Nv@lyijPwz(W7XJ(nAnOospCDuuIHor;dxM+^!+dT99 zAJ#_#|1M@@krhLqQ;@;{JZ!@wINX|GidQ)0_|8i)5fhn8!o@(Qq7BE&G!YOyu@9r> zsKUsVnsNt=uny-vNusHasXU|Bdk0R*FtOb76CK3H=D6&Kr=(wG&hqO<$I*%DYZ9|N zjN(|weiY7lt2ys}6y$iE<7qaP>&+H*hzp%X9UHW(qJb*=D!0!U2x2RkB@`rlGrT}z z;}H|M5>tp<#l7X6@#aLOiaAitIx)5;C1x`yrIrP4NK3mQ;Q@@cMtA3V7)Xz_C{T`N z8}1i1=c7vT=a@VV&sEq9bYAKO(Mgy%3%O-_;gL3rgqd6HxXRpM$Fdk^<}A!et2og^ zSL&gkqi@z2zDdqi{U}cUe+4S>`^OtVoo2#dot~d4FxZ?7~*a;iwfR$yln8YId~A1^&+`MJq#{O$c!?HGf8?zabZFZ zdr%Y>LZb&k*u25w8+i5L1I*bM@Z#C(VbO-FuCDr~=BuxMx!;=ZQ`fBnor{k@$HCg2 zweQm-f&fDZScm}+z4h6h`a2L1s3G`Q)<523&kV7rfSx$;mHCW^?Xndm^H;NzBuew+ zI1Qt><_{)~rtOVQl&H*{eZrQJe1C;DdwDqBg6siVc9&cM69};j=eU7~aCGZATjG)x zjPh*43#v?o_7FlggoPJ!Vj%{lGuERQ`QZ~^Xgg2o#CeotTG_Z3r*DYXOrQ8%djJlU zI4#Y0XUCk0W~*cWY=OW!*dn4AVt*y+X|1C5g@W7?!&4+mAC|m;bGCtOuORM33MQft z437Dt{y%e2WeDlyk`Vk9H;A^&RyCfg#=Ak|iKRo?+N53x2f9!=eOPh02a9KyY5NK5 z5^pNnn0Mg-DnvcBTMz@iLljGqj*_U9qh$6v&HYB{=u!GI(haKVUF%%y>`wGHxsu0e zUdg4c29;R)8b!W*Y;~fBSsu*;9?jztV}0F%y4JP-xvLc{kH^!S6lJym=%FGZ8Ci=Y i?U>)r9@fmR?8}P9ZF3}ho?Vkd;cP1<)t31xAN>V>Xo1ZD diff --git a/econ/agents/__pycache__/base_agent.cpython-38.pyc b/econ/agents/__pycache__/base_agent.cpython-38.pyc index 5e1658ae99ac71ed3cae9020cdc995392067cebb..56c0c052cdc27061f1c2345a212be663d220b5e5 100644 GIT binary patch delta 195 zcmeC+?B(PQ<>lpK0D=v!my$1U@MrlT6ULdcC8%W$@ zPc6tS&QD1#;sXhR34XBTWJYFrUM3(D2AC%6G8Zcf0=b$@MPLJjfoybrJd^h@`^XD` aWI*N@@t~@KSTI?g#asYkAyhDrMG641?;jul delta 212 zcmeC>?BL`L<>lpK0D>9a=aNrv@!aeyQvyVJKPyyKJ pB5n{1p$201WE~cBEp$Pk!do0Rx%nxjIjMFaJBwL>1P3DzBLJ#KA&~$8 diff --git a/econ/agents/__pycache__/base_aquire_agent.cpython-38.pyc b/econ/agents/__pycache__/base_aquire_agent.cpython-38.pyc index ae4ad1d1d05dfe2ae662137d0bddd94c1a0d2a1e..877e7cffdbccf82f3eef63822df1215de1510fb6 100644 GIT binary patch delta 210 zcmZpYn<>W|%FD~e00hkbmy%y@EGS6LODU27TBgZfBm<>_;-%K$`( l0f}3T*^_H{Wkf}QYz7t$_C_turm-B#{r3ShFZoFh7!gahAgIL#%4wr zhFFKmeLN~sK!#W?YYpQ9mKx?P)*99>_;-%K$`(0g1^Id1Zu!fD8r}7DgdPE+FJ# NnuT(Zz*;MnQ-_pgZWwDhx_9JJqa7W+(A= z2Y=`>!H5U<6v~^I^ie#x;$0A7VNZgnNaMkq>_t3z)%QAyqTTe@@29$W?|WbM{`{}= z^{YYP3%YK8^!;FY@~}R?a)CT8Gz`TJ=m7{VwHnHvd`@Uf+aC&T$8ex}N~>2y=p4Q@ z>)z!Jx`V^1=9han!A3>yR}-=V5|x=%Pk?P+RaYLgDU1^glLVhZQHi3#u%9GRgf54x z40ZFJdTs9=GBdGB&k^L}UNKgg(y%3PND-Nfu|;o1E3C|F3ChW)$gEtA?abC30^uCR({%#YSZ8}Ff- zjAK6wEpyqvP@N{Xu+ojeR$=z-HK$3wQ0BJ1ZrWDGACaeF3|gAD)A5dr&A~k5boQtd ziJPf&$O=82;y{Cei7Y0s$7z&qr~P4+?C$Ig z-^CW^xX8l6{zz}%C|rJTjMC6SuD0i1i<30ksOZ9C3(uQd&f>yZN+p~ZVA0(GAEv=0 z%ORXLe>m?$(`>ubOFXtvm0RI?vT>229NoY3TcFsA`NDk)9P_)|hCfZsn`!?-jfqW_ zK}(EfIX1RvsO#d5ug%k5d+vkNC=JLu8IP9{Ex9yrd*|Sm`P6&fp#V+P{N{arkyVBd zF_ct2%obDC4Ff#G&VLERrunw=NQX%(YJ>i05D%km)G?lrbKKFgY4}TU$vo-L&eW*= z8c2F3p`q%fSA+MK%{T6x`Pg52{1WX&Rf`O4K_cY7pea^`5^E>%7D<3a`>5vbY26x~ zCKj0a$^T@ooNhOi<;=>1@ejFXzk0TQg|<%|0^!U+o#wD$?o=mUmK-^`ILi-nk-SNe zic>uu08zVMk}We?lFb8Pi_Q$?8gy3F5uFed)>ig1$XR%@TT)7*|37=QIX=d4A47+M zx$FhIJG!67QHp&XCm2wyurW^JQ`O-EytdTKGF!|V@;?V>8IF}xVRMz>b@Ou#soNKV z`(f3Lg7)QdRrzbMC|`EULL`BzX2qNG0?(;0cs_DAw0cw5`bix1-`d?kdR>o4DKcZo QzcsYX55c0xD|xto1Bz4qH2?qr delta 1253 zcmZWpO^6&t6n?L&tEZ=XW|EoAPMpc?I<7x#2Y<3L=)n+JT{K<>lOW=N4xOo1_9r{D z)xEGnPd2cg6c3?1%Qh$;1VM81mYX2xRR#i{guM#lF}~N6EQ;0C*YCZmdi~z_Uf1v4 zJKfs5)v6CP_VZsxU!S^L>#p@k)1Yx1Zs7nC-U2PO{1mi|@lXzgc5XnZj*+&7IIF)N zCGl`=cW=Yc>*IJQ9o?-rfB52aRL2i#+*=f76vtp!h``oho|fV z`QE{2WXNEXKD;GNgCxvg$QF^ok<8&NOl2mu*aCB#EKUwnhu(_MWKJ7s4Vxt8a;h?= zVM`<*(z>ffrgDL>(<7~v1Cq}pk4}|yN{(bdb2R1`XbUL;Z_q#)%D!|6 z%D1BZ;lyl=V$-tsomKm{^Coue6}1warS+MUZj81Dc2`~YpCBF3M^D&$YW)o7{07bB z9RiJ0)M$OTcd#ib5{@1=RVLfe1dcxAEL)kHicC&%x0N9UB>MAMT+<*Q<_rV7omJ9t z8f_1gy~$+z6VqWkM;p3^gBp}>#z{Kd&@+bx^9&ymqy0g7GEVIuZl|+MmV|u*I`lLs z>K1w=xpt{^du@RaxY1-1@93E~Haa%s&D6;p%Hk7+PxCApOz8vymX-)!un$UCP}#1x z_{yK8>!PqJrc~HXd5DL&4j=qBB`cAEZJ?xyl0u?_)7p=A>@BwMJhmQ{sL1oud0OUZ zzxAHR@9odtRYxmQ+vV?8xo9S2C~A0~C2rV$ST!wH{!5`*uz!_b>M?b*$|%|y#oNOo z(MKH46I`+D{&{@aj{VL86&5QfXr9J~tQDGXzw)mxcgYEb3K=S(x^gnqm#>0^%al6T z(e{EbTm4WJRVsdj6CUla!BfFC@{kAuaP7n3`D+~bKAjA6RAJ+r^w?D0-u4i%S3k-nSR4hJOBUs>^uE{#0FjyVzB1;Pi?V u`I?|sl+Ci&@B+`REqR{dm3}A(^_zV6MDx2R;=9K%ZARLQwdY(GE8-vNx%;I6 diff --git a/econ/agents/__pycache__/price_believe_distribute.cpython-38.pyc b/econ/agents/__pycache__/price_believe_distribute.cpython-38.pyc index 7dc00d92d1603ddd68a88978ea7c54b15708b43e..c4033b7ed1e99ab0d84269bda6fa5a8b0e6e2713 100644 GIT binary patch delta 1457 zcmZ`(O>7%Q6rMLTyF30(NaLtUlg7m%ilxepL{f@q`4N#os5Mjw2_k|?Jxg)o*k*Q% zO0*UNN99~iZ>W-ethm4p38_7ELx|JDi4#3>;|lMMi5m{AHJ|6r+kN}q_r14&Ed01w ze5X*zGQ7UN^Kfe2< z>_4Ue_3wJq0Pou`pz@ODM=X}Hm#{s500Y=!14vjS(BgkQN=x)-G{cZy-Tne=Gn!fc zi9{QW!0->)1Dod`Le3uWt9Zluh6(U^3~I7-XE`$S2(%&}!Dk$QM%W+tg=Np|c5a5L zXonr+p))P?Osg3-ZiMYt_-SY};$`sc8={Oa+ZXfx0xZDcn!TPc+xuL#o0QJ+MZqb? ztGJ>qgoF**i1kGxH0(=r32i_d%Nuf}LnLyZC5R)@M|y@bk%>3rK+kz2hHMiByzXkQ z`t}w1tY=PPTpPv9N~b2-cJLMrebC&ldu25gn4TPgeb+00j=6KQ7yH9N^BASu;{(v*G#l|gB!C&p z`s2Uxa%mdCNL6K?!ap-Z;8>l$8ODvc8}GIo(XC#u{h6639~G1OD1q)Cqyhc6I&t;i z%7PnV6gOI%I+e6D6}p)>Z>O1FHx4^-YqxzucBk_a-a>(+Is2zq@)gX%Va-*$>JLg3 zz^o8F>6V;*=wAij=7Ob*f1yiLZ?YI-C(yWGcYeb{NiLXYeL9zJhq7+5orm^=VCl@4 z$EU*p<-|cj2~~nLjkvuRRN!0teek-E2dJ-=>YMY_H>O5FgqaHjs|fXK!Ia22L7@Fr z9j&?K&!Z>JG;cS$Mu#RcG_5Ig|5MLbnMx@S3WeslreQ`Dot3wbGS^_k7P4o~Vz!KG zKxvs-r<%#WjN^@R3R}zGyXMraSGm*3P$N}^>$tHF>Y%GzAGJbr^4*m8Cc>Mz+^8}C zG!!QiG%s1I>ch|y~9BzbsXW(h74TqJnT{+?Ue7bg;)?TVYmjRGlVmCCAu@{1LfHRP>IyI5G> cps%d6PmnozbE+;Q*SFf?i_|F*Jx22W0|s~+=l}o! delta 1218 zcmY*X&5ImG6t7oR-BZ&$Jv*6fLS{e6Boj8qw{r)QfKSz%!yR$&=HyeX`->V~i?hM`)PR=+JGZ~Iacy4!mu zw(%c0jbA`(F%uoVb29Z(KNJ1Z5QeZMhCmr(HDTEbzT1BIFD-lob6+ZBz89`UB_n)J zz6%xnRGyI!1)fsJ4u%`9*Nr<@<3TTeKh8aOW$nEPbuc`?F{;nFn z50kJthu_G#kGenyo-RJ@k-bKiTp%EF)ZmJAb@G@V?c9_ju>~1exuV@06f24)eTjHq zWRS^`+ENsIR%U7>f$#Vu0VEbRrP|J?e|8mus8n-%=(}8A?X7i+Ch$9b9PjCtuibvi z;J7#2WZiR}_PQ(MuM9fL^^J|ehpxf<%q{W@B6;a*oTQze%{4pj5U%+%v&_uR z5KNIJ{D%TG{pv(-KN#|S*jyl?n|RkB?mI+zcbI`6at8ujEu8@mZ~>e7gj*yy zOO{9i;Xje{@3Hao+|tv&C-MQ^B6f)RMSd-_n_+ z@zuCoSy&kHl+u*2YSGwkfoQ``FdS!ik>Mr$sdD6)_pA@c+PRk*ST#4vP`q|AD<>$t zh_x_-7Je2U@VPm60&j(f=ZiekFIwOsr}jeM+ diff --git a/econ/agents/autoproduction.py b/econ/agents/autoproduction.py index 0951469..49f3f90 100644 --- a/econ/agents/autoproduction.py +++ b/econ/agents/autoproduction.py @@ -12,29 +12,33 @@ class AutoProductionAgent(BaseAgent): self.worker=worker self.employment_rate=employment_rate self.employment_index=worker + self.target=0 def set_worker(self,workers): if workers>1: self.worker=workers else: self.worker=1 - + def set_target(self,qty): + self.target=qty def can_produce(self): # If can produce item - for k,cost in self.prod["craft"].items(): - if cost > self.business.inventory[k]: - return False + for com in self.prod["prod"]: + for k,v in com.items(): + if v > self.business.inventory[k]: + return False + # check if we should produce + if self.business.resource_in_possesion()>self.target: + return False return True def tick(self,step,epi): for i in range(self.worker): if not self.can_produce(): - self.employment_index-=self.employment_rate continue - self.employment_index+=self.employment_rate - self.set_worker(int(self.employment_index)) # remove cost from inventory - for k,cost in self.prod["craft"].items(): - self.business.inventory[k]-=cost + for com in self.prod["prod"]: + for k,cost in com.items(): + self.business.inventory[k]-=cost # add commodity self.business.inventory[self.prod['name']]+=self.prod["amount"] diff --git a/econ/agents/base_agent.py b/econ/agents/base_agent.py index 117c352..b0f4c3b 100644 --- a/econ/agents/base_agent.py +++ b/econ/agents/base_agent.py @@ -18,7 +18,7 @@ class BaseAgent(ABC): assert "No Tick method has been provided" pass - def reset(self): + def reset(self,episode): """ Resets agent to new episode. """ diff --git a/econ/agents/base_aquire_agent.py b/econ/agents/base_aquire_agent.py index 47ce169..113c4c0 100644 --- a/econ/agents/base_aquire_agent.py +++ b/econ/agents/base_aquire_agent.py @@ -92,8 +92,9 @@ class Base_Aquire_Agent(BaseAgent,ABC): cx=self.exchanges[cx_id] orders=self.orders[cx_id] if len(orders)>0: - for o in orders: - trades.append(cx.order_trades_map[o.order_id]) + for k,o in orders.items(): + if k in cx.order_trades_map: + trades.append(cx.order_trades_map[k]) self.trades=trades return trades diff --git a/econ/agents/price_believe_aquire.py b/econ/agents/price_believe_aquire.py index 7411e9f..64532a0 100644 --- a/econ/agents/price_believe_aquire.py +++ b/econ/agents/price_believe_aquire.py @@ -1,5 +1,5 @@ from .base_aquire_agent import Base_Aquire_Agent - +import random class Price_Believe_Aquire_Agent(Base_Aquire_Agent): """ Aquire agent with internal price believe system. @@ -8,14 +8,13 @@ class Price_Believe_Aquire_Agent(Base_Aquire_Agent): super().__init__(simulation, business, resource, exchanges) self.lr=lr self.max_price_adj_rate=max_price_adj_rate - self.price_believe={i: -1 for i in range(len(self.exchanges))} + self.price_believe={i: 0 for i in range(len(self.exchanges))} self.open_orders={i: [] for i in range(len(self.exchanges))} self.open_qty=0 def tick(self,tick,episode): - if self.price_believe==-1: - self.price_believe=self.max_price + order_error=self.open_qty+self.target_error() if order_error<0: @@ -23,7 +22,7 @@ class Price_Believe_Aquire_Agent(Base_Aquire_Agent): cx_id=self.select_best_cx() order=self.order_resource(self.price_believe[cx_id],order_error*-1,cx_id) if not order==None: - self.register_order(0,order) + self.register_order(cx_id,order) else: # order failed due to missing balance.. we need to adjust our price believe self.collect_balance_from_cxs() @@ -32,14 +31,16 @@ class Price_Believe_Aquire_Agent(Base_Aquire_Agent): self.tick_open_orders() def select_best_cx(self): - best_id=0 + best_id=-1 best=0 for cx_id in range(len(self.exchanges)): cx=self.exchanges[cx_id] - potential=cx.total_supply[self.resource]*self.price_believe[cx_id] + potential=cx.get_total_supply(self.resource)*self.price_believe[cx_id] if potential0: # aquire based on current price belive cx_id=self.select_best_cx() - order=self.distribute_resource(self.price_believe,order_error,cx_id) - self.register_order(0,order) + order=self.distribute_resource(self.price_believe[cx_id],order_error,cx_id) + self.register_order(cx_id,order) self.tick_open_orders() def select_best_cx(self): - best_id=0 + best_id=-1 best=0 for cx_id in range(len(self.exchanges)): cx=self.exchanges[cx_id] - potential=cx.total_supply[self.resource]*self.price_believe[cx_id] + potential=cx.get_total_supply(self.resource)*self.price_believe[cx_id] if potential>best: best=potential best_id=cx_id + if best_id==-1: + best_id=random.randint(0,len(self.exchanges)-1) return best_id def register_order(self,cx_id,order): @@ -56,7 +56,7 @@ class Price_Believe_Distribiute_Agent(Base_Distribution_Agent): if o.leaves_qty==0: #order is done self.open_orders[cx_id].remove(i) # remove order from open - self.update_believe(1) # update price believe + self.update_believe(cx_id,1) # update price believe self.collect_balance_from_cxs() self.collect_resource_from_cxs(self.resource) continue @@ -68,7 +68,7 @@ class Price_Believe_Distribiute_Agent(Base_Distribution_Agent): cx.cancel_order(i["id"]) self.collect_balance_from_cxs() self.collect_resource_from_cxs(self.resource) - self.update_believe(-1) + self.update_believe(cx_id,-1) self.open_orders[cx_id].remove(i) @@ -83,8 +83,10 @@ class Price_Believe_Distribiute_Agent(Base_Distribution_Agent): If negative will sub lr to believe """ self.price_believe[cx_id]+=modifier*self.lr + if self.price_believe[cx_id]<0: + self.price_believe[cx_id]=0 - def reset(self): + def reset(self,episode): # Clean shop for today for cx_id in range(len(self.exchanges)): cx=self.exchanges[cx_id] @@ -96,4 +98,4 @@ class Price_Believe_Distribiute_Agent(Base_Distribution_Agent): # book keeping self.update_trades() - return super().reset() \ No newline at end of file + return super().reset(episode) \ No newline at end of file diff --git a/econ/business/Price_Believe_Business.py b/econ/business/Price_Believe_Business.py index 0f649fc..844f56b 100644 --- a/econ/business/Price_Believe_Business.py +++ b/econ/business/Price_Believe_Business.py @@ -6,20 +6,26 @@ class Price_Believe_Business(Business): def __init__(self, id, production, balance,exchange,simulation) -> None: super().__init__(id, production, balance) - self.distribute=Price_Believe_Distribiute_Agent(simulation,self,production["name"],exchange,0.1,50) + self.distribute=Price_Believe_Distribiute_Agent(simulation,self,production["name"],exchange,0.5,10) self.craft=AutoProductionAgent(simulation,self) self.aquire={} - for k,v in production["craft"].items(): - a=Price_Believe_Aquire_Agent(simulation,self,k,exchange,1,50) - a.set_target(v*2) - a.set_price_max(10) - self.aquire[k]=a + for l in production["prod"]: + for k,v in l.items(): + a=Price_Believe_Aquire_Agent(simulation,self,k,exchange,1,10) + a.set_target(v*2) + a.set_price_max(10) + self.aquire[k]=a self.distribute.set_price_min(10) self.distribute.set_target(0) - def step_business_decisions(self): - for k,v in self.production["craft"].items(): + def tick_business_decisions(self,step): + for comp in self.production["prod"]: + for k,v in comp.items(): modifier=self.craft.worker+1 self.aquire[k].set_target(v*modifier) + max_amount=self.production["amount"]*5 + self.craft.set_target(max_amount) + def resource_in_possesion(self): + return self.distribute.open_qty+self.inventory[self.production["name"]] diff --git a/econ/business/__pycache__/Price_Believe_Business.cpython-38.pyc b/econ/business/__pycache__/Price_Believe_Business.cpython-38.pyc index f64966f9af76be003ca5ebf2bcb2f6055807dfe1..a70e8aeb165982a9ea26d7437743d0c44e1df530 100644 GIT binary patch delta 845 zcmZ`%J8#rL5Z<-d&r2>xxZGWW5C|!N1qGpiCQ>AlisBkXV-lIe>mXlZ`)=0<1g&*N zkSI~)KX8!{1ri+@_&MA# zj+)=;?W3QoZEkV<74ePNgc09-Ks=}FlmY9MTeR221P4S1k?+eP-JEWbo%@BU%$ape zKwsb13ahYlTN#QdOEGS6{m?8N<;)yqbF)p3DJAgba{W|OWN0dDos9eAd!XyH#+e6o zhg%rM2~=YDE0zwD=qdai&ex3-mn;xcv60BQpkNYuc~@JrDkBtw-Mmb+4eFL3G;hIo zWt>d*2YH;O72PktX^*ZnA;AQZJpe*mT93|A6Qo5KX_LCNS?=hoQw_am$ATMEHbLZL z0H~L6x{RIQDKw?cXwAZPU_mb!c(tL}csGuO?BPjzOg|P$@Eg__zQBd^n1D$W-_Ax+ z8jSM;--**_QJQDspr*m2b*tji8if5-|B{GgHW6VI#Az_fq>Qloix4F1!P1vEVY|EC he};Kh`G&1Fa8blnglpv|cFV;Lu<7E0ZI?gT$6rZCyIueQ delta 559 zcmZ`#J#Q015Z&3^-TSb85MwzX6j(@>ax_3{ODT+~P#Q#&fFk3)pbOYeb{$c$rxYnt zM_VP;rQsJKB!q;-AE2VTAAppGh8l?(2TDeIPj6>uZ{EA_t@n-eS*w*Wtox_m#v9@+ z{R#KZe)pTFOt5YFlx1Pv^U)AZ+Cg43Deul09NC2G4n^%5WYz>6lYa zXsLq}RYoqVVi#)FVV3|5Pl*n%m1FzLsR28Dj4G%afBU3k9np+txIf;i#dI{uUtOG2 zecHU*!0ojho6+9fGyo5V{9Gk|$RA46K<(f0O^E$xo;B;l7L%hlqj@o#`d@sfcLVPg z!gi4u+~h0J1O**vLkbBr{Xx(_rmy}hfkGmN2s=PRyG+9>t6&j*9iv0ZvCH=Z&6imj zpcalMq~k8Qj((Uf;sjd@hlVy}%8&`uCL-V4>g~+D&drWlqSh^>OqdSoHKN-{bu^jj zVz0=JxkJ4L_2^>R&hvxamq)gk=GN}&d|X&eZRx$G$PBue?~7Pl{m*2k{72bW^oz`0 Q|3f~AD0~F%)c4efKPixT_W%F@ diff --git a/econ/business/__pycache__/base_business.cpython-38.pyc b/econ/business/__pycache__/base_business.cpython-38.pyc index d0992022f12693e25218bf2a294127e7e31afda3..dd9ea43801e6f07fafe4d6140f68809a91878592 100644 GIT binary patch literal 1833 zcma)6&2Aev5GHq5tFskI zG^%`Q{T9u^Ir?>SWRE@d6>{p#YFD;nw<-b7&X6;lZ~pejR;xi^{W*G<{81z1FBC4X z0E8#74Fe*Gpcxs{KBeRt5uWf*iSQ-;-S2xMI3S(c-=IZ0)cH^M_7mhUFCT;_uuT_; zBz-Cf*iqrVp~4rzY0&pYO@ybUABeh$;9C=Gq5j=VF@JG*@g(q>1fx*{=<@VySp6yKM8B z9B)2YsT_~`P1O`-IV=m-hUgrk|GFC2Y&PV^m+-#-%F!9jj#U&UGuj#4|2 zNv^mYFPOowY{|heHj-D;_T;sTI8Rk-ImZDocY%;wAq{CnL$6Jn^ds7)vpZEwZ&%uh zhnnR=9?gq}ZUZwXXVBDdDTS$onV>ic_idWISi0syCaHm@H0PdffeD0Z<)jE^K@f@y z&}aiVQ~0B^))EQcTtk6*FHkgr5!6JM{05T@7`)!>fy!AGI;;G%v9zOHuu*K-P)fxT zEn_RiId$!)#z?4huD;Vc*Loe^`~aZ-7|uS2ZHfVhtj*XJgf|3y4fHZ~_z+AnIfH3` z?qT{Mk$#y-{JD7VA1^y?Kh83Cm}{n`k+$eYl!6hu*R-s||zkB5myh2rF< RCtS3<0P+pyt_Y<`{{c|Co6-OP delta 493 zcmZ`#%}N6?5Y8m~*Q%>61@$I9xga8V)QehAVnIX%QNngNV*J_GWL2zNJbCm``T~0N zEO_!6e1JTSlU4K}PMD9$eBb;eFX4M7+?$xF612wMM{>f3;R!T{H%%9IN#qaTnmZnH z4*CYVZXpy<5Kan;2n9o=1x;a=q*Pjl;f>9bC+C^8$Wi@}4xE9TqWY8-&MLWFcwK=9 z*mDyVALs4JHB_di+Ed;1D#>LxGkzyNkF!J^RAhE7vb?KqjVp6;p(D>YTAUv%AJ39ue8jB){C6WOy-;?U{&7+qa|niJ^~Z2 zX)To9VpFNEia?E_MA?pCFo}_w*172M&UZ_mibQHG(bGt3`&9%2=+FJk{6~&Y4>-@_ y3&FXm^3kI=vpkdpW;!?pZNs0j&qOz diff --git a/econ/business/base_business.py b/econ/business/base_business.py index d7f2e9c..8b4ff5d 100644 --- a/econ/business/base_business.py +++ b/econ/business/base_business.py @@ -13,14 +13,33 @@ class Business(ABC): """ self.id=id self.production=production + self.balance_history=[balance] self.balance=balance #Setup Inventory self.inventory={production["name"]: 0} - for k,v in production["craft"].items(): - self.inventory[k]=0 + for l in production["prod"]: + for k,v in l.items(): + self.inventory[k]=0 pass - - def step_business_decisions(self): + + def tick(self,step): + self.tick_business_decisions(step) + + def tick_business_decisions(self,step): assert "no business decision method has been created" pass - \ No newline at end of file + + def tick_episode(self,episode_count): + """ + Call for resetting for the next episode + """ + self.balance_history.append(self.balance) + self.tick_business_episode(episode_count) + + + def tick_business_episode(self,episode_count): + """ + Call for resetting for the next episode + """ + assert "no business episode tick method has been created" + diff --git a/econ/cells/__pycache__/cell.cpython-38.pyc b/econ/cells/__pycache__/cell.cpython-38.pyc index 7fd1dfe9c74832fe7fbdc8ceaca7b579febc2940..12efeb251241424dc0136a4518701f8adb32506b 100644 GIT binary patch delta 1406 zcmZux&u`pB6rQm?w%7Y3O_LPTgrrRa)hg;9D#VWvfz&2&Sw*604_HOU@k|nLz4q?d z3k~vWk;p%=^0kKz{{!LxCvIFSAt4TiKLAb~xNz)y_Ogkp&dQ(1?|n1#-uK?@kM%zn z8jtFAi@@0X_*d@_Yus3+yW_2u7FW3zXkBJANg~5$yl$*SArr9R9 z4oI^)K3Q-4jk`2yt{wPXc;oqH`gr_Zd#S>$Gh)y2DzCx&3Ri$%AOHKCBDL%n`p#RM zl#rBhx=4mBr73YpssPed1yoWEP)%8OQ@KU=vpr>R>seY$*&<0vM^CFeq<>V-7+EHz z=Ut)_wD%uo-zy)zuY*-9_-4U>4t$tR`QVxIpZ9;_1cFod{l8Q~AiO*318Qd9sH-bg zNG+#Nb9yQpFqLx%^9T#s59%6S%YIk4uU!X2{2lp*qw+0rap$?P#gGOon=@a|*eF215h*Y@!1iTuF^{ zmEvA(Vxk2UWFjQdl@mMn=cHq`$H+HQ2OSDfMJhKuB@{OmYL^ z76Pg&HxUXkwS&EOyQ!j@#J1u=uNR!6T=F(jUXtbYGQ}zDDEdG;Q~7s+9b;;xG@!{F zmo%9znDLwQ*%w;tNfAs9PpTtaT!Jh3c@?3&4lv8-9LEjAC~*@%3S-BSH_*R@&_cKf zc2-EKg9HDE;??XQZKc}SFwMdyE7?5z`Aw8d8VIwab9U&)zGt&z>BezWk$UzYyK(Jp zAVJ$eoiClUp0)H1+Ri@J7e?Da*q=%-@miLhjXj><4*cVjr0XW$i60(Aqxzv}y~0+M kq>OI~cfdU_9XCrWH+Q-b9|Yn+apl6{skG**DwDjafa~1yp-)w`#9rnYU_rCMy%gmfFomOkltJN~l_vh!g z=(97aHSzAGwfyKYNG`<*Nb!#OBDSRU0i`XS6XDy^-3PBUWwgq}+}%BjUWCJLOmR6% z27^TQ#>Z(iS#03m% z+iktiDw$P>3|`vVrEM4;TtpT$;G%K|IGFtCss6zp-eZ&%h2AanXQZcSrl-nGe>VCe zft>M9?-vJ9miGBGbo3|QY?}kg@hHb*Ri#kX3@#g7F%>=zyE#gq%XpCEVUBNn{x(q` zL9J*m+VuvB(k%j@JsV}cFWSso&^yjeVcP3g&h?!|3g-GQ1VK0)CgX72ONMC>s5Mhx z`5&uhDhMU|(`)+NS$2xKay4_mZd#^p8~n4LTL)p~8E~2>K zpW9l4%<44sEjB2i3VcuBI-EDdp Sulw->x_n5D!3tKK+O5Bn(S=X| diff --git a/econ/cells/cell.py b/econ/cells/cell.py index 77b56e8..1a7d61c 100644 --- a/econ/cells/cell.py +++ b/econ/cells/cell.py @@ -1,5 +1,6 @@ from ..exchange import Exchange from ..commoditys import commoditys as cm +from lightmatchingengine.lightmatchingengine import Side @@ -23,11 +24,12 @@ class Cell: exchange: None def __init__(self,name,x,y,area,pop,demand,world) -> None: + pop=pop*1000 self.name=name self.loc_x=x self.loc_y=y self.area=area - self.pop=pop*1000 + self.pop=pop self.demand_tags=demand self.demand={} self.world_tags=world @@ -55,6 +57,21 @@ class Cell: else: self.world[k]+=v*area + def setup_demand_for_step(self,episode_length): + pop_per_step=self.pop/episode_length + for demand_key,value in self.demand.items(): + qty=value/episode_length + comm=cm.commoditys[demand_key] + max_price=comm["max_world_price"]*qty + self.exchange.add_to_account(self.name,"balance",max_price) + self.exchange.submit_order(self.name,demand_key,qty,comm["max_world_price"],Side.BUY) + def setup_supply_for_episode(self): + self.exchange.reset() + for supply_key,value in self.world.items(): + self.exchange.add_to_account(self.name,supply_key,value) + self.exchange.submit_order(self.name,supply_key,value,0,Side.SELL) + + def create_cells_from_world_cells(cells) -> list: """ diff --git a/econ/commoditys/__pycache__/commoditys.cpython-38.pyc b/econ/commoditys/__pycache__/commoditys.cpython-38.pyc index f3b3e4297e9d7467e0c1bcea37b70871e84ac315..8190b48eaba0aa2ac35ba250570727c6e0a4d6dd 100644 GIT binary patch delta 530 zcmY+9OH1oe5XWbdv^~Zo*0k0eAK*qL>cWLDFo=k2!Fv&$ZerM+JpZ}TjC?2}3b<@;=R{8bM{-lVkp@C(p zBuFen@%_Xic4{SBD%d3`3W_e7lB(3Mv8YEohtlv>RuXXp@BAqfmzg1pw9{yeT9#1pS6A;!(sF@ r3XC6&LB=p+gfYtCe&79$aVnpMcS3`e4;Fd+dY&M1^q^2R{JQ@GJ8y0S delta 474 zcmY+9u}{K46vp3cOM4VrfuPc)i$*l)syIlT7>omn8l!2%L^)y%2&L4;lrZSv2wzZ;%GvgjHA1&?;z25m+yD?-n;MR-AnY1nTLj<1Fg}=Yvn=fn|3}=5eJTSaHc0Z zcnOX~l1U0FLQ+W@k8qhQcj&NweKplU03QYzzz~bj!}3Z0X$v#`&rN&}ZCt}qxPvR* z`#|Bc1zfL5J@if~idayDvfEJum1`FGMopuNenGcsrto{SU| None: + self.reset() + pass + + def reset(self): self.account={} self.escrow={} self.lme=LightMatchingEngine() @@ -21,8 +25,7 @@ class Exchange(): self.demand={} self.total_supply={} self.supply={} - pass - + def add_to_account(self,account_id,resource,amount): """ Adds resources to account escrow @@ -237,4 +240,13 @@ class Exchange(): if account_id in self.account: if resource in self.account[account_id]: return self.account[account_id][resource] + return 0 + + def get_total_demand(self,resource): + if resource in self.total_demand: + return self.total_demand[resource] + return 0 + def get_total_supply(self,resource): + if resource in self.total_supply: + return self.total_supply[resource] return 0 \ No newline at end of file diff --git a/econ/simulation.py b/econ/simulation.py index 895d9c4..2a421e5 100644 --- a/econ/simulation.py +++ b/econ/simulation.py @@ -1,4 +1,8 @@ import random +from .commoditys import commoditys as cm +from .exchange import Exchange +from .business import Price_Believe_Business +import uuid class Simulation(): """ Class for controlling the different calculation steps of the Simulation. @@ -8,8 +12,22 @@ class Simulation(): self.reset_funcs={} self.tick_count=0 self.episode_count=0 + self.cells={} + self.businesses=[] + self.production_util={} + for k in cm.productions.items(): + l=k[1] + for i in l: + self.production_util[i["id"]]=0 + self.cx=Exchange() pass + def set_cells(self,cells): + for c in cells: + self.cells[c.name]=c + + def set_businesses(self,bus): + self.businesses=bus def seed(self,a): """ Sets the random seed @@ -19,8 +37,8 @@ class Simulation(): self.tick_funcs[id]=tickfunc self.reset_funcs[id]=resetfunc - - def tick_random_order(self): + + def tick_agents_random_order(self): """ Ticks all agents in a Random Order """ @@ -29,6 +47,18 @@ class Simulation(): for k in keys: fun=self.tick_funcs[k] fun(self.tick_count,self.episode_count) + + + def tick(self,episode_length): + """ + Executes a tick of the simulation + """ + self.tick_agents_random_order() + for cell_id,c in self.cells.items(): + c.setup_demand_for_step(episode_length) + for b in self.businesses: + b.tick(self.tick_count) + self.tick_count+=1 def reset(self): @@ -37,5 +67,83 @@ class Simulation(): """ for k,v in self.reset_funcs.items(): v(self.episode_count) + for cell_id,cell in self.cells.items(): + cell.setup_supply_for_episode() self.tick_count=0 - self.episode_count+=1 \ No newline at end of file + self.episode_count+=1 + + def get_underutelized_prods(self,threshold): + """ + Returns all productions that fall under the given threshold + """ + under=[] + for k,v in self.production_util.items(): + if v0: + # we need to create more businesses + selected_prod=random.choice(under_prods) + else: + selected_prod=self.get_max_profit_prod() + + + prod=cm.productions_id_map[selected_prod] + # Now select cell to place business + cells=self.select_business_cell(prod) + cell_id=random.choice(cells) + cell=self.cells[cell_id] + cxs=[cell.exchange,self.cx] + business=Price_Believe_Business.Price_Believe_Business(uuid.uuid4(),prod,1000,cxs,self) + self.businesses.append(business) + self.production_util[selected_prod]+=1 + return business + + def get_max_profit_prod(self): + """ + Returns the prod with the highest profit in last episode + """ + profit=self.businesses[0].balance-self.businesses[0].balance_history[-1] + prod=self.businesses[0].production + + for b in self.businesses: + diff=b.balance-b.balance_history[-1] + if diff>profit: + profit=diff + prod=b.production + return prod + + + + def select_business_cell(self,prod): + """ + Calculate score for placement. Return cell with best score. + """ + cell_score={self.cells[k].name: 0 for k in self.cells} + + + for id,cell in self.cells.items(): + cx=cell.exchange + # Best prod resource availability + # Using the exchange in that cell, lookup supply or demand of resources. Supply +1 / Demand -1 + for prod_item in prod["prod"]: + key=list(prod_item.keys())[0] + val=prod_item[key] + a=cx.get_total_supply(key) + cell_score[cell.name]+=(cx.get_total_supply(key)/val) + cell_score[cell.name]-=(cx.get_total_demand(key)/val) + # If demand for prod item in cell then score +1/ score -1 if supply is already there + a=cx.get_total_demand(prod["name"]) + cell_score[cell.name]+=cx.get_total_demand(prod["name"]) + cell_score[cell.name]-=cx.get_total_supply(prod["name"]) + max_keys = [key for key, value in cell_score.items() if value == max(cell_score.values())] + return max_keys \ No newline at end of file diff --git a/main.py b/main.py index a5b26f2..d8a7982 100644 --- a/main.py +++ b/main.py @@ -28,14 +28,13 @@ cx.submit_order(w,"Wood",0,1000,Side.BUY) cx.submit_order(2,"Gem",1,10,Side.SELL) sim=Simulation() -bus=Price_Believe_Business(1,{ - 'name': 'Wood', - 'amount': 1, - 'craft': { - 'Raw_Wood': 1, - } - },50,cxs,sim) - -for i in range(100): - sim.tick_random_order() +sim.set_cells(cells) +sim.reset() +sim.tick(1) +# create info +while len(sim.get_underutelized_prods(1))>0: + sim.create_bussiness() +sim.reset() +for i in range(1000): + sim.tick(1000) print("help") \ No newline at end of file