Skip to content

Commit

Permalink
fixed bugs in priority queue and canceling resoure requests
Browse files Browse the repository at this point in the history
  • Loading branch information
NaimaSadeghi committed Dec 16, 2021
1 parent 96b9e4c commit c24d922
Show file tree
Hide file tree
Showing 5 changed files with 217 additions and 31 deletions.
89 changes: 89 additions & 0 deletions src/des_tests/Earth Moving 2-plus breakdown (1).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#******Earth moving simulation(plus breakdown)******* (meeting #17)
import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)

import pmpy.des as des
import numpy as np
def truck_process(truck: des.entity,loader_1,loader_2,dumped_dirt):
while True:
yield truck.get(loader_1,1,2)|truck.get(loader_2,1,2)
yield truck.do("wait",0)
if truck.not_pending(loader_1):
L=loader_1
truck.cancel(loader_2,1)
elif truck.not_pending(loader_2):
L=loader_2
truck.cancel(loader_1,1)
if truck.env.now>500:
print("here")
start_load_list.append(env.now)
yield truck.do("loading",truck.attr["load_dur"])
if truck.env.now>500:
print("here")
if L not in truck.using_resources:
print("why")
yield truck.put(L,1)
if dumped_dirt.level()>10000:
break
yield truck.add(dumped_dirt,truck.attr["capacity"])
start_haul_list.append(env.now)
yield truck.do("hauling",truck.attr["haul_dur"])
yield truck.do("dumping",truck.attr["dump_dur"])
yield truck.do("returning",truck.attr["return_dur"])

def loader_breakdown_proc(repair_man,loader):
while True:
yield repair_man.do("wait",loader.attr['time_betwin_break'])
yield repair_man.get(loader,1,1)
yield repair_man.do("repairing",loader.attr['time_to_fix'])
yield repair_man.put(loader,1)



env=des.environment()
dumped_dirt=des.resource(env,"dumped_dirt",init=0,capacity=150000)
start_load_list=[]
start_haul_list=[]
large_trucks=[]
small_trucks=[]
loader_1=des.priority_resource(env,"Loader1",1,print_actions=True)
loader_1.attr['time_betwin_break']=500
loader_1.attr['time_to_fix']=20
loader_2=des.priority_resource(env,"Loader2",1,print_actions=True)
loader_2.attr['time_betwin_break']=600
loader_2.attr['time_to_fix']=25
for i in range(4):
large_trucks.append(des.entity(env,"truck"))
large_trucks[i].attr["capacity"]=20
large_trucks[i].attr["load_dur"]=5
large_trucks[i].attr["haul_dur"]=35
large_trucks[i].attr["dump_dur"]=2
large_trucks[i].attr["return_dur"]=20
p=env.process(truck_process(large_trucks[i],loader_1,loader_2,dumped_dirt))
for i in range(3):
small_trucks.append(des.entity(env,"truck"))
small_trucks[i].attr["capacity"]=15
small_trucks[i].attr["load_dur"]=3
small_trucks[i].attr["haul_dur"]=25
small_trucks[i].attr["dump_dur"]=1.5
small_trucks[i].attr["return_dur"]=13
env.process(truck_process(small_trucks[i],loader_1,loader_2,dumped_dirt))


repair_man=des.entity(env,"repair_man",print_actions=True)
env.process(loader_breakdown_proc(repair_man,loader_1))
env.process(loader_breakdown_proc(repair_man,loader_2))
env.run(until=p)
production_rate=(dumped_dirt.level()/env.now)
print("Production Rate is:",production_rate,"m3/minute")
l2=np.array(start_load_list)
l1=np.array(start_haul_list)
#loader_utilization_time=l1-l2
#loader_utilization_sum=(sum(loader_utilization_time))
#loader_utilization=(loader_utilization_sum/env.now)
#print("Loader Utilization is:",loader_utilization)
#loader_idleness=1-loader_utilization
#print("Loader Idleness is:",loader_idleness)
print("simulation time: ",env.now)
24 changes: 0 additions & 24 deletions src/des_tests/example.py

This file was deleted.

114 changes: 114 additions & 0 deletions src/des_tests/pr_cpm (1).py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)

import pmpy.des as des

def prcpm(list_priority):
def a0(e,r):
yield e.get(r, 1,list_pr[0])
yield e.do("activity0",3)
yield e.put(r,1)
e.attr["finish_time"]=env.now



def a1(e,r):
yield p0
if en[0].attr["finish_time"]==env.now:
en[0].attr["critical"]=True
else:
en[0].attr["critical"]=False
yield e.get(r, 3,list_pr[1])
yield e.do("activity1",6)
yield e.put(r,3)
e.attr["finish_time"]=env.now

