Java 你能帮我实现Clarke和Wright算法吗?

Java 你能帮我实现Clarke和Wright算法吗?,java,algorithm,optimization,Java,Algorithm,Optimization,我试图实现Clarke和Wright算法来构造初始VRP解决方案。 它似乎运行正常,但由于某些原因,我得到的解决方案的质量不是预期的。 有关该算法的说明,请参阅 下面是我计算储蓄元素的代码: private void computeSavingsElements() { for(int i = 0; i<vrp.getDimension(); i++) { for(int j = 0; j < i; j++) {

我试图实现Clarke和Wright算法来构造初始VRP解决方案。 它似乎运行正常,但由于某些原因,我得到的解决方案的质量不是预期的。 有关该算法的说明,请参阅

下面是我计算储蓄元素的代码:

private void computeSavingsElements() {
    for(int i = 0; i<vrp.getDimension(); i++) { 
        for(int j = 0; j <  i; j++) {           
                double savingValue =  vrp.distance(i, 0) + vrp.distance(0, j) - lamda * vrp.distance(i, j);
                SavingsElement savingElement = new SavingsElement (i,j, savingValue);
                savingsElements.add(savingElement);                                                 
        }
    }
    Collections.sort(savingsElements); // sort in ascending order
    Collections.reverse(savingsElements); // but we need descending order

}
private void computeSavingsElements(){
对于(inti=0;i0){//如果在一条路线上连续服务客户是有利可图的
VRPNode i=this.vrp.getNode(savingeElement.getNodeId());
VRPNode j=this.vrp.getNode(savingeElement.getNodeId2());
VRPRoute route1=解决方案。客户所在的路线为Astone(i);
VRPRoute route2=解决方案。客户为第一个(j)的路径;
如果((路由1!=null)和(路由2!=null)){

一个明显的问题是,你的代码只考虑在J i之后的路由I之后加入路由J。你也应该考虑用另一种方式加入它们。换句话说,在计算过程中的内部循环J应该达到客户节点的数量(<代码> VRP。GEGEATIONE()/代码>)。 当然,很难判断您没有显示的代码部分是否存在bug,例如,客户所在的阵列
路由是否正确更新

private void constructSolution() {
    List<VRPNode> nodes = this.vrp.getNodesList();
    VRPNode depot = this.vrp.getDepot();
    double vehicleCapacity = this.vrp.getVehicleCapacity();


    VRPSolution solution = new VRPSolution(vehicleCapacity, depot);

    /*
     * In the initial solution, each vehicle serves exactly one customer
     */
    for (VRPNode customer:nodes) {
        if (customer.getId()!=0) { // if not depot
            VRPRoute route = new VRPRoute(vehicleCapacity, depot);
            route.addCustomer(customer);
            solution.addRoute(route);
            route = null; // eliminate obsolete reference to free resources
        }
    }   

    //System.out.println("INITIAL SOLUTION: \n"+solution.toString());

    int mergesCounter=0;
    for (SavingsElement savingElement : this.savingsElements) {
        if (savingElement.getSavingValue() > 0) { // If serving customers consecutively in a route is profitable

            VRPNode i = this.vrp.getNode(savingElement.getNodeId1());
            VRPNode j = this.vrp.getNode(savingElement.getNodeId2());

            VRPRoute route1 = solution.routeWhereTheCustomerIsTheLastOne(i);
            VRPRoute route2 = solution.routeWhereTheCustomerIsTheFirstOne(j);

            if ((route1!=null) & (route2!=null)) {
                if (route1.getDemand() + route2.getDemand() <= this.vrp.getVehicleCapacity()) { // if merge is feasible
                    /*
                     * Merge the two routes
                     */
                    solution.mergeRoutes(route1, route2);
                    mergesCounter++;
                }
            }


        }

    }   
    //System.out.println("\n\nAfter "+mergesCounter+" Merges"+"\n"+solution.toString());
    this.solutionConstructed = solution;

}
public void mergeRoutes(VRPRoute a, VRPRoute b) {
    /*
     * Provided that feasibility check has already been performed
     */
    List<VRPNode> customersFromRouteA = new LinkedList<VRPNode>(a.getCustomersInRoute());
    List<VRPNode> customersFromRouteB = new LinkedList<VRPNode>(b.getCustomersInRoute());

    /*
     * Remove the old routes
     */
    solutionRoutes.remove(a);
    solutionRoutes.remove(b);

    /*
     * Construct a new merged route
     */
    VRPRoute mergedRoute = new VRPRoute(vehicleCapacity,depot);

    /*
     * The new route has to serve all the customers 
     * both from route a and b
     */
    for (VRPNode customerFromA:  customersFromRouteA) {
        mergedRoute.addCustomer(customerFromA);
    }

    for (VRPNode customerFromB:  customersFromRouteB) {
        mergedRoute.addCustomer(customerFromB);
    }

    addRoute(mergedRoute);

    evaluateSolutionCost();
}