From 5d73867a935885f24f53abbf93a24fe7eb1f3c0a Mon Sep 17 00:00:00 2001
From: Aleksandra <aleks.dimitrova.21@gmail.com>
Date: Mon, 12 Jun 2023 14:31:50 +0200
Subject: [PATCH] first draft
---
backend/__pycache__/agent.cpython-311.pyc | Bin 2489 -> 2806 bytes
.../__pycache__/environment.cpython-311.pyc | Bin 6225 -> 11580 bytes
backend/__pycache__/eventlog.cpython-311.pyc | Bin 0 -> 5586 bytes
.../simplesimmodel.cpython-311.pyc | Bin 31407 -> 29040 bytes
backend/agent.py | 57 ++-
backend/checkenv.py | 42 ++
backend/draft.py | 71 ++++
backend/environment.py | 147 +++++--
backend/eventlog.py | 117 +++++-
backend/input.py | 2 +
backend/main.py | 91 +++++
backend/simplesimmodel.py | 378 ++++++++++--------
keras-rl | 1 +
...fevents.1686571942.LAPTOP-LNRI6P3Q.21880.0 | Bin 0 -> 185766 bytes
14 files changed, 678 insertions(+), 228 deletions(-)
create mode 100644 backend/__pycache__/eventlog.cpython-311.pyc
create mode 100644 backend/checkenv.py
create mode 100644 backend/draft.py
create mode 100644 backend/input.py
create mode 100644 backend/main.py
create mode 160000 keras-rl
create mode 100644 logs/1686571942/PPO_0/events.out.tfevents.1686571942.LAPTOP-LNRI6P3Q.21880.0
diff --git a/backend/__pycache__/agent.cpython-311.pyc b/backend/__pycache__/agent.cpython-311.pyc
index d5d2be1f7bb1a3a05b10f889cf2438e0008f0b34..27ba62a276575151a506ed2f3911031d3ed1c2ed 100644
GIT binary patch
delta 1457
zcmdlf{7sZ^IWI340|NuYiHWT#y*v~7D!I8C7#Nrt7#KdAu}qwlU(W)P1>suO8WtCZ
zSoT`B8s-|dDj^1jTIL>(8s-{S2%D3khAE2`q!NU)5c=3lctIi%oW%~I85nAqYuMA6
zN_b#=28JvS7<&!NGA0Iw)l3WwauA_fjuh5f&J@;Kt`yc<?i99Ko)orP-W2x97Z{b<
zn`-%Mm=<tNp2#FTnU~3lkz;ZIlRD#x$rVhx!fYvwFry$Q)o@SV!4%BMF`0)sfGdTu
zhO>%`fuV+DavZaSN);;uLk(w*SPd77lSLppLCR`GC-X5&OkT&#$q3dm`2sVqJV%Xy
zBuoiIjff2c14E5Kt$2-Stw4>?`V*6XFss)~)bP|uRPiz})biBu)`)>wyfyqOoK<WL
z3@KdMOdtb_G-`NLIIAQW7;1TIc%Uqv5^azi1gCJ<@TYKroIIN$g{OvpHbV+;4bN<b
z6uuhX*$i_zmN7CgtY(C$Wnf@r0I3F<UC+Q!#8ksuD_O&z!VeN)U?`HT;jNXbk*bjd
z8CNTfVvRtJ^lXN?Oz6f<VC-qB;Rt5X6!d!uvgH<gK~a8kYH{%`*3`1pyb?{uTdXN1
zl?AEkvu1+8PWvK|$1-0eFf%Z?y#xj1OJN2EhAIx%g3RLllvIT(9)*&8g;W@i&q^UT
zH8D@2Br`Wv!B(M)UkAc3N-a+;O0iPNe9p|kP$e7$<|<_778K=|rKTt(RZiZ<5~pKk
za*MSnF)uy!7Hd&zacapeskEHLl9JTC`23{e)S|M)lFa<P_>%ni%)FAxmaNW<GLvgr
zO(ySUb>iU$SsM?rX7WE)Z%fYnoRs+DlEjkKTPz^g+~O%NNh~UXD!Ij#nwJ7&b3@&c
zo0?ZrEHgQPO<F`jK|$e{X0laGXmM&$aZF-PYIgDDiEJ8Npu_>naK+OmA7;~Id@z}b
zU8Vj33*Q9oi!8DYULQEPSUEmOFbIoX5mLG$q|)I1m4ktkyN6?f){N{6f?8Xhws>6N
zu)WA(dxgWc!SMqd1Ft}X>kS_M2G<*Wf(`Bu1OyvAZwLuDcz<AH5Rqu`xhpI&L*}Be
z+7)574-C4j<{v>s2m1|SvFVnREGJq|vF_xUyoQ~VNAHq=-ip$T0;X34OeY^?mtYi}
ze2ZO%`2xSe<lpQb^@>UhR2Q<Z5L{upMq-276-~>F@|HVX4}_gay&4vAB`oGbY}|$T
z%qy{37sIlzgk@j!%f9HEeIYOZLP6=3ys``BwO8`$F1prTw5h)+U*F-_k=o-iA?zZL
z%m)qzNx2Ts8zOQYt{;>cgvCEF2y)7Q&|we|?y2snzrwGyAoL=?R(%J{4GzHxAs0C$
zJ2-D}2u~=x$RXRo4f4OpgrrWN8BUjY<Sy{Y-QW?QVRVs4w!`}dkLV1cPX7+iyF7vy
zgo<Z`F9@0$bwQ~3f>7~>a0q?E6GC4|D}*pE@|0ZRDY?K?@_<`tLQ<D)hwTk%wGN*T
z91JEr!V{9a>^kgjNUC&r-H=jQP;*hrxWgN4xakV+3qqzBgiJ5;m|fv9yTD`i^8q(c
zgU95L98RjB2w%xiWXr(7P-M-(!0?O1CO1E&G$+-r$e96@MHv{1<0eONx+=ynGV*?4
Jz)pho0{~v8oz(yU
delta 1137
zcmew+x>J~MIWI340|NuY)8Lwv6po2}mE4>R3=GT+3=E%7F;AS7Uk_q}6fo4X)-Yu;
zftd^p3@I#<FeXD53yfLIR>R`L5X)Z6Uc+3&UM0l9P|MuIQNxNwjJbvlB45Ll#R}7p
zWD-XSFGy4bL@+R9u|sGEh8pG?j>&P1lFF>hm>3vV!yQ!1nZj1fmBL=jox)bjlfqHU
zo5DGH9-}h5aV>uh(*mx^bC{GSzhX3I<eDtUq|SI?vKy1GFh>d_swp)*liQernK^3&
zCKoVEO#Z@TW>LdgBY^O0jR+E(t46Gb8{$rg^Rl4MWnie`oSet3%*Z);60@o_nh7=x
z3=B1*wE{Il>kmv;U{Z*!5w7B5V5k+Z;jIy`;$>i{<>h23(S{faB2&0)_-8Yu@YIOU
zW|+&ejFEw1H6utIgc%toF!q?HFa$Gb^7_353EyHbD9TSxEiS&rlAKtaI{7w>q(=HW
z_lH#?>)zWJfdcF$D9YWcI9v-di}O=b6{<L`6iPC4Qx$9{N3+JM8k*f=ElSKwPrb!j
zlv<oxa!WWZC$Xd?H7`CtsW`Q$EU_drKX39=R%b?u$(n2?tXyDg!q_|~uVM3IX91a1
zEHPQ1U0UszeX><dXmM&$aZFx*X;E&Be_pCfQD#|cj7w^9c1eCgj9-3f(d0OG4K51?
z1_qF`inS+CVAm78At-W1P;Eik6+yi#g2oMAHzx0ASE;|jD}I4R;{uCD2jdK>1%)%^
zXGqPEy1~LXLHi<$Y=hSWA<-*BN>_wb8oZx!aP@FZ(3+8bK~QU}(iV*i9M%^(tgmob
zH#mM^W8f8NaJ|6;BKQOw+#d)CHh6wuV-OK*@VP52F+=8}u-X-2wGRyPti~TfL<jo~
zVX^6!lT0lqT2Ha=<mh1SD7+ycd|g2Ol7RXO){6pqR|NDrSa0x)bg<kI5T3$4h5w3x
zatG@TA+Zk({F5he$gqB3VCL1Gyq?3OUO{nz=$wibY**y<H>mC~JK%cO>5SWj;E)TU
z@mGQqF8U;1@kzYsl6cWN@j^=Kg|zG|DLEH%i?5`VT(mB^XjFPpzO=)!Beln4LfAzf
znGb9XqVgTCALJQ?#Xm6cbIN~EVh|ASsqU%2!mqR-^di4j2g?l(!3iN3IV3wcKd`WH
z>hpZ%Vc_Juz-Kr^`~sih1wO+SCJ_1}htU-dqYE5H7debR*vqpTg9Bi)CYO^cC~{UZ
w6j?GbFcg_HFfjb$u*uC&Da}c>E3#)`U;w4M;>gJpxLjqd8I3<MU=m=h0F@yw@&Et;
diff --git a/backend/__pycache__/environment.cpython-311.pyc b/backend/__pycache__/environment.cpython-311.pyc
index 9bea13c82289da5144dd2bcf2091da08eca74371..684d042e0410afe4baf43431eae0a24302fe0edb 100644
GIT binary patch
literal 11580
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
delta 2369
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
diff --git a/backend/__pycache__/eventlog.cpython-311.pyc b/backend/__pycache__/eventlog.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1be7ea3fd1c89856c71c67cf0642cf57f31a5814
GIT binary patch
literal 5586
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
L_<;dC2@VkeM}Ehk
literal 0
HcmV?d00001
diff --git a/backend/__pycache__/simplesimmodel.cpython-311.pyc b/backend/__pycache__/simplesimmodel.cpython-311.pyc
index 84c65e33b50af4d2fb64b408c2146308eb6bfd54..fc09c13857950cd84eae9dc0c0371efa884c8770 100644
GIT binary patch
literal 29040
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
aqt*uoIFZ1}#K`i2O@Ptt0|O=jjsO7i)S`<3
literal 31407
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
RwYW8aAt)fY!4lwD0RRI$X>tGn
diff --git a/backend/agent.py b/backend/agent.py
index 45bc575..67a86db 100644
--- a/backend/agent.py
+++ b/backend/agent.py
@@ -15,29 +15,46 @@ def q_learning(space, activities):
num_states = 1
process_space = env.observation_space['process'].nvec
- case_space = env.observation_space['case'].nvec
+ # case_space = env.observation_space['case'].nvec
event_space = env.observation_space['event'].n
for i in process_space: num_states *= i
- for i in case_space: num_states *= i
- num_states *= event_space
+ # for i in case_space: num_states *= (i+1)
+ num_states *= event_space
+
+ # num_states = pow(2,14)
+
+ """
+ process_space = env.observation_space['process']
+ case_space = env.observation_space['case']
+ event_space = env.observation_space['event']
+
+ state_shape = []
+ for i in process_space: state_shape.append(i.n + 1)
+ for j in case_space: state_shape.append(j.n + 1)
+ state_shape.append(event_space.n)
+ state_shape = tuple(state_shape)
+ """
num_actions = env.action_space.n
- Q = np.zeros((num_states, num_actions), dtype=np.int16)
+
+ # Q = np.zeros(state_shape + (num_actions,), dtype=np.int8)
+ Q = np.zeros((num_states, num_actions), dtype = np.int64)
# Set the hyperparameters
alpha = 0.1 # learning rate
- gamma = 0.99 # discount factor
+ gamma = 0.1 # discount factor
epsilon = 0.1 # exploration rate
mean_time = 0
+ mean_reward = 0
# Train the agent using Q-learning
- num_episodes = 10
+ num_episodes = 1000
for episode in range(num_episodes):
state, _ = env.reset()
- state = env.flatten_observation(state)
+ state = env.flatten_observation_to_int(state)
done = False
start = env.process.env.now
while not done:
@@ -52,18 +69,34 @@ def q_learning(space, activities):
next_state, reward, done, _ = env.step(action)
# Update the Q-value for the current state-action pair
- Q[state][action] = Q[state][action] + alpha * (reward + gamma * np.max(Q[next_state]) - Q[state][action])
+ Q[state][action] = (1-alpha)*Q[state][action] + alpha * (reward + gamma * np.max(Q[next_state]) - Q[state][action])
+ #Q[state][action] = (1-alpha)*Q[state][action] + alpha*reward
# Transition to the next state
+ old_state = state
state = next_state
+
+ # comment
+
time = env.process.env.now - start
mean_time += time
+ mean_reward += reward
+
- """
if (episode % 20 == 19):
+ mean_reward /= 20
mean_time /= 20
- print(f"Episode {episode-19} to episode {episode}: mean time = {mean_time}")
- """
+ print(f"Episode {episode-19} to episode {episode}: mean time = {mean_time}, mean reward: {mean_reward}")
+
+ if episode == 19:
+ start_reward = mean_reward
+
+ # print(f"Episode {episode}: time = {time}, reward = {reward}")
+
+ if episode == 999:
+ end_reward = mean_reward
+ improvement = end_reward - start_reward
+ print(f"Reward improved by {improvement}")
- print(f"Episode {episode}: time = {time}")
\ No newline at end of file
+ return Q
diff --git a/backend/checkenv.py b/backend/checkenv.py
new file mode 100644
index 0000000..3360e08
--- /dev/null
+++ b/backend/checkenv.py
@@ -0,0 +1,42 @@
+from stable_baselines3.common.env_checker import check_env
+import environment
+
+process = []
+num_s = 1
+process.append(num_s+1)
+num_ot = 5
+process.append(num_ot+1)
+num_sh_a = 3
+process.append(num_sh_a+1)
+num_sh_b = 3
+process.append(num_sh_b+1)
+num_sh_c = 3
+process.append(num_sh_c+1)
+num_m_a = 3
+process.append(num_m_a+1)
+num_m_b = 2
+process.append(num_m_b+1)
+num_p_a = 4
+process.append(num_p_a+1)
+num_p_b = 5
+process.append(num_p_b+1)
+num_p_c = 4
+process.append(num_p_c+1)
+num_ds_a = 7
+process.append(num_ds_a+1)
+num_ds_b = 7
+process.append(num_ds_b+1)
+num_ds_c = 7
+process.append(num_ds_c+1)
+
+case = []
+for i in range(15):
+ case.append(2)
+
+space = [process, case]
+activities = 16
+
+env = environment.BusinessProcessEnv(space, activities)
+
+check_env(env)
+
diff --git a/backend/draft.py b/backend/draft.py
new file mode 100644
index 0000000..c7bd907
--- /dev/null
+++ b/backend/draft.py
@@ -0,0 +1,71 @@
+import numpy as np
+import gymnasium as gym
+
+import environment
+
+from stable_baselines3 import PPO, DQN
+import os
+import time
+
+def main():
+ process = []
+ num_s = 1
+ process.append(num_s+1)
+ num_ot = 5
+ process.append(num_ot+1)
+ num_sh_a = 3
+ process.append(num_sh_a+1)
+ num_sh_b = 3
+ process.append(num_sh_b+1)
+ num_sh_c = 3
+ process.append(num_sh_c+1)
+ num_m_a = 3
+ process.append(num_m_a+1)
+ num_m_b = 2
+ process.append(num_m_b+1)
+ num_p_a = 4
+ process.append(num_p_a+1)
+ num_p_b = 5
+ process.append(num_p_b+1)
+ num_p_c = 4
+ process.append(num_p_c+1)
+ num_ds_a = 7
+ process.append(num_ds_a+1)
+ num_ds_b = 7
+ process.append(num_ds_b+1)
+ num_ds_c = 7
+ process.append(num_ds_c+1)
+
+ case = []
+ for i in range(15):
+ case.append(2)
+
+ space = [process, case]
+ activities = 16
+
+ env = environment.BusinessProcessEnv(space, activities)
+ env.reset()
+
+ models_dir = f"models/{int(time.time())}/"
+ logdir = f"logs/{int(time.time())}/"
+
+ if not os.path.exists(models_dir):
+ os.makedirs(models_dir)
+
+ if not os.path.exists(logdir):
+ os.makedirs(logdir)
+
+ # model = PPO('MultiInputPolicy', env, verbose=1, tensorboard_log=logdir)
+ model = DQN('MultiInputPolicy', env, verbose=1, tensorboard_log=logdir)
+
+ TIMESTEPS = 10000000
+ iters = 0
+ while True:
+ iters += 1
+ model.learn(total_timesteps=TIMESTEPS, reset_num_timesteps=False, tb_log_name=f"PPO")
+ model.save(f"{models_dir}/{TIMESTEPS*iters}")
+
+
+if __name__ == "__main__":
+ main()
+
diff --git a/backend/environment.py b/backend/environment.py
index b96b642..9c14746 100644
--- a/backend/environment.py
+++ b/backend/environment.py
@@ -1,13 +1,13 @@
import gymnasium as gym
import numpy as np
import simpy
-import simplesimmodel as model
+import simplesimmodel as simmodel
+from collections import OrderedDict
"""
Environment for the RL agent
"""
-
class BusinessProcessEnv(gym.Env):
def __init__(self, space, activities):
@@ -25,27 +25,26 @@ class BusinessProcessEnv(gym.Env):
self.action_space = gym.spaces.Discrete(self.activities)
- self.current_state = {
- 'process': np.array(self.ressources),
- 'case': np.zeros(len(self.case), dtype=int),
- 'event': 0
- }
+ self.current_state = OrderedDict()
+ self.current_state['case'] = np.zeros(len(self.case), dtype=int)
+ self.current_state['event'] = 0
+ self.current_state['process'] = np.zeros(len(self.ressources), dtype=int)
+ for i in range(len(self.current_state['process'])):
+ self.current_state['process'][i] += (self.ressources[i]-1)
self.model_env = simpy.Environment()
- self.process = model.BusinessProcess(self.model_env, self.ressources)
- self.model_env.process(model.run_process(self.model_env, self.process))
- # self.done_cases = set([])
+ self.process = simmodel.BusinessProcess(self.model_env, self.ressources)
+ self.model_env.process(simmodel.run_process(self.model_env, self.process))
self.reward = 0
def get_current_state(self, caseid):
- process, case, event = model.get_current_state(self.process, caseid)
- state = {
- 'process': process,
- 'case': case,
- 'event': event
- }
+ process, case, event = simmodel.get_current_state(self.process, caseid)
+ state = OrderedDict()
+ state['case'] = np.asarray(case)
+ state['event'] = event
+ state['process'] = np.asarray(process)
return state
def step(self, action):
@@ -77,39 +76,51 @@ class BusinessProcessEnv(gym.Env):
next_state = self.get_current_state(case_obj)
self.current_state = next_state
- next_state = self.flatten_observation(next_state)
-
- self.reward += -(stop - start)
- done = True if (len(self.process.done_cases) == 5 or len(self.process.active_cases) == 0) else False
- return next_state, self.reward, done, None
+ # next_state = self.flatten_observation_to_int(next_state)
+ time = stop - start
+ reward = 10000 - time
+ self.reward += reward
+ done = True if (len(self.process.done_cases) == 1 or len(self.process.active_cases) == 0) else False
+ truncated = False
+ info = {}
+ return next_state, self.reward, done, truncated, info
else:
- self.reward += -100
- next_state = self.flatten_observation(self.current_state)
+ self.reward += 0
+ # next_state = self.flatten_observation_to_int(self.current_state)
+ next_state = self.current_state
done = False
- return next_state, self.reward, done, None
+ truncated = False
+ info = {}
+ return next_state, self.reward, done, truncated, info
def reset(self, seed=None, options=None):
# Reset the environment to the initial state
- # Implement a function which extracts the current state from an event log / simulation model
+ # Implement a function which extracts the current state from an event log / simulation simmodel
super().reset(seed=seed)
- self.current_state = {
- 'process': np.array(self.ressources),
- 'case': np.zeros(len(self.case), dtype=int),
- 'event': 0
- }
+ self.current_state = OrderedDict()
+ self.current_state['case'] = np.zeros(len(self.case), dtype=int)
+ self.current_state['event'] = 0
+ self.current_state['process'] = np.zeros(len(self.ressources), dtype=int)
+ for i in range(len(self.current_state['process'])):
+ self.current_state['process'][i] += (self.ressources[i]-1)
+
+ observation = self.current_state
+
self.current_step = 0
self.model_env = simpy.Environment()
- self.process = model.BusinessProcess(self.model_env, self.ressources)
- self.model_env.process(model.run_process(self.model_env, self.process))
+ self.process = simmodel.BusinessProcess(self.model_env, self.ressources)
+ self.model_env.process(simmodel.run_process(self.model_env, self.process))
self.process.done_cases = set([])
self.reward = 0
- return self.current_state, None
+ info = {}
+
+ return observation, info
def render(self, mode='human'):
@@ -125,4 +136,74 @@ class BusinessProcessEnv(gym.Env):
return flattened
+ def flatten_observation_to_int(self, observation):
+ state = 0
+ state += observation['event']*pow(2,10)
+ state += observation['case'][1]*pow(2,2)
+ state += observation['case'][2]*pow(2,2)
+ event = observation['event']
+ if event == 0:
+ state += observation['process'][0]*pow(2,6)
+ elif event == 1:
+ state += observation['process'][1]*pow(2,6)
+ elif 1 < event <=3:
+ state += observation['process'][2]*pow(2,6)+observation['process'][3]*pow(2,7)+observation['process'][4]*pow(2,8)
+ elif 3 < event <=6:
+ state += observation['process'][5]*pow(2,6)+observation['process'][6]*pow(2,7)
+ elif 6 < event <= 8:
+ state += observation['process'][7]*pow(2,6)+observation['process'][8]*pow(2,7)+observation['process'][9]*pow(2,8)
+ elif 8 < event <= 11:
+ state += observation['process'][10]*pow(2,6)+observation['process'][11]*pow(2,7)+observation['process'][12]*pow(2,8)
+ elif 11 < event <= 14:
+ state += observation['process'][0]*pow(2,6)
+ else:
+ pass
+
+ return state
+
+def main():
+ process = []
+ num_s = 1
+ process.append(num_s+1)
+ num_ot = 5
+ process.append(num_ot+1)
+ num_sh_a = 3
+ process.append(num_sh_a+1)
+ num_sh_b = 3
+ process.append(num_sh_b+1)
+ num_sh_c = 3
+ process.append(num_sh_c+1)
+ num_m_a = 3
+ process.append(num_m_a+1)
+ num_m_b = 2
+ process.append(num_m_b+1)
+ num_p_a = 4
+ process.append(num_p_a+1)
+ num_p_b = 5
+ process.append(num_p_b+1)
+ num_p_c = 4
+ process.append(num_p_c+1)
+ num_ds_a = 8
+ process.append(num_ds_a+1)
+ num_ds_b = 8
+ process.append(num_ds_b+1)
+ num_ds_c = 8
+ process.append(num_ds_c+1)
+
+ case = []
+ for i in range(15):
+ case.append(2)
+
+ space = [process, case]
+ activities = 16
+
+ env = BusinessProcessEnv(space, activities)
+
+ state = env.current_state
+ sample = env.observation_space.sample()
+ print(sample)
+ print(state)
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/backend/eventlog.py b/backend/eventlog.py
index 442b77f..22c641a 100644
--- a/backend/eventlog.py
+++ b/backend/eventlog.py
@@ -1,39 +1,134 @@
import pandas as pd
import simplesimmodel as model
+import numpy as np
"""
Event log generator for our simulation model:
- generate an event log
- update an event log (adding new events)
+- export event log
+- get current state of an event log
"""
def add_start_event(process, event_id, case_id, activity, start_timestamp):
+ process.event_log.append(event_id)
process.event_log[event_id] = {
'CaseID': case_id,
'Activity': activity,
'StartTimestamp': float(start_timestamp),
'EndTimestamp': None
}
+ process.event_counter += 1
def add_end_event(process, event_id, end_timestamp):
- # if event_id in process.event_log:
event = process.event_log[event_id]
event['EndTimestamp'] = end_timestamp
- # process.event_log.append(event)
- # del process.event_log[event_id]
-
-# add functions for adding events with their attributes to the log
def export_to_csv(process, file_path):
event_log_df = pd.DataFrame.from_dict(process.event_log)
event_log_df.to_csv(file_path, index=False)
-def export_to_csv(env, file_path):
- event_log_df = pd.DataFrame.from_dict(env.bigeventlog)
- event_log_df.to_csv(file_path)
-
-
def export_to_xes(process, file_path):
# Use appropriate code to export to XES format
- pass
\ No newline at end of file
+ pass
+
+def get_active_cases():
+ event_log = pd.read_csv(r'D:\test\optis.csv')
+ active_cases = event_log.groupby('CaseID').filter(lambda x: 'order completed' not in x['Activity'].values)['CaseID'].unique().tolist()
+ return active_cases
+
+
+def get_state(case_id):
+
+ process = []
+ num_s = 1
+ process.append(num_s)
+ num_ot = 5
+ process.append(num_ot)
+ num_sh_a = 3
+ process.append(num_sh_a)
+ num_sh_b = 3
+ process.append(num_sh_b)
+ num_sh_c = 3
+ process.append(num_sh_c)
+ num_m_a = 3
+ process.append(num_m_a)
+ num_m_b = 2
+ process.append(num_m_b)
+ num_p_a = 4
+ process.append(num_p_a)
+ num_p_b = 5
+ process.append(num_p_b)
+ num_p_c = 4
+ process.append(num_p_c)
+ num_ds_a = 8
+ process.append(num_ds_a)
+ num_ds_b = 8
+ process.append(num_ds_b)
+ num_ds_c = 8
+ process.append(num_ds_c)
+
+ case = []
+ for i in range(15):
+ case.append(0)
+
+ activity_mapping = {
+ 'place order': 1,
+ 'arrange standard order': 2,
+ 'arrange custom order': 3,
+ 'pick from stock A': 4,
+ 'pick from stock B': 5,
+ 'pick from stock C': 6,
+ 'manufacture A': 7,
+ 'manufacture B': 8,
+ 'pack A': 9,
+ 'pack B': 10,
+ 'pack C': 11,
+ 'attempt delivery A': 12,
+ 'attempt delivery B': 13,
+ 'attempt delivery C': 14,
+ 'order completed': 15,
+ }
+
+ event_log = pd.read_csv(r'D:\test\optis.csv')
+ # Sort the event log by case ID and start timestamp
+ event_log.sort_values(by=['CaseID', 'StartTimestamp'], inplace=True)
+
+ # Group the event log by case ID and get the last activity for each case
+ last_activities = event_log.groupby('CaseID').tail(1).reset_index()
+
+ # Remap the activity names to numbers using the mapping dictionary
+ last_activities['Activity'] = last_activities['Activity'].map(activity_mapping)
+
+ # Filter the cases where the end timestamp of the last activity is None or empty
+ unfinished_cases = last_activities[last_activities['EndTimestamp'].isnull()]['CaseID'].tolist()
+
+ # Update the state of the ressources given all unfinished cases
+ for i in unfinished_cases:
+ activity = last_activities[last_activities['CaseID'] == i]['Activity'].values[0]
+ if activity == 1 or activity == 15:
+ process[0] -= 1
+ elif activity == 2 or activity == 3:
+ process[1] -= 1
+ else:
+ process[activity-2] -= 1
+
+ # Get the state of the case for the given Case ID
+ filtered_log = event_log[event_log['CaseID'] == case_id]
+ activities = filtered_log['Activity'].map(activity_mapping).tolist()
+ for i in activities:
+ case[i-1] += 1
+
+ # Get the last event for the given Case ID
+ event = last_activities[last_activities['CaseID'] == case_id]['Activity'].values[0]
+
+ state = {
+ 'process': process,
+ 'case': case,
+ 'event': event
+ }
+
+ print(state)
+
+ return state
diff --git a/backend/input.py b/backend/input.py
new file mode 100644
index 0000000..e8c6f1e
--- /dev/null
+++ b/backend/input.py
@@ -0,0 +1,2 @@
+import pandas as pd
+
diff --git a/backend/main.py b/backend/main.py
new file mode 100644
index 0000000..4bd1d57
--- /dev/null
+++ b/backend/main.py
@@ -0,0 +1,91 @@
+import simpy
+import random
+import numpy as np
+import simplesimmodel as model
+import environment
+import agent
+import eventlog as log
+import pandas as pd
+
+def main():
+ # Setup
+ # we can use a random seed if we want to generate the same results every time (maybe useful later for the training)
+ # random.seed(42)
+ # initialize the number of resources
+
+ process = []
+ num_s = 1
+ process.append(num_s+1)
+ num_ot = 5
+ process.append(num_ot+1)
+ num_sh_a = 3
+ process.append(num_sh_a+1)
+ num_sh_b = 3
+ process.append(num_sh_b+1)
+ num_sh_c = 3
+ process.append(num_sh_c+1)
+ num_m_a = 3
+ process.append(num_m_a+1)
+ num_m_b = 2
+ process.append(num_m_b+1)
+ num_p_a = 4
+ process.append(num_p_a+1)
+ num_p_b = 5
+ process.append(num_p_b+1)
+ num_p_c = 4
+ process.append(num_p_c+1)
+ num_ds_a = 7
+ process.append(num_ds_a+1)
+ num_ds_b = 7
+ process.append(num_ds_b+1)
+ num_ds_c = 7
+ process.append(num_ds_c+1)
+
+ case = []
+ for i in range(15):
+ case.append(2)
+
+ space = [process, case]
+ activities = 16
+
+ # q learning
+ Q = agent.q_learning(space, activities)
+ # print(Q)
+
+ # generate event log
+ env = simpy.Environment()
+ business_process = model.BusinessProcess(env, process)
+ business_process.event_log_flag = True
+ env.process(model.run_process(env, business_process))
+ env.run(until = 10000)
+ log.export_to_csv(business_process, r'D:\test\optis.csv')
+
+ # extract active cases from event log
+ active_cases = log.get_active_cases()
+ print(active_cases)
+
+ # test agent
+ for i in range(20):
+ caseid = random.choice(active_cases)
+ state = log.get_state(caseid)
+
+ action = np.argmax(Q[state])
+ print(action)
+ #print(Q)
+ print(Q[state])
+
+ state = Q[0]
+ action = np.argmax(state)
+ print(action)
+ print(state)
+
+ state = Q[64]
+ action = np.argmax(state)
+ print(action)
+ print(state)
+
+
+
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/backend/simplesimmodel.py b/backend/simplesimmodel.py
index fe23eb4..e3842af 100644
--- a/backend/simplesimmodel.py
+++ b/backend/simplesimmodel.py
@@ -3,6 +3,7 @@ import random
import numpy as np
import environment
import agent
+import eventlog as log
"""
Simulation model for a simpler business process, including:
@@ -25,20 +26,20 @@ class BusinessProcess(object):
self.env = env
# initialize ressources
- self.system = simpy.Resource(env, ressources[0])
- self.order_taker = simpy.Resource(env, ressources[1])
- self.stock_handler_a = simpy.Resource(env, ressources[2])
- self.stock_handler_b = simpy.Resource(env, ressources[3])
- self.stock_handler_c = simpy.Resource(env, ressources[4])
- self.manufacturer_a = simpy.Resource(env, ressources[5])
- self.manufacturer_b = simpy.Resource(env, ressources[6])
- self.packer_a = simpy.Resource(env, ressources[7])
- self.packer_b = simpy.Resource(env, ressources[8])
- self.packer_c = simpy.Resource(env, ressources[9])
+ self.system = simpy.Resource(env, ressources[0] - 1)
+ self.order_taker = simpy.Resource(env, ressources[1] - 1)
+ self.stock_handler_a = simpy.Resource(env, ressources[2] - 1)
+ self.stock_handler_b = simpy.Resource(env, ressources[3] - 1)
+ self.stock_handler_c = simpy.Resource(env, ressources[4] - 1)
+ self.manufacturer_a = simpy.Resource(env, ressources[5] - 1)
+ self.manufacturer_b = simpy.Resource(env, ressources[6] - 1)
+ self.packer_a = simpy.Resource(env, ressources[7] - 1)
+ self.packer_b = simpy.Resource(env, ressources[8] - 1)
+ self.packer_c = simpy.Resource(env, ressources[9] - 1)
# capacity of each delivery service instead of numbers of workers
- self.delivery_service_a = simpy.Resource(env, ressources[10])
- self.delivery_service_b = simpy.Resource(env, ressources[11])
- self.delivery_service_c = simpy.Resource(env, ressources[12])
+ self.delivery_service_a = simpy.Resource(env, ressources[10] - 1)
+ self.delivery_service_b = simpy.Resource(env, ressources[11] - 1)
+ self.delivery_service_c = simpy.Resource(env, ressources[12] - 1)
# initialize lists with active cases and all case objects
self.active_cases = [0, 1, 2]
@@ -56,7 +57,11 @@ class BusinessProcess(object):
self.done_cases = set([])
- random.seed(1)
+ self.event_log_flag = False
+ self.event_log = []
+ self.event_counter = 0
+
+ # random.seed(1)
def place_order(self, case):
yield self.env.timeout(0)
@@ -162,20 +167,25 @@ def execute_case(env, case, process):
case_obj.agent = True
# place order
+ case_obj.state[0] += 1
+ case_obj.current = 1
with process.system.request() as request:
yield request
- case_obj.state[0] += 1
- case_obj.current = 1
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "place order", env.now)
yield env.process(process.place_order(case))
- if case_obj.agent: print(f"Case {case}: 'placed order' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+ # if case_obj.agent: print(f"Case {case}: 'placed order' at {env.now:.2f}")
# if the last action was made from the agent set the process flag to be able to return to the environment's step function
if case_obj.agent:
process.flag = False
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
# before a new action is executed check if the agent is controlling the case and set the flag to true if yes
if process.case_id == case: case_obj.agent = True
@@ -184,32 +194,40 @@ def execute_case(env, case, process):
choice = random.randint(2,3) if not case_obj.agent else process.next
if choice == 2:
case_obj.standard_order = True
+ case_obj.state[1] += 1
+ case_obj.current = 2
with process.order_taker.request() as request:
yield request
- case_obj.state[1] += 1
- case_obj.current = 2
- if case_obj.agent: print(f"Case {case}: started 'arrange standard order' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'arrange standard order' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "arrange standard order", env.now)
yield env.process(process.arrange_standard_order(case))
- if case_obj.agent: print(f"Case {case}: finished 'arrange standard order' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+ # if case_obj.agent: print(f"Case {case}: finished 'arrange standard order' at {env.now:.2f}")
if case_obj.agent:
process.flag = False
-
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
else:
+ case_obj.state[2] += 1
+ case_obj.current = 3
case_obj.standard_order = False
with process.order_taker.request() as request:
yield request
- case_obj.state[2] += 1
- case_obj.current = 3
- if case_obj.agent: print(f"Case {case}: started 'arrange custom order' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'arrange custom order' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "arrange custom order", env.now)
yield env.process(process.arrange_custom_order(case))
- if case_obj.agent: print(f"Case {case}: finished 'arrange custom order' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+ # if case_obj.agent: print(f"Case {case}: finished 'arrange custom order' at {env.now:.2f}")
if case_obj.agent:
process.flag = False
-
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
if process.case_id == case: case_obj.agent = True
@@ -223,70 +241,92 @@ def execute_case(env, case, process):
# choose stock or manufacturer
if choice == 4:
+ case_obj.state[3] += 1
+ case_obj.current = 4
with process.stock_handler_a.request() as request:
yield request
- case_obj.state[3] += 1
- case_obj.current = 4
- if case_obj.agent: print(f"Case {case}: started 'pick from stock A' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'pick from stock A' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "pick from stock A", env.now)
yield env.process(process.pick_from_stock_a(case))
- if case_obj.agent: print(f"Case {case}: finished 'pick from stock A' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+ # if case_obj.agent: print(f"Case {case}: finished 'pick from stock A' at {env.now:.2f}")
if case_obj.agent:
process.flag = False
-
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
elif choice == 5:
+ case_obj.state[4] += 1
+ case_obj.current = 5
with process.stock_handler_b.request() as request:
yield request
- case_obj.state[4] += 1
- case_obj.current = 5
- if case_obj.agent: print(f"Case {case}: started 'pick from stock B' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'pick from stock B' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "pick from stock B", env.now)
yield env.process(process.pick_from_stock_b(case))
- if case_obj.agent: print(f"Case {case}: finished 'pick from stock B' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+
+ # if case_obj.agent: print(f"Case {case}: finished 'pick from stock B' at {env.now:.2f}")
if case_obj.agent:
process.flag = False
-
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
elif choice == 6:
+ case_obj.state[5] += 1
+ case_obj.current = 6
with process.stock_handler_c.request() as request:
yield request
- case_obj.state[5] += 1
- case_obj.current = 6
- if case_obj.agent: print(f"Case {case}: started 'pick from stock C' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'pick from stock C' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "pick from stock C", env.now)
yield env.process(process.pick_from_stock_c(case))
- if case_obj.agent: print(f"Case {case}: finished 'pick from stock C' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+ # if case_obj.agent: print(f"Case {case}: finished 'pick from stock C' at {env.now:.2f}")
if case_obj.agent:
process.flag = False
-
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
elif choice == 7:
+ case_obj.state[6] += 1
+ case_obj.current = 7
with process.manufacturer_a.request() as request:
yield request
- case_obj.state[6] += 1
- case_obj.current = 7
- if case_obj.agent: print(f"Case {case}: started 'manufacture A' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'manufacture A' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "manufacture A", env.now)
yield env.process(process.manufacture_a(case))
- if case_obj.agent: print(f"Case {case}: finished 'manufacture A' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+
+ # if case_obj.agent: print(f"Case {case}: finished 'manufacture A' at {env.now:.2f}")
if case_obj.agent:
process.flag = False
-
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
else:
+ case_obj.state[7] += 1
+ case_obj.current = 8
with process.manufacturer_b.request() as request:
yield request
- case_obj.state[7] += 1
- case_obj.current = 8
- if case_obj.agent: print(f"Case {case}: started 'manufacture B' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'manufacture B' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "manufacture B", env.now)
yield env.process(process.manufacture_b(case))
- if case_obj.agent: print(f"Case {case}: finished 'manufacture B' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+ # if case_obj.agent: print(f"Case {case}: finished 'manufacture B' at {env.now:.2f}")
if case_obj.agent:
process.flag = False
-
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
if process.case_id == case: case_obj.agent = True
@@ -294,99 +334,135 @@ def execute_case(env, case, process):
choice = random.randint(9,11) if not case_obj.agent else process.next
if choice == 9:
+ case_obj.state[8] += 1
+ case_obj.current = 9
with process.packer_a.request() as request:
yield request
- case_obj.state[8] += 1
- case_obj.current = 9
- if case_obj.agent: print(f"Case {case}: started 'pack A' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'pack A' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "pack A", env.now)
yield env.process(process.pack_a(case))
- if case_obj.agent: print(f"Case {case}: finished 'pack A' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+
+ # if case_obj.agent: print(f"Case {case}: finished 'pack A' at {env.now:.2f}")
if case_obj.agent:
- process.flag = False
-
- with process.system.request() as request:
- yield request
+ process.flag = False
+ with process.system.request() as request:
+ yield request
elif choice == 10:
+ case_obj.state[9] += 1
+ case_obj.current = 10
with process.packer_b.request() as request:
yield request
- case_obj.state[9] += 1
- case_obj.current = 10
- if case_obj.agent: print(f"Case {case}: started 'pack B' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'pack B' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "pack B", env.now)
yield env.process(process.pack_b(case))
- if case_obj.agent: print(f"Case {case}: finished 'pack B' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+
+ # if case_obj.agent: print(f"Case {case}: finished 'pack B' at {env.now:.2f}")
if case_obj.agent:
- process.flag = False
+ process.flag = False
- with process.system.request() as request:
- yield request
+ with process.system.request() as request:
+ yield request
else:
+ case_obj.state[10] += 1
+ case_obj.current = 11
with process.packer_c.request() as request:
yield request
- case_obj.state[10] += 1
- case_obj.current = 11
- if case_obj.agent: print(f"Case {case}: started 'pack C' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'pack C' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "pack C", env.now)
yield env.process(process.pack_c(case))
- if case_obj.agent: print(f"Case {case}: finished 'pack C' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+
+ # if case_obj.agent: print(f"Case {case}: finished 'pack C' at {env.now:.2f}")
if case_obj.agent:
- process.flag = False
-
- with process.system.request() as request:
- yield request
+ process.flag = False
+ with process.system.request() as request:
+ yield request
if process.case_id == case: case_obj.agent = True
# choose delivery
choice = random.randint(12,14) if not case_obj.agent else process.next
if choice == 12:
+ case_obj.state[11] += 1
+ case_obj.current = 12
with process.delivery_service_a.request() as request:
yield request
- case_obj.state[11] += 1
- case_obj.current = 12
- if case_obj.agent: print(f"Case {case}: started 'attempt delivery A' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'attempt delivery A' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "attempt delivery A", env.now)
yield env.process(process.attempt_delivery_a(case))
- if case_obj.agent: print(f"Case {case}: finished 'attempt delivery A' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+
+ # if case_obj.agent: print(f"Case {case}: finished 'attempt delivery A' at {env.now:.2f}")
if case_obj.agent:
- process.flag = False
-
- with process.system.request() as request:
- yield request
+ process.flag = False
+ with process.system.request() as request:
+ yield request
elif choice == 13:
+ case_obj.state[12] += 1
+ case_obj.current = 13
with process.delivery_service_b.request() as request:
yield request
- case_obj.state[12] += 1
- case_obj.current = 13
- if case_obj.agent: print(f"Case {case}: started 'attempt delivery B' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'attempt delivery B' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "attempt delivery B", env.now)
yield env.process(process.attempt_delivery_b(case))
- if case_obj.agent: print(f"Case {case}: finished 'attempt delivery B' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+
+ # if case_obj.agent: print(f"Case {case}: finished 'attempt delivery B' at {env.now:.2f}")
if case_obj.agent:
- process.flag = False
-
- with process.system.request() as request:
- yield request
+ process.flag = False
+ with process.system.request() as request:
+ yield request
else:
+ case_obj.state[13] += 1
+ case_obj.current = 14
with process.delivery_service_c.request() as request:
yield request
- case_obj.state[13] += 1
- case_obj.current = 14
- if case_obj.agent: print(f"Case {case}: started 'attempt delivery C' at {env.now:.2f}")
+ # if case_obj.agent: print(f"Case {case}: started 'attempt delivery C' at {env.now:.2f}")
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "attempt delivery C", env.now)
yield env.process(process.attempt_delivery_c(case))
- if case_obj.agent: print(f"Case {case}: finished 'attempt delivery C' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+
+ # if case_obj.agent: print(f"Case {case}: finished 'attempt delivery C' at {env.now:.2f}")
if case_obj.agent:
- process.flag = False
-
- with process.system.request() as request:
- yield request
+ process.flag = False
+ with process.system.request() as request:
+ yield request
if process.case_id == case: case_obj.agent = True
# case completed
+ case_obj.state[14] += 1
+ case_obj.current = 15
with process.system.request() as request:
yield request
- case_obj.state[14] += 1
- case_obj.current = 15
+ if process.event_log_flag:
+ event_counter = process.event_counter
+ log.add_start_event(process, event_counter, case, "order completed", env.now)
yield env.process(process.order_completed(case))
- if case_obj.agent: print(f"Case {case}: 'completed' at {env.now:.2f}")
+ if process.event_log_flag:
+ log.add_end_event(process, event_counter, env.now)
+ # if case_obj.agent: print(f"Case {case}: 'completed' at {env.now:.2f}")
if case in process.active_cases:
@@ -399,6 +475,13 @@ def execute_case(env, case, process):
process.done_cases.add(process.case_id)
process.flag = False
+
+"""
+Get the cureent state of the process and a specific case
+- available ressouces
+- events which already happened in the case
+- current event of the case
+"""
def get_current_state(process, case):
process_state = []
@@ -447,6 +530,9 @@ def get_current_state(process, case):
return process_state, cur_case, event
+"""
+Defines how often new orders (cases) come in and starts executing them
+"""
def run_process(env, process):
# process = Process(env, num_ot, num_m, num_sh_a, num_sh_b, num_sh_c, num_m_a, num_m_b, num_ds_a, num_ds_b, num_ds_c)
@@ -457,63 +543,11 @@ def run_process(env, process):
# the new incoming orders
while case < 1000:
waittime = random.randint(10,15)
+ if case % 20 == 0:
+ waittime = 100
yield env.timeout(waittime) # Wait a bit before generating a new case
case += 1
# process.active_cases.append(case)
env.process(execute_case(env, case, process))
-def main():
- # Setup
- # we can use a random seed if we want to generate the same results every time (maybe useful later for the training)
- # random.seed(42)
- # initialize the number of resources
-
- process = []
- num_s = 1
- process.append(num_s)
- num_ot = 5
- process.append(num_ot)
- num_sh_a = 3
- process.append(num_sh_a)
- num_sh_b = 3
- process.append(num_sh_b)
- num_sh_c = 3
- process.append(num_sh_c)
- num_m_a = 3
- process.append(num_m_a)
- num_m_b = 2
- process.append(num_m_b)
- num_p_a = 4
- process.append(num_p_a)
- num_p_b = 5
- process.append(num_p_b)
- num_p_c = 4
- process.append(num_p_c)
- num_ds_a = 8
- process.append(num_ds_a)
- num_ds_b = 8
- process.append(num_ds_b)
- num_ds_c = 8
- process.append(num_ds_c)
-
- case = []
- for i in range(15):
- case.append(1)
-
- space = [process, case]
- activities = 16
-
- business_env = environment.BusinessProcessEnv(space, activities)
- print(business_env.observation_space.shape)
- print(business_env.observation_space.sample())
-
- state, _ = business_env.reset()
- print(state)
- print(business_env.current_state)
- print(state['event'])
- print(business_env.flatten_observation(state))
- agent.q_learning(space, activities)
-
-if __name__ == "__main__":
- main()
diff --git a/keras-rl b/keras-rl
new file mode 160000
index 0000000..216c314
--- /dev/null
+++ b/keras-rl
@@ -0,0 +1 @@
+Subproject commit 216c3145f3dc4d17877be26ca2185ce7db462bad
diff --git a/logs/1686571942/PPO_0/events.out.tfevents.1686571942.LAPTOP-LNRI6P3Q.21880.0 b/logs/1686571942/PPO_0/events.out.tfevents.1686571942.LAPTOP-LNRI6P3Q.21880.0
new file mode 100644
index 0000000000000000000000000000000000000000..d243451407cdcc11ce580a039e9c892ac579858f
GIT binary patch
literal 185766
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
I@zH%^0D3(Pvj6}9
literal 0
HcmV?d00001
--
GitLab