Hi,
I must find start and end times for orders on different equipment's in requirement of
a stock.
What can I do better to get faster a solution.
I read the forum entries but it don't helps.
- Scheduling events with varying durations - corrupted score
- Time Slots vs Time Periods
Graphics and detail description in the pdf.
Domain model
@PlanningEntity
EquipmentAllocation has a Equipment
EquipmentAllocation has a Order
EquipmentAllocation has a TimeSlot
------------------------------------------------------
@PlanningVariable
Order
Attribute: quantity
------------------------------------------------------
TimeSlot
Attribute: startTime, endTime, duration, sequenceNumber
------------------------------------------------------
Material
Attribute: stock, minStock, maxStock
------------------------------------------------------
Material Demand has a TimeSlot
Attribute: quantity
------------------------------------------------------
Conditions:
- Order is executable on each equipment.
- Orders has different sizes.
- Order running time is depending of the material and the equipment.
- Gaps between orders are possible if there is no demand.
- Gaps between orders are possible when there is a equipment setup time.
- Parallel orders with same material on different equipment's are possible.
Target:
- Calculate start and endtims for an order.
- Start and endtime is precisely one minute (maximum five minutes if runtime is to
long).
- Satisfy only the demand of a material.
- Good result in 5 minutes.
- No exceed min or max stock.
Plan data:
- Plan for 24 hours.
- Plan 35 orders (normal order time is 2 hours).
- Plan 5 demands with different materials (7 orders per demand).
- Plan 3 equipment's.
Problem:
- No result in 5 minutes.
- Concept with timeslots has to many possible order positions.
- No restrictions are possible to find the best solution.
Use a pillar swap to create the possible order positions on each equipment.
Use a pillar swap to lay the order over a lot of timeslots on a equipment.
Example:
- 1 order (with 2 hours)
- 1 equipment
- 24 hours planning time with 1 timeslot per minute
- Possible order positions = 22 * 60 = 1320 (on one equipment)
- Possible order positions = 1320 * 3 = 3960 (on three equipment)
- Possible order positions = 3960 * 35 = 138.600 (all orders on all equipment)
rule "Check order not allocate to less."
when
$f : Order( $quantity : quantity , $m : material )
$result : Number( (intValue > 0) && ( intValue < $quantity )
)
from accumulate(
EquipmentAllocation( order != null && order == $f , $sp :
equipment.speedMap ),
sum($sp.get($m))
)
then
int hard = $result.intValue() - $quantity;
scoreHolder.addHardConstraintMatch(kcontext, hard );
end
rule "Check order not allocate to many."
when
$f : Order( $quantity : quantity , $m : material )
$result : Number( (intValue > 0) && ( intValue > $quantity )
)
from accumulate(
EquipmentAllocation(order != null && order == $f , $map :
equipment.orderMap )
sum( $map.get( $f ))
)
then
int hard = $quantity - $result.intValue();
scoreHolder.addHardConstraintMatch(kcontext, hard );
end
rule "Check demand"
when
$m : Material( $stock : stock )
$t : TimeSlot( $sequence : sequence )
$sumDemand : Number( )
from accumulate (
Demand ( timeSlot.sequence <= $sequence , material == $m ,
$quantity : quantity )
sum( $quantity )
)
$sumAllocation : Number( ($stock + intValue - $sumDemand.intValue()) <
0 )
from accumulate (
EquipmentAllocation( (order != null && order.material ==
$m) , timeSlot.sequence <= $sequence , $sp : equipment.speedMap),
sum( $sp.get($m) )
)
then
scoreHolder.addHardConstraintMatch(kcontext, -1);
end
rule "Check min stock"
when
$m : Material( $stock : stock , $minStock : minStock, $maxStock : maxStock
)
$t : TimeSlot( $sequenceT : sequence )
$sumDemand : Number( )
from accumulate (
Demand ( timeSlot.sequence <= $sequenceT , material == $m ,
$quantityDemand : quantity )
sum( $quantityDemand )
)
$sumAllocation : Number( ($stock + (intValue) - $sumDemand.intValue())
< $minStock )
from accumulate (
EquipmentAllocation( order != null , order.material == $m ,
timeSlot.sequence <= $sequenceT , $sp : equipment.speedMap ),
sum( $sp.get($m) )
)
then
scoreHolder.addHardConstraintMatch(kcontext, -1);
end
rule "Check max stock"
when
$t : TimeSlot( $sequence : sequence )
$m : Material( $stock : stock , $maxStock : maxStock )
$sumDemand : Number( )
from accumulate (
Demand ( timeSlot.sequence <= $sequence , material == $m,
$quantityDemand : quantity)
sum( $quantityDemand )
)
$sumAllocation : Number( ($stock + intValue - $sumDemand.intValue()) >
$maxStock )
from accumulate (
EquipmentAllocation( (order != null && order.material ==
$m) , timeSlot.sequence <= $sequence , $sp : equipment.speedMap ),
sum( $sp.get($m) )
)
then
scoreHolder.addHardConstraintMatch(kcontext, -1);
end
Gruß
Michael Mohr
Software Engineer
________________________________
CONFIDENTIALITY : This e-mail and any attachments are confidential and may be privileged.
If you are not a named recipient, please notify the sender immediately and delete the
e-mail from your system. You are not authorized to disclose the contents to another
person, to use it for any purpose or store or copy the information in any medium.
Show replies by date