-
-
Save MarcoPolo/9903723 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(deffacts cities | |
(city-list tallahassee lake-city gainesville jacksonville st-augustine ocala orlando tampa west-palm ft-myers miami key-west) | |
(city name tallahassee neighbors lake-city 2) | |
(city name lake-city neighbors tallahassee 2 jacksonville 1 gainesville 1) | |
(city name gainesville neighbors lake-city 1 ocala 1 st-augustine 1) | |
(city name jacksonville neighbors lake-city 1 st-augustine 1) | |
(city name st-augustine neighbors jacksonville 1 gainesville 1 orlando 2 west-palm 3) | |
(city name ocala neighbors gainesville 1 orlando 1 tampa 2) | |
(city name orlando neighbors ocala 1 st-augustine 2 tampa 1 west-palm 3) | |
(city name tampa neighbors ft-myers 2 orlando 1 ocala 2) | |
(city name west-palm neighbors orlando 3 st-augustine 3 ft-myers 3 miami 2) | |
(city name ft-myers neighbors tampa 2 west-palm 3) | |
(city name miami neighbors west-palm 2 key-west 3) | |
(city name key-west neighbors miami 3)) | |
(deffacts trucks | |
(truck number 6 currentcity orlando destination null action idle capacity 6 packagenum null trucktime 0) | |
(truck number 5 currentcity orlando destination null action idle capacity 12 packagenum null trucktime 0) | |
(truck number 4 currentcity orlando destination null action idle capacity 10 packagenum null trucktime 0) | |
(truck number 3 currentcity orlando destination null action idle capacity 6 packagenum null trucktime 0) | |
(truck number 2 currentcity orlando destination null action idle capacity 8 packagenum null trucktime 0) | |
(truck number 1 currentcity orlando destination null action idle capacity 10 packagenum null trucktime 0) | |
(truck-list 1 2 3 4 5 6) | |
; wait-time = wait-time + (global-time - truck-time) whenever a package is assigned to a truck | |
; busy-time = busy-time + (truck-time + pathdist) whenever a truck goes to pickup, deliver, or return | |
; percent-busy = (busy-time / (wait-time + busy-time)) * 100 | |
; num-packages = num-packages + 1 whenever a package is assigned to a truck | |
; total-percent-used = total-percent-used + (packageweight / truckcapacity) whenever a package is assigned to a truck | |
; average-percent-used = total-percent-used / numpackages | |
; percent-delivering = (delivery / busy-time) * 100 | |
(truck-report number 1 wait-time 0 busy-time 0 percent-busy 0 num-packages 0 total-percent-used 0 average-percent-used 0 non-delivery 0 delivery 0 percent-delivering 0) | |
(truck-report number 2 wait-time 0 busy-time 0 percent-busy 0 num-packages 0 total-percent-used 0 average-percent-used 0 non-delivery 0 delivery 0 percent-delivering 0) | |
(truck-report number 3 wait-time 0 busy-time 0 percent-busy 0 num-packages 0 total-percent-used 0 average-percent-used 0 non-delivery 0 delivery 0 percent-delivering 0) | |
(truck-report number 4 wait-time 0 busy-time 0 percent-busy 0 num-packages 0 total-percent-used 0 average-percent-used 0 non-delivery 0 delivery 0 percent-delivering 0) | |
(truck-report number 5 wait-time 0 busy-time 0 percent-busy 0 num-packages 0 total-percent-used 0 average-percent-used 0 non-delivery 0 delivery 0 percent-delivering 0) | |
(truck-report number 6 wait-time 0 busy-time 0 percent-busy 0 num-packages 0 total-percent-used 0 average-percent-used 0 non-delivery 0 delivery 0 percent-delivering 0)) | |
(deffacts packages | |
(pkg num 1 pickup orlando destination jacksonville weight 4 arrivaltime 1 expecteddelivery 15 status tbd) | |
(pkg num 2 pickup tampa destination st-augustine weight 4 arrivaltime 4 expecteddelivery 10 status tbd) | |
(pkg num 3 pickup key-west destination miami weight 3 arrivaltime 8 expecteddelivery 25 status tbd) | |
(pkg num 4 pickup miami destination orlando weight 5 arrivaltime 20 expecteddelivery 30 status tbd) | |
(pkg num 5 pickup ocala destination orlando weight 7 arrivaltime 30 expecteddelivery 40 status tbd) | |
(pkg num 6 pickup orlando destination lake-city weight 6 arrivaltime 40 expecteddelivery 45 status tbd) | |
(pkg num 7 pickup jacksonville destination tallahassee weight 8 arrivaltime 65 expecteddelivery 80 status tbd) | |
(pkg num 8 pickup tallahassee destination gainesville weight 4 arrivaltime 80 expecteddelivery 100 status tbd) | |
(pkg num 9 pickup st-augustine destination tallahassee weight 5 arrivaltime 90 expecteddelivery 110 status tbd) | |
(pkg num 10 pickup west-palm destination ft-myers weight 1 arrivaltime 110 expecteddelivery 120 status tbd) | |
(pkg num 11 pickup ocala destination ft-myers weight 1 arrivaltime 110 expecteddelivery 120 status tbd) | |
(pkg num 12 pickup jacksonville destination key-west weight 2 arrivaltime 120 expecteddelivery 150 status tbd) | |
(pkg num 13 pickup miami destination ocala weight 2 arrivaltime 150 expecteddelivery 155 status tbd) | |
(pkg num 14 pickup miami destination gainesville weight 5 arrivaltime 150 expecteddelivery 160 status tbd) | |
(pkg num 15 pickup miami destination tallahassee weight 2 arrivaltime 150 expecteddelivery 170 status tbd) | |
(pkg num 16 pickup tallahassee destination lake-city weight 2 arrivaltime 200 expecteddelivery 210 status tbd) | |
(pkg num 17 pickup lake-city destination tallahassee weight 7 arrivaltime 220 expecteddelivery 240 status tbd) | |
(pkg num 18 pickup tallahassee destination key-west weight 9 arrivaltime 240 expecteddelivery 300 status tbd) | |
(pkg num 19 pickup st-augustine destination gainesville weight 8 arrivaltime 250 expecteddelivery 260 status tbd) | |
(pkg num 20 pickup tampa destination jacksonville weight 1 arrivaltime 250 expecteddelivery 270 status tbd) | |
(pkg-list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) | |
(avg-report wait-total 0 wait-average 0 num-on-time 0 num-late 0 total-lateness 0 ave-lateness 0) | |
(assigned ) ) | |
;****************************** | |
; PART TWO | |
;****************************** | |
; Initializes a global-timer once all shortest paths have been created | |
(defrule init | |
(declare (salience -1)) | |
?init <- (initial-fact) | |
=> | |
(retract ?init) | |
(printout t "*******************************************" crlf) | |
(assert (global-time 0)) ) | |
; Updates the global-timer to the next package available | |
(defrule update-clock | |
(declare (salience -1)) | |
?gtime <- (global-time ?curtime) | |
(pkg $? arrivaltime ?next $? status tbd) | |
(assigned $?assigned &: (neq (length $?assigned) 20)) | |
(not (pkg $? arrivaltime ?time &:(< ?time ?next) $? status tbd)) | |
=> | |
(retract ?gtime) | |
(assert (global-time ?next)) ) | |
; Detects when the simulation has finished, updates wait-time for trucks in Orlando when the simulation finishes, | |
; and generates a 'final-report' fact from a truck-report | |
(defrule finish | |
(declare (salience -2)) | |
(global-time ?final-time) | |
(truck number ?trucknum $? trucktime ?trucktime $?) | |
?truck-report <- (truck-report number ?trucknum wait-time ?waittime $?savedata) | |
=> | |
(retract ?truck-report) | |
(assert (final-report number ?trucknum wait-time (+ ?waittime (- ?final-time ?trucktime)) $?savedata)) ) | |
; Prints truck-reports for those trucks that have delivered at least one package | |
(defrule generate-truck-report | |
(declare (salience -2)) | |
?t-list <- (truck-list ?trucknum $?savedata) | |
?truck-report <- (final-report number ?trucknum wait-time ?waittime busy-time ?busytime percent-busy ? num-packages ?numpackages total-percent-used ?tpu &:(neq ?tpu 0) average-percent-used ? non-delivery ?nondelivery delivery ?delivery percent-delivering ?) | |
=> | |
(retract ?truck-report) | |
(retract ?t-list) | |
(assert (truck-list $?savedata)) | |
(printout t "TRUCK " ?trucknum " REPORT"crlf"Total Wait Time: " ?waittime crlf "Total Busy Time: " ?busytime crlf "Percent of Time Busy: " (* (/ ?busytime (+ ?waittime ?busytime)) 100) "%" crlf "Number of Packages Delivered: " ?numpackages crlf "Average Truck Occupancy: " (/ ?tpu ?numpackages) "%" crlf "Non-Delivery Travel Time: " ?nondelivery crlf "Delivery Travel Time: " ?delivery crlf "Percent Time Delivering: " (* (/ ?delivery ?busytime) 100) "%" crlf "*******************************************" crlf)) | |
; Prints truck-reports for those trucks that have delivered no packages | |
(defrule generate-truck-report-zero | |
(declare (salience -2)) | |
?t-list <- (truck-list ?trucknum $?savedata) | |
?truck-report <- (final-report number ?trucknum wait-time ?waittime busy-time ?busytime percent-busy ? num-packages 0 total-percent-used ?tpu average-percent-used ? non-delivery ?nondelivery delivery ?delivery percent-delivering ?) | |
=> | |
(retract ?truck-report) | |
(retract ?t-list) | |
(assert (truck-list $?savedata)) | |
(printout t "TRUCK " ?trucknum " REPORT"crlf"Total Wait Time: " ?waittime crlf "Total Busy Time: " ?busytime crlf "Percent of Time Busy: " (* (/ ?busytime (+ ?waittime ?busytime)) 100) "%" crlf "Number of Packages Delivered: 0" crlf "Average Truck Occupancy: 0.0%" crlf "Non-Delivery Travel Time: " ?nondelivery crlf "Delivery Travel Time: " ?delivery crlf "Percent Time Delivering: 0.0%" crlf "*******************************************" crlf)) | |
; Prints package-reports | |
(defrule generate-package-report | |
(declare (salience -2)) | |
?p-list <- (pkg-list ?pkgnum $?savedata) | |
?package-report <- (package-report number ?pkgnum wait-time ?waittime pickup-time ?pickuptime delivery-time ?delivertime status ?pkgstatus late-by ?latestatus) | |
=> | |
(retract ?package-report) | |
(retract ?p-list) | |
(assert (pkg-list $?savedata)) | |
(printout t "PACKAGE " ?pkgnum " REPORT" crlf"Wait Time: " ?waittime crlf "Pickup Time: " ?pickuptime crlf "Delivery Time: " ?delivertime crlf "Package Status: " ?pkgstatus crlf "Late By: " ?latestatus crlf "**************************" crlf)) | |
; Prints average-report | |
(defrule generate-average-report | |
(declare (salience -3)) | |
?avg <- (avg-report wait-total ?wait-total $? num-late ?num-late total-lateness ?total-lateness $?) | |
=> | |
(printout t "PACKAGE AVERAGE REPORT" crlf "Average Wait Time: " (/ ?wait-total 20) crlf "Number of On-Time Deliveries: " (- 20 ?num-late) crlf "Number of Late Deliveries: " ?num-late crlf "Average Lateness for Late Packages: " (/ ?total-lateness ?num-late) crlf "Average Lateness for All Packages: " (/ ?total-lateness 20) crlf "*******************************************" crlf "*******************************************" crlf)) | |
; Assigns a newly-available package to the first available truck and sets the truck to status: pickup | |
(defrule assign-package | |
(global-time ?time) | |
?a-list <- (assigned $?assigned-packages) | |
?package <- (pkg num ?number pickup ?pkgorigin destination ?pkgdest weight ?weight arrivaltime ?arrivaltime &:(<= ?arrivaltime ?time) ?x ?y status tbd) | |
?truck <- (truck number ?trucknumber $? action idle capacity ?cap &:(>= ?cap ?weight) $? trucktime ?trucktime &:(<= ?trucktime ?time)) | |
?truck-report <- (truck-report number ?trucknumber wait-time ?curwaittime $?savedata1 num-packages ?numpackages total-percent-used ?tpu $?savedata2) | |
=> | |
(retract ?truck) | |
(retract ?package) | |
(retract ?a-list) | |
(assert (assigned $?assigned-packages ?number)) | |
(retract ?truck-report) | |
(assert (pkg num ?number pickup ?pkgorigin destination ?pkgdest weight ?weight arrivaltime ?arrivaltime ?x ?y status arrived)) | |
(assert (truck-report number ?trucknumber wait-time (+ ?curwaittime (- ?time ?trucktime)) $?savedata1 num-packages (+ ?numpackages 1) total-percent-used (+ ?tpu (* (/ ?weight ?cap) 100)) $?savedata2)) | |
(assert (truck number ?trucknumber currentcity orlando destination ?pkgorigin action pickup capacity (- ?cap ?weight) packagenum ?number trucktime ?time)) ) | |
; Simulates the truck traveling from Orlando to the package's origin and sets the truck to status: deliver | |
(defrule pickup | |
?truck <- (truck number ?trucknum currentcity orlando destination ?pkgorigin action pickup capacity ?cap packagenum ?pkgnum trucktime ?trucktime) | |
(pkg num ?pkgnum pickup ?pkgorigin destination ?pkgdest weight ? arrivaltime ?pkgarrival expecteddelivery ? status arrived) | |
?truck-report <- (truck-report number ?trucknum $?savedata1 busy-time ?busytime $?savedata2 non-delivery ?non-delivery $?savedata3) | |
(path orlando ?pkgorigin ?pathdist) | |
?avg <- (avg-report wait-total ?wait-total $?avgdata) | |
=> | |
(retract ?truck) | |
(retract ?truck-report) | |
(retract ?avg) | |
(assert (avg-report wait-total (+ ?wait-total (- (+ ?trucktime ?pathdist) ?pkgarrival)) $?avgdata)) | |
(assert (package-report number ?pkgnum wait-time (- (+ ?trucktime ?pathdist) ?pkgarrival) pickup-time (+ ?trucktime ?pathdist) delivery-time null status on-time late-by N/A)) | |
(assert (truck-report number ?trucknum $?savedata1 busy-time (+ ?busytime ?pathdist) $?savedata2 non-delivery (+ ?non-delivery ?pathdist) $?savedata3)) | |
(assert (truck number ?trucknum currentcity ?pkgorigin destination ?pkgdest action deliver capacity ?cap packagenum ?pkgnum trucktime (+ ?trucktime ?pathdist))) ) | |
; Simulates the truck traveling from the package's origin to the package's destination and sets the truck to status: return | |
(defrule deliver | |
?truck <- (truck number ?trucknum currentcity ?pkgorigin destination ?pkgdest action deliver capacity ?cap packagenum ?pkgnum trucktime ?trucktime) | |
(pkg num ?pkgnum pickup ?pkgorigin destination ?pkgdest weight ? arrivaltime ? expecteddelivery ?expected status arrived) | |
?truck-report <- (truck-report number ?trucknum $?savedata1 busy-time ?busytime $?savedata2 delivery ?delivery $?savedata3) | |
?pkg-report <- (package-report number ?pkgnum $?pkgdata1 delivery-time null status on-time late-by N/A) | |
(path ?pkgorigin ?pkgdest ?pathdist) | |
=> | |
(retract ?truck) | |
(retract ?truck-report) | |
(retract ?pkg-report) | |
(assert (package-report number ?pkgnum $?pkgdata1 delivery-time (+ ?trucktime ?pathdist) status on-time late-by N/A)) | |
(assert (truck-report number ?trucknum $?savedata1 busy-time (+ ?busytime ?pathdist) $?savedata2 delivery (+ ?delivery ?pathdist) $?savedata3)) | |
;(printout t "Package " ?pkgnum " delivered by truck " ?trucknum " at time " (+ ?trucktime ?pathdist) ", " (- ?expected (+ ?trucktime ?pathdist)) " minutes ahead of schedule" crlf) | |
(assert (truck number ?trucknum currentcity ?pkgdest destination orlando action return capacity ?cap packagenum ?pkgnum trucktime (+ ?trucktime ?pathdist))) ) | |
; Determines whether or not the package was delivered late, and adjusts the package-report fields appropriately | |
(defrule check-late | |
?pkg-report <- (package-report number ?pkgnum $?pkgdata1 delivery-time ?deliv-time &:(neq ?deliv-time null) status on-time ? ?) | |
?package <- (pkg num ?pkgnum $? expecteddelivery ?expected &:(> ?deliv-time ?expected) $?) | |
?avg <- (avg-report $?savedata1 num-late ?num-late total-lateness ?total-lateness ave-lateness 0) | |
=> | |
(retract ?pkg-report) | |
(retract ?avg) | |
(assert (avg-report $?savedata1 num-late (+ ?num-late 1) total-lateness (+ ?total-lateness (- ?deliv-time ?expected)) ave-lateness 0)) | |
(assert (package-report number ?pkgnum $?pkgdata1 delivery-time ?deliv-time status late late-by (- ?deliv-time ?expected))) ) | |
; Simulates the truck traveling from the package's destination to Orlando and sets the truck to status: idle | |
(defrule return | |
?truck <- (truck number ?trucknum currentcity ?pkgdest destination orlando action return capacity ?cap packagenum ?pkgnum trucktime ?trucktime) | |
?package <- (pkg num ?pkgnum pickup ?pkgorigin destination ?pkgdest weight ?weight arrivaltime ? expecteddelivery ? status arrived) | |
(path ?pkgdest orlando ?pathdist) | |
?truck-report <- (truck-report number ?trucknum $?savedata1 busy-time ?busytime $?savedata2 non-delivery ?non-delivery $?savedata3) | |
=> | |
(retract ?truck) | |
(retract ?truck-report) | |
(assert (delivered ?pkgnum (+ ?trucktime ?pathdist))) | |
(assert (truck-report number ?trucknum $?savedata1 busy-time (+ ?busytime ?pathdist) $?savedata2 non-delivery (+ ?non-delivery ?pathdist) $?savedata3)) | |
(assert (truck number ?trucknum currentcity orlando destination null action idle capacity (+ ?cap ?weight) packagenum null trucktime (+ ?trucktime ?pathdist))) ) | |
; Ascertains the final time of the simulation | |
(defrule final-time | |
(assigned $?assignedlist &:(= (length $?assignedlist) 20)) | |
(delivered ?pkgnum ?deliverytime) | |
?g-time <- (global-time ?curtime &:(> ?deliverytime ?curtime)) | |
=> | |
(retract ?g-time) | |
(assert (global-time ?deliverytime)) ) | |
;****************************** | |
; PART ONE | |
;****************************** | |
; Creates all initial pairings of cities on the graph with their neighbors | |
(defrule pair-up | |
(declare (salience 1)) | |
(city name ?origin neighbors $? ?destination ?distance &:(integerp ?distance) $?) | |
=> | |
(assert (path ?origin ?destination ?distance)) | |
(assert (path ?origin ?origin 0)) ) | |
; Creates a path to and from each city | |
(defrule create-initial-paths | |
(city-list $? ?city1 $? ?city2 $?) | |
(or (and(path ?city1 ?x ?dist1) | |
(path ?x ?city2 ?dist2)) | |
(and(path ?city2 ?x ?dist1) | |
(path ?x ?city1 ?dist2))) | |
(not (path ?city1 ?city2 ?)) | |
=> | |
(assert (path ?city1 ?city2 (+ ?dist1 ?dist2))) | |
(assert (path ?city2 ?city1 (+ ?dist1 ?dist2))) ) | |
; Combines preexisting paths using shared midpoints (e.g. 1->2 and 2->3 becomes 1->3) | |
; in an attempt to find the shortest possible path to and from all cities | |
(defrule floyd-warshall | |
(city-list $? ?city1 $? ?city2 $?) | |
(or (and(path ?city1 ?x ?dist1) | |
(path ?x ?city2 ?dist2)) | |
(and(path ?city2 ?x ?dist1) | |
(path ?x ?city1 ?dist2))) | |
?oldpath <- (path ?city1 ?city2 ?dist3 &:(> ?dist3 (+ ?dist1 ?dist2))) | |
=> | |
(retract ?oldpath) | |
(assert (path ?city1 ?city2 (+ ?dist1 ?dist2))) | |
(assert (path ?city2 ?city1 (+ ?dist1 ?dist2))) ) | |
; Deletes every path other than the shortest path to and from every city | |
(defrule mortal-kombat | |
?finishhim <- (path ?a ?b ?d) | |
(path ?a ?b ?d2 &:(> ?d ?d2)) | |
=> | |
(retract ?finishhim) ) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment