package JOpt.SDK.Tests;
import JOpt.SDK.*;
import JOpt.SDK.Implementation.*;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.Properties;
public class Example_tm extends Optimization
{
public Example_tm()
{
double[][] matrix = {{0.0,70.0,90.0,45.0,240.0,580.0,440.0,300.0,380.0,40.0,260.0},
{70.0,0.0,25.0,65.0,300.0,640.0,500.0,360.0,440.0,35.0,280.0},
{90.0,25.0,0.0,80.0,305.0,650.0,510.0,370.0,460.0,25.0,270.0},
{45.0, 65.0,80.0,0.0,275.0,615.0,475.0,330.0,405.0,80.0,300.0},
{240.0,300.0,305.0,275.0,0.0,330.0,300.0,70.0,170.0,280.0,50.0},
{580.0,640.0,650.0,615.0,330.0,0.0,140.0,320.0,230.0,620.0,340.0},
{440.0,500.0,510.0,475.0,300.0,140.0,0.0,200.0,240.0,480.0,200.0},
{300.0,360.0,370.0,330.0,70.0,320.0,200.0,0.0,80.0,330.0,110.0},
{380.0,440.0,460.0,405.0,170.0,230.0,240.0,80.0,0.0,405.0,200.0},
{40.0,35.0,25.0,80.0,280.0,620.0,480.0,330.0,405.0,0.0,285.0},
{260.0,280.0,270.0,300.0,50.0,340.0,200.0,110.0,200.0,285.0,0.0}};
double[][] timematrix = {{0,3877,4985,2492,24686,32123,24369,16615,21046,2215,14400},
{3877,0,1385,3600,16615,35446,27692,19938,24369,1938,15508},
{4985,1385,0,4431,16892,36000,28246,20492,25477,1385,14954},
{2492,3600,4431,0,15231,34062,26308,18277,22431,4431,16615},
{13292,16615,16892,15231,0,18277,16615,3877,9415,15508,2769},
{32123,35446,36000,34062,18277,0,7754,17723,12738,34338,18831},
{24369,27692,28246,26308,16615,7754,0,11077,13292,26585,11077},
{16615,19938,20492,18277,3877,17723,11077,0,4431,18277,6092},
{21046,24369,25477,22431,9415,12738,13292,4431,0,22431,11077},
{2215,1938,1385,4431,15508,34338,26585,18277,22431,0,15785},
{14400,15508,14954,16615,2769,18831,11077,6092,11077,15785,0}};
this.addDistanceMatrix(matrix);
this.addTimeMatrix(timematrix);
OpeningHours[] weeklyOpeningHours= new OpeningHours[1];
weeklyOpeningHours[0] = new OpeningHours(new GregorianCalendar(2007,Calendar.MARCH,6,8,0,0),new GregorianCalendar(2007,Calendar.MARCH,6,18,0,0));
OpeningHours[] weeklyOpeningHoursOberhausen= new OpeningHours[1];
weeklyOpeningHoursOberhausen[0] = new OpeningHours(new GregorianCalendar(2007,Calendar.MARCH,6,15,0,0),new GregorianCalendar(2007,Calendar.MARCH,6,16,0,0));
TimeWindowGeoNode koeln = new TimeWindowGeoNode("Koeln", 50.9333,6.95,weeklyOpeningHours,1200,1);
koeln.setDistMatrixId(0);
this.addElement(koeln);
TimeWindowGeoNode oberhausen = new TimeWindowGeoNode("Oberhausen", 51.4667,6.85,weeklyOpeningHoursOberhausen,1200,1);
oberhausen.setDistMatrixId(1);
this.addElement(oberhausen);
TimeWindowGeoNode essen = new TimeWindowGeoNode("Essen",51.45,7.01667,weeklyOpeningHours,1200,1);
essen.setDistMatrixId(2);
this.addElement(essen);
TimeWindowGeoNode dueren = new TimeWindowGeoNode("Dueren",50.8,6.48333,weeklyOpeningHours,1200,1);
dueren.setOpeningHours(weeklyOpeningHours);
dueren.setDistMatrixId(3);
this.addElement(dueren);
TimeWindowGeoNode mannheim = new TimeWindowGeoNode("Mannheim",49.4883,8.46472,weeklyOpeningHours,1200,1);
mannheim.setOpeningHours(weeklyOpeningHours);
mannheim.setDistMatrixId(4);
this.addElement(mannheim);
TimeWindowGeoNode muenchen = new TimeWindowGeoNode("Muenchen",48.15,11.5833,weeklyOpeningHours,1200,1);
muenchen.setDistMatrixId(5);
this.addElement(muenchen);
TimeWindowGeoNode nuernberg = new TimeWindowGeoNode("Nuernberg",49.4478,11.0683,weeklyOpeningHours,1200,100);
nuernberg.setDistMatrixId(6);
this.addElement(nuernberg);
TimeWindowGeoNode heilbronn = new TimeWindowGeoNode("Heilbronn",49.1403,9.22,weeklyOpeningHours,1200,1);
heilbronn.setDistMatrixId(7);
this.addElement(heilbronn);
TimeWindowGeoNode stuttgart = new TimeWindowGeoNode("Stuttgart", 48.7667,9.18333,weeklyOpeningHours,1200,1);
stuttgart.setDistMatrixId(8);
this.addElement(stuttgart);
TimeWindowGeoNode wuppertal = new TimeWindowGeoNode("Wuppertal",51.2667,7.18333,weeklyOpeningHours,1200,1);
wuppertal.setDistMatrixId(9);
this.addElement(wuppertal);
WorkingHours[] workingHours= new WorkingHours[1];
workingHours[0] = new WorkingHours(new GregorianCalendar(2007,Calendar.MARCH,6,8,0,0),new GregorianCalendar(2007,Calendar.MARCH,6,20,0,0));
CapacityResource rep1 = new CapacityResource("Jack",50.1167,7.68333,12.0,1200.0,workingHours);
rep1.setCost(1000,1,1);
rep1.setDistMatrixId(10);
rep1.setTimeMatrixFactor(1.0);
this.addElement(rep1);
CapacityResource rep2 = new CapacityResource("John",50.1167,7.68333,12.0,1200.0,workingHours);
rep2.setCost(1000,1,1);
rep2.setDistMatrixId(10);
rep2.setTimeMatrixFactor(1.0);
this.addElement(rep2);
Properties props = new Properties();
props.setProperty("JOpt.RouteType","CLOSED");
props.setProperty("JOptExitCondition.JOptGenerationCount","1000");
props.setProperty("JOptExitCondition.Type","JOptCostConvergency");
props.setProperty("JOptExitCondition.JOptConvergencyCount","300");
props.setProperty("JOptWeight.TotalDistance","100.0");
props.setProperty("JOptWeight.RouteDistance","1.0");
props.setProperty("JOptWeight.ResourceActive","0.0");
props.setProperty("JOptWeight.NodeType","1.0");
props.setProperty("JOptWeight.TimeWindow","100.0");
this.addElement(props);
try{
this.startAsynchronousOptimizationRun();
} catch (Exception ex)
{
System.out.println(ex.getMessage());
}
}
public void onAsynchronousOptimizationResult(IOptimizationResult result)
{
if(result == null)
{
return;
}
System.out.println("\n##########################################################");
System.out.println("NEW OPTIMIZATION RESULT");
System.out.println("##########################################################");
System.out.println("costfunction : " + result.getTotalCost());
System.out.println("total route time : " + result.getTimeTotal()/3600.0 + " [h]");
System.out.println("total driving time : " + result.getTimeTrip()/3600.0 + " [h]");
System.out.println("total service time : " + result.getTimeStop()/3600.0 + " [h]");
System.out.println("total idle time : " + result.getTimeIdle()/3600.0 + " [h]");
System.out.println("total break time : " + result.getTimeBreak()/3600.0 + " [h]");
System.out.println("total distance : " + result.getTotalDistance()/1000.0 + " [km]");
for(int i = 0; i < result.getRoutes().length; i++){
System.out.println("\n-----------------------------------------------------------");
System.out.println("Route information");
System.out.println("Route:" + result.getRoutes()[i].getRouteId() + " resource scheduled: " +
result.getRoutes()[i].getResourceId());
System.out.println("-----------------------------------------------------------");
System.out.println("route time : " + result.getRoutes()[i].getTimeTotal()/3600.0 + " [h]");
System.out.println("driving time : " + result.getRoutes()[i].getTimeTrip()/3600.0 + " [h]");
System.out.println("service time : " + result.getRoutes()[i].getTimeStop()/3600.0 + " [h]");
System.out.println("idle time : " + result.getRoutes()[i].getTimeIdle()/3600.0 + " [h]");
System.out.println("break time : " + result.getRoutes()[i].getTimeBreak()/3600.0 + " [h]");
System.out.println("distance : " + result.getRoutes()[i].getTotalDistance()/1000.0 + "
[km]");
for (int k = 0; k < result.getRoutes()[i].getViolations().length; k++)
{
IViolation violation = result.getRoutes()[i].getViolations()[k];
IAttributeValuePair avp = (IAttributeValuePair)violation;
System.out.println(" [" + avp.getCategory() + "/" + avp.getAttribute() + "/" +
avp.getValue() + "]");
}
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
for(int j = 0; j < result.getRoutes()[i].getRouteNodes().length; j++){
IScheduledNode scheduledNode = result.getRoutes()[i].getRouteNodes()[j];
System.out.print("\n"
+ result.getRoutes()[i].getRouteId() + "."
+ scheduledNode.getSequenceNumber() + " "
+ scheduledNode.getNodeId()
+ " arrival time: "
+ sdf.format(scheduledNode.getArrivalTime().getTime())
+ " driving time: " + scheduledNode.getTimeDrive()/3600.0 +" [h]");
for(int k = 0; k < scheduledNode.getViolations().length; k++){
IViolation violation = scheduledNode.getViolations()[k];
if(violation instanceof IAttributeValuePair)
{
IAttributeValuePair avp = (IAttributeValuePair) violation;
System.out.print(" [" + avp.getCategory() + "/" + avp.getAttribute() + "/" +
avp.getValue() + "]");
}
}
}
System.out.println("\n\n");
}
}
public void onProgress(double progress, double totalDistance, double cost)
{
System.out.println("Progress: " + progress + "% Total Distance: " + totalDistance/1000 + "km
Cost: " + cost);
}
public static void main(String[] args)
{
Example_tm Example_tm = new Example_tm();
}
}