Skip to content

Instantly share code, notes, and snippets.

@MarcoPolo
Forked from bern/projectpart1.clp
Created March 31, 2014 22:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MarcoPolo/9903723 to your computer and use it in GitHub Desktop.
Save MarcoPolo/9903723 to your computer and use it in GitHub Desktop.
(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