Optaplanner:扩展车辆路径示例以包括安全运输

时间:2014-11-20 15:28:12

标签: drools optaplanner

我想为每辆车添加一个简单的布尔值,指示车辆是否安全,然后为每个客户添加一个类似的布尔值,表明客户需要一辆安全的车辆。

到目前为止,我需要:

  • 扩展Vehicle和Customer的域对象以反映这些。
  • 将输入XML扩展为至少拥有一个安全Vehicle和一个需要安全集合的Customer。
  • 扩展vehicleRoutingScoreRules.drl以添加具有硬约束的新规则“secure”。

这有点可怜 - 但是我被推了一段时间,流氓手册很庞大,我无法弄清楚我认为是一个简单规则的语法。有些善良的灵魂请给我一个首发。

1 个答案:

答案 0 :(得分:2)

搞定了!

我做了以下事情:

  • 扩展Vehicle和Customer的域对象以反映这些。

    //Vehicle.java
    protected boolean secure;
    public boolean isSecure() {return secure;}
    public void setSecure(boolean secure) {this.secure = secure;}
    
    //Customer.java
    protected boolean needsSecure;
    public boolean isNeedsSecure() {return needsSecure;}
    public void setNeedsSecure(boolean needsSecure) {this.needsSecure = needsSecure;}
    
  • 将输入XML扩展为至少有一个安全Vehicle和一个需要安全集合的Customer。

    //cvrptw-25customers-secure.xml - cloned from cvrptw-25customers.xml
    <VrpVehicle id="56">
      <id>24</id>
      <capacity>200</capacity>
      <depot class="VrpTimeWindowedDepot" reference="30"/>
      <secure>true</secure>
    </VrpVehicle>
    
    <VrpTimeWindowedCustomer id="58">
     <id>1</id>
     <location reference="4"/>
     <demand>10</demand>
     <readyTime>912000</readyTime>
     <dueTime>967000</dueTime>
     <serviceDuration>90000</serviceDuration>
     <needsSecure>true</needsSecure>
    </VrpTimeWindowedCustomer>
    
  • 扩展vehicleRoutingScoreRules.drl以添加新规则&#34; secure&#34;有一个严格的约束。

    rule "securePackage"
      when
        $customer : Customer(needsSecure == true, vehicle != null, vehicle.isSecure == false)
      then
        scoreHolder.addHardConstraintMatch(kcontext, -1);
    end
    

一切正常!随着3&#34;安全&#34;总需求的客户=总安全车辆容量我可以看到一辆车(安全车辆)完成了所有3个车辆并且已满。