From be701c2fe969a59770c9729d50c3d952cbacbb13 Mon Sep 17 00:00:00 2001 From: Cricial <2911646453@qq.com> Date: Sat, 24 Aug 2024 19:30:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9=E5=BE=88=E5=A4=9A=E5=9C=B0?= =?UTF-8?q?=E6=96=B9=EF=BC=8C=E4=BD=86=E6=98=AF=E8=BF=98=E6=98=AF=E6=9C=89?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/computation.cpython-38.pyc | Bin 1385 -> 1420 bytes __pycache__/firm.cpython-38.pyc | Bin 0 -> 7235 bytes __pycache__/model.cpython-38.pyc | Bin 9493 -> 9561 bytes __pycache__/product.cpython-38.pyc | Bin 0 -> 1432 bytes computation.py | 6 +++++- firm.py | 9 +++++---- main.py | 4 ++-- model.py | 27 +++++++++++++++---------- product.py | 3 +-- 9 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 __pycache__/firm.cpython-38.pyc create mode 100644 __pycache__/product.cpython-38.pyc diff --git a/__pycache__/computation.cpython-38.pyc b/__pycache__/computation.cpython-38.pyc index 270b41bf4f517643839ea4cde0c9f3c5c0ade5da..edfb8012a9649fe4963ae8160cf60f030f7ed41f 100644 GIT binary patch delta 473 zcmYjMyGq1B6wOU0o7vsO2dMbK7gozEXfHlc5J5o@Ez*SDolzF^SZ=b&YGI+JO_)xs z1#7>;Uzk6z^9KayrqL)v?#o~iF3Wa%Q&@t}i?IJa87yj$bm>F6{QGA>`b;FdoJ;HiCB7Dn-ryL(SKsyuXf^4~&G?4Lz<_RSi+-=@WyxS?MeR9fWCA delta 440 zcmZvWze>YU6vlIM^RG!$r4+H%(t<9bDvl1d4jn{s5JZ$9l$d*!z)eza69mCYadI%+ zm$0Mg>I3)+c>@=p!F%K2;u*f-eBb$f=gIl9-BZ`K6*2hv^Xj5-yKq?iXhMGgf+Ju( diff --git a/__pycache__/firm.cpython-38.pyc b/__pycache__/firm.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b98ae6a0d2555fd898d73d39a3171646a1e5a258 GIT binary patch literal 7235 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 delta 3689 zcma)9U2Ggz6`ngYJ3F&~w%2y-P5hJC!DM6N#7Rh#)C~=F64zBXC2`s?)Y&dO?)qL zD6cW(RX1cYOD-}?S*N+?hCNA0^aAZQ1dVviQd2aKS|Ow{H;yY>D%hDoJ}jgiVqI^o zce-6DF>ux()kz_Yw1nMa7H!RXEK=Sp=pI4)JgM35u}#KM(oAhiV%*yr_qE0W8ZGIn zl#XTm@M}=9R`RZ|mUGK?nwcHBf?amAVDpPgM+g`OfnQTz4-fis`L-G6e^thY&4iV6 zbJ={QRI>AK1t5&OeBH_4w5^qr%?{(bxhu><46?DM4S1teR{ zG!{rf6)_ORNPNwUD7()85zE-;Y3rAXOd~OkX-xY?K%fA5?uQ&VmtQiYV7DDNRSPOr zUjv))1TWE9iUnLCGDzeik&{GbkoYM+-j(7H;zJmkzr@Fa(7Zxo@iF_6d*xv?QIq$J z&>SHN`m`%ZkOf4^(LSPQ;|_5uG>*C6{Eznn_*o@DQtXj|14p zV`EOyU9$ga#^1(mj*di=G!~O$PcrE}u$^p?HOhF9Itrr*sIOAp0M(=!Lj(M8-F>fq zk)(T(VENc(ND-$&u54A7{c!$frI@!J7^l^Uvy#V&QvpXH!Poy+(&!Qbi29Nrx&j5~!2szi22_C7cIXEd7x zgs2xL;WgsFf&@eKWrud`&!iVg&%InD7Kk`V z@M5KaQ(=h^AUJN5Y&(Sl7vw42AtGXO8M$xs3;R|Z)YujLIX^*iPg;}~88z^AHZ9Gc zd{eHoy6nmxyC-?FrKBWFU03P~?o*nor%*RVKGf7a1$(Q^q*?;!;T<~WS~~QWju19> znOZ$kZ1PjzkrtSxTgJC^T)<{Njc))ex~|pLmJxM_5w&IHiWS2a9p_gDjt>$VO*JDr zG{kTM;u@SJ?l^*U@OnS8^z4}LtfL>~p~q6vJ916E8o&lGhi=lMiT>`02JmUvRJYeq!N3Qmc75G5!w zegMz^7=I2u03>-2OR^a2#8GClgbxhyujfBnIL3Hn=)+06bu$R21de_P+xW7x-8iU+ zEmu};U&~dicGlh*x6 z(J7X(XO{Cekgw1~q(MXksFyg365K_C86#Mmp&h=qE&2xCokH>(+~kP2D~qrM{?NOB z4l>@^ypNlC?)}#Ep9T8e3y^-Hj1v=}YPcgEy@RewL2W>?Cc? zc>B~_wLf}c+|l@kQ1bh2Pg-6K)fuW{i;1?f4OGxUuW~fH(b|=u05>~Zt3R(j@FZ0v zU+A^62PjM^MG8I2W&T7$$B%5$fSUcQsJ?0#y=xlL)B^I^I+I3F{sB zbEtfDrjO|%y;JYj59z~tQaAK4(2jI3q;Uuu4tZtjQ)Sz|Re`18d5#goS4z$iZO&Ae zZ6^oRCCmu16HXOxC!kggAzJ01988@x4Iy)j__hs`=(|L8A|4S@#$^4O59dceclf_k CA~qBN diff --git a/__pycache__/product.cpython-38.pyc b/__pycache__/product.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e920d394430b98a50dd7904ec93cb691f1455f7 GIT binary patch literal 1432 zcmcIk&2AGh5FUGX(@jbLfC8l;A#N){;J^u06{twus!CNaQING-yCq@sQ+uPR(e~6z z?Ug5>J>~^?2VTKfPP_sK#EiFTwpGgwOSZ>rd%pQT&+N|J+$>=G^X@vwDKMot7^rU|b4POSbf^#5eWQcR+1bk@BAVSsFwscPplB__W_$G~P>V#sR z$8n(;NsvbF4eapskY3G&{<~%?tPS{(-Kb2V!8z06y}9mVRYi6ah$IaKZQ0s z@1vYyB7vFAA3 z&?KLg9Hh!tVtR5Dam(wkZPg5tL>bf5W2Py^+%3I;mYrQoTP90-o&Gwl4TW9-4x^V> zsK(;bhpDfny(CV}IvSI^k!O8c=&Ex%Jsj}@@ezJ6V3)~q*tN3P8h&=@z!%wQVxY*19>?D4Yb8~ot#-udJsdmz0ImDjr;@(9MyhoA7E$#>a_2Oyl}}Gp zU8QXYIaPH&7UiQ$lMtM)tN#e$in5f_)Hf#AsX{enM+wg%Uoyr@%v7HOF;oP=M@v`G zXg3O}vZXapyC%f`AWn-NS9^Mez@E_X6bCzZQOb!*Qz42d95!W6AvvXi oO9lD`gsc{ZLFjAxvPlU_6|N~X_o?JzN+Db;B3dWzjz*3D1wcnUGynhq literal 0 HcmV?d00001 diff --git a/computation.py b/computation.py index 679f87d..a8a58ee 100644 --- a/computation.py +++ b/computation.py @@ -4,6 +4,9 @@ from mesa import Model from typing import TYPE_CHECKING + +from model import MyModel + if TYPE_CHECKING: from controller_db import ControllerDB @@ -34,7 +37,8 @@ class Computation: dct_sample_para = {'sample': sample_random, 'seed': sample_random.seed, **dct_exp} - model = Model(dct_sample_para) + + model = MyModel(dct_sample_para) for i in range(100): model.step() return False diff --git a/firm.py b/firm.py index 643a719..eed6ecf 100644 --- a/firm.py +++ b/firm.py @@ -1,7 +1,9 @@ from mesa import Agent +from model import MyModel + class FirmAgent(Agent): - def __init__(self, unique_id, model, code, type_region, revenue_log, a_lst_product): + def __init__(self, unique_id, model, type_region, revenue_log, a_lst_product): # 调用超类的 __init__ 方法 super().__init__(unique_id, model) @@ -10,7 +12,6 @@ class FirmAgent(Agent): self.product_network = self.model.product_network # 初始化代理自身的属性 - self.code = code self.type_region = type_region self.size_stat = [] @@ -100,7 +101,7 @@ class FirmAgent(Agent): lst_size = [firm.size_stat[-1][0] for firm in self.dct_cand_alt_supp_up_prod_disrupted[product]] lst_prob = [size / sum(lst_size) for size in lst_size] select_alt_supply = \ - self.random.choices(self.dct_cand_alt_supp_up_prod_disrupted[product], weights=lst_prob)[0] + self.random.choices(self.dct_cand_alt_supp_up_prod_disrupted[product], weights=lst_prob)[0] else: select_alt_supply = self.random.choice(self.dct_cand_alt_supp_up_prod_disrupted[product]) elif len(lst_firm_connect) > 0: @@ -176,7 +177,7 @@ class FirmAgent(Agent): down_firm.dct_cand_alt_supp_up_prod_disrupted[product].remove(self) def clean_before_trial(self): - self.dct_request_prod_from_firm = {} + self.dct_request_prod_from_firm = {} def clean_before_time_step(self): # Reset the number of trials and candidate suppliers for disrupted products diff --git a/main.py b/main.py index 70c84d1..781337f 100644 --- a/main.py +++ b/main.py @@ -49,10 +49,10 @@ def do_computation(c_db): if __name__ == '__main__': # 输入参数 parser = argparse.ArgumentParser(description='setting') - parser.add_argument('--exp', type=str, default='test') + parser.add_argument('--exp', type=str, default='without_exp') parser.add_argument('--job', type=int, default='3') parser.add_argument('--reset_sample', type=int, default='0') - parser.add_argument('--reset_db', type=bool, default=False) + parser.add_argument('--reset_db', type=bool, default=True) args = parser.parse_args() # 几核参与进程 diff --git a/model.py b/model.py index 9d9467d..d654a30 100644 --- a/model.py +++ b/model.py @@ -14,11 +14,17 @@ from product import ProductAgent class MyModel(Model): def __init__(self, params): + # self.num_agents = N + self.is_prf_size = params['is_prf_size'] + self.prf_conn = params['prf_conn'] + self.cap_limit_prob_type = params['cap_limit_prob_type'] + self.cap_limit_level = params['cap_limit_level'] + self.diff_new_conn = params['diff_new_conn'] # NetworkX 图对象 self.t = 0 - self.network_graph = nx.DiGraph() + self.network_graph = nx.MultiDiGraph() # NetworkGrid 用于管理网格 self.grid = NetworkGrid(self.network_graph) @@ -26,7 +32,7 @@ class MyModel(Model): self.data_collector = DataCollector( agent_reporters={"Product": "name"} ) - self.schedule = RandomActivation(self) + self.company_agents = [] self.product_agents = [] @@ -166,20 +172,20 @@ class MyModel(Model): def initialize_agents(self): """ Initialize agents and add them to the model. """ for ag_node, attr in self.product_network.nodes(data=True): - product = ProductAgent(ag_node, self,code=attr['code'], name=attr['Name']) - self.schedule.add(product) - self.grid.place_agent(product, ag_node) + product = ProductAgent(ag_node, self, name=attr['Name']) + self.add_agent(product) + # self.grid.place_agent(product, ag_node) for ag_node, attr in self.firm_network.nodes(data=True): + a_lst_product = [agent for agent in self.product_agents if agent.unique_id in attr['Product_Code']] firm_agent = FirmAgent( ag_node, self, - code=attr['Code'], type_region=attr['Type_Region'], revenue_log=attr['Revenue_Log'], - a_lst_product=[self.schedule.agents[code] for code in attr['Product_Code']] + a_lst_product=a_lst_product, ) - self.schedule.add(firm_agent) - self.grid.place_agent(firm_agent, ag_node) + self.add_agent(firm_agent) + # self.grid.place_agent(firm_agent, ag_node) def initialize_disruptions(self): """ Initialize disruptions in the network. """ @@ -195,9 +201,9 @@ class MyModel(Model): self.company_agents.append(agent) elif isinstance(agent, ProductAgent): self.product_agents.append(agent) - self.schedule.add(agent) def step(self): + print(f"Running step {self.t}") # 1. Remove edge to customer and disrupt customer up product for firm in self.company_agents: for prod in firm.dct_prod_up_prod_stat.keys(): @@ -244,4 +250,3 @@ class MyModel(Model): # Increment the time step self.t += 1 - self.schedule.step() # Activate all agents in the scheduler diff --git a/product.py b/product.py index 950137d..87c90cc 100644 --- a/product.py +++ b/product.py @@ -1,12 +1,11 @@ from mesa import Agent class ProductAgent(Agent): - def __init__(self, unique_id, model, code, name): + def __init__(self, unique_id, model, name): # 调用超类的 __init__ 方法 super().__init__(unique_id, model) # 初始化代理属性 - self.code = code self.name = name self.product_network = self.model.product_network