Optaplanner / маршрутизация транспортных средств в зависимости от времени / учет списка временных окон операций клиентов, относящихся к действиям

Уважаемые пользователи OptaPlanner,

Я использую в качестве основы пример маршрутизации транспортных средств в зависимости от времени. Здесь я удалил все классы TimeWindowed, например. содержимое «TimeWindowedActivity.java» перемещается и объединяется с «Activity.java» и т. д.

Теперь я хотел бы добавить список окон времени работы клиента для определенных действий. Эти временные окна (количество элементов Списка) могут быть разными для каждого действия, а некоторые действия вообще не имеют таких тегов. Это расширение должно позволять учитывать, что действия могут выполняться только в том случае, если они соответствуют тому, что время прибытия лежит между определенным числом (списком) временных окон операций клиента, определяемых: «customerOperationStartTime» и «customerOperationEndTime».

Для решения этой проблемы я создал класс "CustomerOperationTimes.java":

public class CustomerOperationTimes {

    private Long customerOperationStartTime;
    private Long customerOperationEndTime;

    public Long getCustomerOperationStartTime() {
        return customerOperationStartTime;
    }

    public void setCustomerOperationStartTime(Long customerOperationStartTime) {
        this.customerOperationStartTime = customerOperationStartTime;
    }

    public Long getCustomerOperationEndTime() {
        return customerOperationEndTime;
    }

    public void setCustomerOperationEndTime(Long customerOperationEndTime) {
        this.customerOperationEndTime = customerOperationEndTime;
    }
}

В Activity.java я добавил:

private CustomerOperationTimes customerOperationTimes;
private List<CustomerOperationTimes> customerOperationTimesList ;

public CustomerOperationTimes getCustomerOperationTimes() {
    return customerOperationTimes;
}

public void setCustomerOperationTimes(CustomerOperationTimes customerOperationTimes) {
    this.customerOperationTimes = customerOperationTimes;
}

public List<CustomerOperationTimes> getCustomerOperationTimesList() {
    return customerOperationTimesList;
}

public void setCustomerOperationTimesList(List<CustomerOperationTimes> customerOperationTimesList) {
    this.customerOperationTimesList = customerOperationTimesList;
}

Для тестирования я создал xml-файл с одним действием:

…
    <activityList id="33">
        <Activity id="34">
            <activityID>1</activityID>
            <activityStatus>101</activityStatus>
            <location reference="7" />
            <appointmentStartTime>1395317700</appointmentStartTime> <!-- Unix time in sec => 2014/03/20 12:15:00 -->
            <appointmentEndTime>1395324900</appointmentEndTime>     <!-- Unix time in sec => 2014/03/20 14:15:00 -->
            <plannedWorkDuration>4500</plannedWorkDuration>         <!-- in sec => 75min duration -->
            <customerOperationTimesList id="100">
                <customerOperationTimes id="101">
                        <customerOperationStartTime>1395317800</customerOperationStartTime>
                        <customerOperationEndTime>1395324700</customerOperationEndTime> 
                </customerOperationTimes>
                <customerOperationTimes id="102">
                        <customerOperationStartTime>1395317800</customerOperationStartTime>
                        <customerOperationEndTime>1395324700</customerOperationEndTime> 
                </customerOperationTimes>
            </customerOperationTimesList>                                
        </Activity>
    </activityList>
…

!!! Этот файл не может быть прочитан и создает исключение.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Problem reading inputSolutionFile (data\engineerrouting\unsolved\4es_4e_16a_4_8-18s_cot.xml).
    at org.optaplanner.persistence.xstream.impl.domain.solution.XStreamSolutionFileIO.read(XStreamSolutionFileIO.java:66)
    at org.optaplanner.examples.common.persistence.XStreamSolutionDao.readSolution(XStreamSolutionDao.java:37)
...

Как видите, ошибка возникает в файле XStreamSolutionDao.java при попытке прочитать входной xml-файл:

Line 37: Solution solution = xStreamSolutionFileIO.read(inputSolutionFile); 

!!! Но выполняется следующее содержимое xml (без списка и «только» 1 тег customerOperationTimes):

<activityList id="33">
    <Activity id="34">
        <activityID>1</activityID>
        <activityStatus>101</activityStatus>
        <location reference="7" />
        <appointmentStartTime>1395317700</appointmentStartTime> <!-- Unix time in sec => 2014/03/20 12:15:00 -->
        <appointmentEndTime>1395324900</appointmentEndTime>     <!-- Unix time in sec => 2014/03/20 14:15:00 -->
        <plannedWorkDuration>4500</plannedWorkDuration>         <!-- in sec => 75min duration -->
        <customerOperationTimes id="101">
                <customerOperationStartTime>1395317800</customerOperationStartTime>
                <customerOperationEndTime>1395324700</customerOperationEndTime> 
        </customerOperationTimes>
    </Activity>
</activityList>

Спасибо за ваши предложения и помощь.


person len    schedule 22.10.2014    source источник
comment
Что такое связанное исключение этого исключения? Я считаю, что это будет ошибка распаковки XStream, потому что классы Java вашего домена могут быть не синхронизированы с вашими элементами XML-файла.   -  person Geoffrey De Smet    schedule 22.10.2014


Ответы (1)


Решение:

Мы добавили во входной файл XML:

   <customerOperationTimesList id="110">
        <CustomerOperationTimes id="111">
                <id>1</id>
                <customerOperationStartTime>1395317800</customerOperationStartTime>
                <customerOperationEndTime>1395324700</customerOperationEndTime> 
        </CustomerOperationTimes>
        <CustomerOperationTimes id="112">
                <id>2</id>
                <customerOperationStartTime>1395317800</customerOperationStartTime>
                <customerOperationEndTime>1395324700</customerOperationEndTime> 
        </CustomerOperationTimes>
    </customerOperationTimesList>  

Затем мы добавили класс: CustomerOperationTime.java:

package com.el2.optimization.technicianrouting.domain;

import com.el2.optimization.common.domain.AbstractPersistable;
import com.el2.optimization.technicianrouting.domain.CustomerOperationTimes;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamInclude;

@XStreamAlias("CustomerOperationTimes")
public class CustomerOperationTimes extends AbstractPersistable{

    private Long customerOperationStartTime;
    private Long customerOperationEndTime;


    public Long getCustomerOperationStartTime() {
        return this.customerOperationStartTime;
    }

    public void setCustomerOperationStartTime(Long customerOperationStartTime) {
        this.customerOperationStartTime = customerOperationStartTime;
    }

    public Long getCustomerOperationEndTime() {
        return this.customerOperationEndTime;
    }

    public void setCustomerOperationEndTime(Long customerOperationEndTime) {
        this.customerOperationEndTime = customerOperationEndTime;
    }           
}

В Activity.java мы добавили:

private CustomerOperationTimes customerOperationTimes;

// @XmlElement(name = "customerOperationTimesList", type = CustomerOperationTimes.class)
protected List<CustomerOperationTimes> customerOperationTimesList ;

@PlanningEntityCollectionProperty
@ValueRangeProvider(id = "customerOperationTimesRange")
public List<CustomerOperationTimes> getCustomerOperationTimesList() {
    return customerOperationTimesList;
}

public void setCustomerOperationTimesList(List<CustomerOperationTimes> customerOperationTimesList) {
    this.customerOperationTimesList = customerOperationTimesList;
}    

Таким образом, мы можем прочитать файл XML.

person len    schedule 23.01.2015