def a2(e,r):
yield p0
if en[0].attr["finish_time"]==env.now:
en[0].attr["critical"]=True
else:
en[0].attr["critical"]=False
yield e.get(r, 2,list_pr[2])
yield e.do("activity2",5)
yield e.put(r,2)
e.attr["finish_time"]=env.now
def a3(e,r):
yield p1&p2
if en[1].attr["finish_time"]==env.now:
en[1].attr["critical"]=True
else:
en[1].attr["critical"]=False
if en[2].attr["finish_time"]==env.now:
en[2].attr["critical"]=True
else:
en[2].attr["critical"]=False
yield e.get(r, 3,list_pr[3])
yield e.do("activity3",1)
yield e.put(r,3)
e.attr["finish_time"]=env.now

def a4(e,r):
yield p1
if en[1].attr["finish_time"]==env.now:
en[1].attr["critical"]=True
else:
en[1].attr["critical"]=False
yield e.get(r, 1,list_pr[4])
yield e.do("activity4",3)
yield e.put(r,1)
e.attr["finish_time"]=env.now

def a5(e,r):
yield p2
if en[2].attr["finish_time"]==env.now:
en[2].attr["critical"]=True
else:
en[2].attr["critical"]=False
yield e.get(r, 2,list_pr[5])
yield e.do("activity5",4)
yield e.put(r,2)
e.attr["finish_time"]=env.now


def a6(e,r):
yield p4&p5&p3
if en[3].attr["finish_time"]==env.now:
en[3].attr["critical"]=True
else:
en[3].attr["critical"]=False
if en[4].attr["finish_time"]==env.now:
en[4].attr["critical"]=True
else:
en[4].attr["critical"]=False
if en[5].attr["finish_time"]==env.now:
en[5].attr["critical"]=True
else:
en[5].attr["critical"]=False
yield e.get(r, 2,list_pr[6])
yield e.do("activity6",2.5)
yield e.put(r,2)
e.attr["finish_time"]=env.now
e.attr["critical"]=True
env=des.environment()
en=env.create_entities("e",7,True,True)


res=des.priority_resource(env,"pr_resourse",init=4)

p0=env.process(a0(en[0],res))
p1=env.process(a1(en[1],res))
p2=env.process(a2(en[2],res))
p3=env.process(a3(en[3],res))
p4=env.process(a4(en[4],res))
p5=env.process(a5(en[5],res))
p6=env.process(a6(en[6],res))

env.run()
return(env.now)


list_pr=[1,2,1,1,3,1,1]
print(prcpm(list_pr))
4 changes: 2 additions & 2 deletions src/des_tests/test_repair_earthmoving.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@ def repairPorcess(e,loader,workedHours):
workedHours=d.resource(env,'workedHours',init=0,capacity=2000,print_actions=True)

truckent=d.entity(env,'smallTruck',print_actions=True)
truckent.attr['loadingDur']=dist.norm(5,4)
truckent.attr['loadingDur']=dist.uniform(4,5)
truckent.attr['haulingDur']=dist.uniform(10,14)
truckent.attr['DumpingDur']=4
truckent.attr['capacity']=80

truckent2=d.entity(env,'bigTruck',print_actions=True)
truckent2.attr['loadingDur']=dist.norm(7,4)
truckent2.attr['loadingDur']=dist.uniform(4,7)
truckent2.attr['haulingDur']=dist.uniform(12,16)
truckent2.attr['DumpingDur']=5
truckent2.attr['capacity']=100
Expand Down
17 changes: 12 additions & 5 deletions src/pmpy/des.py
Original file line number Diff line number Diff line change
Expand Up @@ -697,7 +697,7 @@ def _check_all_requests(self):
r=self.request_list.pop(0) #remove the first element from the list
simpy_request=self.container.get(r.amount)
yield simpy_request
r.entity.pending_requests.remove(r)
r.entity.pending_requests.remove(r)
r.flag.put(1)
super()._get(r.entity,r.amount)
if self.log:
Expand Down Expand Up @@ -841,10 +841,17 @@ def _check_all_requests(self):
r.entity._waiting_log=append(r.entity._waiting_log,[[self.id,r.time,self.env.now,r.amount]],axis=0)

def cancel(self,priority_request):
if priority_request in self.request_list:
self.request_list.remove(priority_request)
else:
print("warning: the priority request can not be cancled as it is not in the request list")
#***the followig code did not work***
#if priority_request in self.request_list:
#self.request_list.remove(priority_request)
#remove does not work since it uses equal defined in the priority resource class
for i in range(len(self.request_list)):
pr=self.request_list[i]
if pr.entity==priority_request.entity and pr.amount==priority_request.amount:
del self.request_list[i]
return

print("warning: the priority request can not be cancled as it is not in the request list")


def add(self,entity,amount):
Expand Down

0 comments on commit c24d922

Please sign in to comment.