Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31,453 changes: 18,440 additions & 13,013 deletions data/tsp/tsp-vm1084.json

Large diffs are not rendered by default.

1,133 changes: 646 additions & 487 deletions data/tsp/unsolved/europe40.json

Large diffs are not rendered by default.

18 changes: 0 additions & 18 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -95,24 +95,6 @@
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>ai.timefold.solver</groupId>
<artifactId>timefold-solver-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import ai.timefold.solver.benchmarks.examples.vehiclerouting.domain.solver.nearby.CustomerNearbyDistanceMeter;
import ai.timefold.solver.benchmarks.examples.vehiclerouting.domain.timewindowed.TimeWindowedCustomer;
import ai.timefold.solver.benchmarks.examples.vehiclerouting.score.VehicleRoutingConstraintProvider;
import ai.timefold.solver.core.api.score.buildin.hardsoftlong.HardSoftLongScore;
import ai.timefold.solver.core.api.score.HardSoftScore;
import ai.timefold.solver.core.config.constructionheuristic.ConstructionHeuristicPhaseConfig;
import ai.timefold.solver.core.config.localsearch.LocalSearchPhaseConfig;
import ai.timefold.solver.core.config.solver.SolverConfig;
Expand Down Expand Up @@ -66,7 +66,7 @@ private SolverConfig getCommunityEditionSolverConfig(CVRPLIBDataset dataset) {
var terminationConfig = new TerminationConfig()
.withSpentLimit(getMaximumDurationPerDataset())
.withUnimprovedSecondsSpentLimit(AbstractCompetitiveBenchmark.UNIMPROVED_SECONDS_TERMINATION)
.withBestScoreLimit(HardSoftLongScore.ofSoft(threshold.longValue()).toString());
.withBestScoreLimit(HardSoftScore.ofSoft(threshold.longValue()).toString());
return new SolverConfig()
.withSolutionClass(VehicleRoutingSolution.class)
.withEntityClasses(Vehicle.class, Customer.class, TimeWindowedCustomer.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
import ai.timefold.solver.benchmarks.examples.vehiclerouting.domain.VehicleRoutingSolution;
import ai.timefold.solver.benchmarks.examples.vehiclerouting.domain.location.AirLocation;
import ai.timefold.solver.benchmarks.examples.vehiclerouting.persistence.VehicleRoutingImporter;
import ai.timefold.solver.core.api.score.buildin.hardsoftlong.HardSoftLongScore;
import ai.timefold.solver.core.api.score.HardSoftScore;

public class Main
extends AbstractCompetitiveBenchmark<CVRPLIBDataset, CVRPLIBConfiguration, VehicleRoutingSolution, HardSoftLongScore> {
extends AbstractCompetitiveBenchmark<CVRPLIBDataset, CVRPLIBConfiguration, VehicleRoutingSolution, HardSoftScore> {

public static void main(String[] args) throws ExecutionException, InterruptedException, IOException {
var benchmark = new Main();
Expand All @@ -28,12 +28,12 @@ protected String getLibraryName() {
}

@Override
protected HardSoftLongScore extractScore(VehicleRoutingSolution vehicleRoutingSolution) {
protected HardSoftScore extractScore(VehicleRoutingSolution vehicleRoutingSolution) {
return vehicleRoutingSolution.getScore();
}

@Override
protected BigDecimal extractResult(CVRPLIBDataset dataset, HardSoftLongScore score) {
protected BigDecimal extractResult(CVRPLIBDataset dataset, HardSoftScore score) {
return BigDecimal.valueOf(-score.softScore())
.divide(BigDecimal.valueOf(AirLocation.MULTIPLIER), 1, RoundingMode.HALF_EVEN);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import ai.timefold.solver.benchmarks.examples.flowshop.domain.Machine;
import ai.timefold.solver.benchmarks.examples.flowshop.phase.NEHCustomPhase;
import ai.timefold.solver.benchmarks.examples.flowshop.score.FlowShopConstraintProvider;
import ai.timefold.solver.core.api.score.buildin.hardsoftlong.HardSoftLongScore;
import ai.timefold.solver.core.api.score.HardSoftScore;
import ai.timefold.solver.core.config.localsearch.LocalSearchPhaseConfig;
import ai.timefold.solver.core.config.phase.PhaseConfig;
import ai.timefold.solver.core.config.phase.custom.CustomPhaseConfig;
Expand Down Expand Up @@ -67,7 +67,7 @@ private SolverConfig getCommunityEditionSolverConfig(FlowShopDataset dataset) {
.negate();
var terminationConfig = new TerminationConfig()
.withSpentLimit(getMaximumDurationPerDataset())
.withBestScoreLimit(HardSoftLongScore.ofSoft(threshold.longValue()).toString());
.withBestScoreLimit(HardSoftScore.ofSoft(threshold.longValue()).toString());
var phasesList =
List.<PhaseConfig> of(new CustomPhaseConfig().withCustomPhaseCommandList(List.of(new NEHCustomPhase())),
new LocalSearchPhaseConfig());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
import ai.timefold.solver.benchmarks.examples.flowshop.domain.Job;
import ai.timefold.solver.benchmarks.examples.flowshop.domain.JobScheduleSolution;
import ai.timefold.solver.benchmarks.examples.flowshop.persistence.TaillardImporter;
import ai.timefold.solver.core.api.score.buildin.hardsoftlong.HardSoftLongScore;
import ai.timefold.solver.core.api.score.HardSoftScore;

public class Main extends
AbstractCompetitiveBenchmark<FlowShopDataset, FlowShopConfiguration, JobScheduleSolution, HardSoftLongScore> {
AbstractCompetitiveBenchmark<FlowShopDataset, FlowShopConfiguration, JobScheduleSolution, HardSoftScore> {

public static void main(String[] args) throws ExecutionException, InterruptedException, IOException {
var benchmark = new Main();
Expand Down Expand Up @@ -154,12 +154,12 @@ protected String getLibraryName() {
}

@Override
protected HardSoftLongScore extractScore(JobScheduleSolution solution) {
protected HardSoftScore extractScore(JobScheduleSolution solution) {
return solution.getScore();
}

@Override
protected BigDecimal extractResult(FlowShopDataset dataset, HardSoftLongScore score) {
protected BigDecimal extractResult(FlowShopDataset dataset, HardSoftScore score) {
return BigDecimal.valueOf(-score.softScore());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
import ai.timefold.solver.benchmarks.examples.common.persistence.AbstractSolutionImporter;
import ai.timefold.solver.benchmarks.examples.tsp.domain.TspSolution;
import ai.timefold.solver.benchmarks.examples.tsp.persistence.TspImporter;
import ai.timefold.solver.core.api.score.buildin.simplelong.SimpleLongScore;
import ai.timefold.solver.core.api.score.SimpleScore;

public class Main extends AbstractCompetitiveBenchmark<TSPLIBDataset, TSPLIBConfiguration, TspSolution, SimpleLongScore> {
public class Main extends AbstractCompetitiveBenchmark<TSPLIBDataset, TSPLIBConfiguration, TspSolution, SimpleScore> {

public static void main(String[] args) throws ExecutionException, InterruptedException, IOException {
var benchmark = new Main();
Expand All @@ -26,12 +26,12 @@ protected String getLibraryName() {
}

@Override
protected SimpleLongScore extractScore(TspSolution tspSolution) {
protected SimpleScore extractScore(TspSolution tspSolution) {
return tspSolution.getScore();
}

@Override
protected BigDecimal extractResult(TSPLIBDataset dataset, SimpleLongScore score) {
protected BigDecimal extractResult(TSPLIBDataset dataset, SimpleScore score) {
return BigDecimal.valueOf(-score.score())
.setScale(0, RoundingMode.HALF_EVEN);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import ai.timefold.solver.benchmarks.competitive.AbstractCompetitiveBenchmark;
import ai.timefold.solver.benchmarks.competitive.Configuration;
import ai.timefold.solver.benchmarks.examples.tsp.domain.Tour;
import ai.timefold.solver.benchmarks.examples.tsp.domain.TspSolution;
import ai.timefold.solver.benchmarks.examples.tsp.domain.Visit;
import ai.timefold.solver.benchmarks.examples.tsp.domain.solver.nearby.VisitNearbyDistanceMeter;
Expand Down Expand Up @@ -62,7 +63,7 @@ private SolverConfig getCommunityEditionSolverConfig(TSPLIBDataset dataset) {
.withBestScoreLimit(Long.toString(threshold.longValue()));
return new SolverConfig()
.withSolutionClass(TspSolution.class)
.withEntityClasses(Visit.class)
.withEntityClasses(Tour.class, Visit.class)
.withConstraintProviderClass(TspConstraintProvider.class)
.withTerminationConfig(terminationConfig)
.withPhases(new ConstructionHeuristicPhaseConfig(), new LocalSearchPhaseConfig());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
import ai.timefold.solver.core.api.domain.solution.ProblemFactCollectionProperty;
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
import ai.timefold.solver.core.api.score.HardSoftScore;

@PlanningSolution
public class CloudBalance extends AbstractPersistable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import com.fasterxml.jackson.annotation.JsonIgnore;

@PlanningEntity(difficultyComparatorClass = CloudProcessDifficultyComparator.class)
@PlanningEntity(comparatorClass = CloudProcessDifficultyComparator.class)
public class CloudProcess
extends AbstractPersistable {

Expand Down Expand Up @@ -53,7 +53,7 @@ public void setRequiredNetworkBandwidth(int requiredNetworkBandwidth) {
this.requiredNetworkBandwidth = requiredNetworkBandwidth;
}

@PlanningVariable(strengthComparatorClass = CloudComputerStrengthComparator.class)
@PlanningVariable(comparatorClass = CloudComputerStrengthComparator.class)
public CloudComputer getComputer() {
return computer;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import ai.timefold.solver.benchmarks.examples.cloudbalancing.domain.CloudBalance;
import ai.timefold.solver.benchmarks.examples.cloudbalancing.domain.CloudComputer;
import ai.timefold.solver.benchmarks.examples.cloudbalancing.domain.CloudProcess;
import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
import ai.timefold.solver.core.api.score.HardSoftScore;
import ai.timefold.solver.core.api.score.calculator.IncrementalScoreCalculator;

public class CloudBalancingIncrementalScoreCalculator
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import ai.timefold.solver.benchmarks.examples.cloudbalancing.domain.CloudBalance;
import ai.timefold.solver.benchmarks.examples.cloudbalancing.domain.CloudComputer;
import ai.timefold.solver.benchmarks.examples.cloudbalancing.domain.CloudProcess;
import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
import ai.timefold.solver.core.api.score.HardSoftScore;
import ai.timefold.solver.core.api.score.calculator.EasyScoreCalculator;

public class CloudBalancingMapBasedEasyScoreCalculator implements EasyScoreCalculator<CloudBalance, HardSoftScore> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import ai.timefold.solver.benchmarks.examples.cloudbalancing.domain.CloudComputer;
import ai.timefold.solver.benchmarks.examples.cloudbalancing.domain.CloudProcess;
import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
import ai.timefold.solver.core.api.score.HardSoftScore;
import ai.timefold.solver.core.api.score.stream.Constraint;
import ai.timefold.solver.core.api.score.stream.ConstraintFactory;
import ai.timefold.solver.core.api.score.stream.ConstraintProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ai.timefold.solver.benchmarks.examples.common.domain;

import ai.timefold.solver.core.api.domain.lookup.PlanningId;
import ai.timefold.solver.core.api.domain.common.PlanningId;

public abstract class AbstractPersistable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import ai.timefold.solver.benchmarks.examples.common.persistence.jackson.AbstractKeyDeserializer;
import ai.timefold.solver.jackson.impl.domain.solution.JacksonSolutionFileIO;

import com.fasterxml.jackson.databind.ObjectMapper;
import tools.jackson.databind.ObjectMapper;

/**
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
import ai.timefold.solver.benchmarks.examples.common.persistence.AbstractJsonSolutionFileIO;

import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.KeyDeserializer;
import tools.jackson.databind.DeserializationContext;
import tools.jackson.databind.KeyDeserializer;

/**
* Deserializes map key defined by
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package ai.timefold.solver.benchmarks.examples.common.persistence.jackson;

import java.io.IOException;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;

import com.fasterxml.jackson.annotation.ObjectIdGenerator;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import tools.jackson.core.JacksonException;
import tools.jackson.core.JsonGenerator;
import tools.jackson.databind.SerializationContext;
import tools.jackson.databind.ValueSerializer;

/**
* Serializes a child of {@link AbstractPersistable} to a JSON map key
Expand All @@ -16,15 +16,14 @@
* @param <E> The type must have a {@link com.fasterxml.jackson.annotation.JsonIdentityInfo} annotation with
* {@link JacksonUniqueIdGenerator} as its generator.
*/
public final class KeySerializer<E extends AbstractPersistable> extends JsonSerializer<E> {
public final class KeySerializer<E extends AbstractPersistable> extends ValueSerializer<E> {

private final ObjectIdGenerator<String> idGenerator = new JacksonUniqueIdGenerator();

@Override
public void serialize(E persistable, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException {
Object jsonId = serializerProvider.findObjectId(persistable, idGenerator)
public void serialize(E persistable, JsonGenerator jsonGenerator, SerializationContext ctxt) throws JacksonException {
Object jsonId = ctxt.findObjectId(persistable, idGenerator)
.generateId(persistable);
jsonGenerator.writeFieldName(jsonId.toString());
jsonGenerator.writeName(jsonId.toString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
import ai.timefold.solver.core.api.domain.solution.ProblemFactCollectionProperty;
import ai.timefold.solver.core.api.domain.solution.ProblemFactProperty;
import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
import ai.timefold.solver.core.api.score.HardSoftScore;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
import ai.timefold.solver.benchmarks.examples.conferencescheduling.domain.ConferenceConstraintProperties;
import ai.timefold.solver.benchmarks.examples.conferencescheduling.domain.Speaker;
import ai.timefold.solver.benchmarks.examples.conferencescheduling.domain.Talk;
import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
import ai.timefold.solver.core.api.score.HardSoftScore;
import ai.timefold.solver.core.api.score.stream.Constraint;
import ai.timefold.solver.core.api.score.stream.ConstraintFactory;
import ai.timefold.solver.core.api.score.stream.ConstraintProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import ai.timefold.solver.core.api.domain.solution.PlanningSolution;
import ai.timefold.solver.core.api.domain.solution.ProblemFactCollectionProperty;
import ai.timefold.solver.core.api.domain.valuerange.ValueRangeProvider;
import ai.timefold.solver.core.api.score.buildin.hardsoft.HardSoftScore;
import ai.timefold.solver.core.api.score.HardSoftScore;

@PlanningSolution
public class CourseSchedule extends AbstractPersistable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@
import java.util.Set;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.LectureDifficultyWeightFactory;
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.PeriodStrengthWeightFactory;
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.RoomStrengthWeightFactory;
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.LectureComparatorFactory;
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.PeriodComparatorFactory;
import ai.timefold.solver.benchmarks.examples.curriculumcourse.domain.solver.RoomComparatorFactory;
import ai.timefold.solver.core.api.domain.entity.PlanningEntity;
import ai.timefold.solver.core.api.domain.entity.PlanningPin;
import ai.timefold.solver.core.api.domain.variable.PlanningVariable;

import com.fasterxml.jackson.annotation.JsonIgnore;

@PlanningEntity(difficultyWeightFactoryClass = LectureDifficultyWeightFactory.class)
@PlanningEntity(comparatorFactoryClass = LectureComparatorFactory.class)
public class Lecture extends AbstractPersistable {

private Course course;
private int lectureIndexInCourse;
private int unavailablePeriodPenaltyCount = -1;
private boolean pinned;

// Planning variables: changes during planning, between score calculations.
Expand Down Expand Up @@ -67,7 +68,7 @@ public void setPinned(boolean pinned) {
this.pinned = pinned;
}

@PlanningVariable(strengthWeightFactoryClass = PeriodStrengthWeightFactory.class)
@PlanningVariable(comparatorFactoryClass = PeriodComparatorFactory.class)
public Period getPeriod() {
return period;
}
Expand All @@ -76,7 +77,7 @@ public void setPeriod(Period period) {
this.period = period;
}

@PlanningVariable(strengthWeightFactoryClass = RoomStrengthWeightFactory.class)
@PlanningVariable(comparatorFactoryClass = RoomComparatorFactory.class)
public Room getRoom() {
return room;
}
Expand Down Expand Up @@ -120,6 +121,19 @@ public int getTimeslotIndex() {
return period.getTimeslot().getTimeslotIndex();
}

@JsonIgnore
public int getUnavailablePeriodPenaltyCount(CourseSchedule schedule) {
if (unavailablePeriodPenaltyCount == -1) {
unavailablePeriodPenaltyCount = 0;
for (var penalty : schedule.getUnavailablePeriodPenaltyList()) {
if (penalty.getCourse().equals(course)) {
unavailablePeriodPenaltyCount++;
}
}
}
return unavailablePeriodPenaltyCount;
}

@Override
public String toString() {
return course + "-" + lectureIndexInCourse;
Expand Down
Loading
Loading