Из того, что я понял, вы пытаетесь добавить больше измерений к demand
и, следовательно, к capacity
, где ограничение состоит в том, что ни одна из возможностей любого измерения не может быть превышена.Чтобы достичь этого, вы можете просто изменить Vehicle
и Customers
следующим образом
class Vehicle extends AbstractPersistable implements Standstill{
protected Location location;
protected List<Integer> capacities;
...
}
и
class Customer extends AbstractPersistable implements Standstill{
protected List<Integer> demands;
...
}
Затем в Drools вы изменяете свое правило (абсолютно не проверенное; вв частности, вам, возможно, придется добавить .intValue()
после методов get):
rule "vehicleCapacity"
when
$vehicle : Vehicle($capacity: capacities.get($loadType:lt))
accumulate(
Customer(
vehicle == $vehicle,
$demand : demands.get($loadType));
$demandTotal : sum($demand);
$demandTotal > $capacity
)
then
scoreHolder.addHardConstraintMatch(kcontext, $capacity - $demandTotal);
Это позволит убедиться, что если спрос превысит емкость для любого измерения , жесткий результат будет оштрафован наразница.Просто убедитесь, что все списки имеют одинаковый размер с размером $loadType
в capacities
, соответствующем одному и тому же измерению в demands
.
Вы также можете попробовать, просто изменив protected int capacity
на protected int[] capacities
в Vehicle
и аналогично в Customer
с demand
, но я не уверен, что вы можете связывать элементы массива в Drools,Возможно, стоит попробовать: тогда правило Drools запускается так (снова абсолютно не проверено):
rule "vehicleCapacity"
when
$vehicle : Vehicle($capacity: capacities[$lt:lt])
accumulate(
Customer(
vehicle == $vehicle,
$demand : demands[lt]);
$demandTotal : sum($demand);
$demandTotal > $capacity
)
then
scoreHolder.addHardConstraintMatch(kcontext, $capacity - $demandTotal);
(тогда, по крайней мере, .intValue()
не нужно)