BacktrackingTest.java

package net.splitcells.gel.solution.optimization.meta;

import org.junit.jupiter.api.Test;

import static net.splitcells.dem.data.set.list.Lists.list;
import static net.splitcells.gel.constraint.type.ForAlls.forAll;
import static net.splitcells.gel.data.table.attribute.AttributeI.integerAttribute;
import static net.splitcells.gel.rating.rater.RaterBasedOnLineValue.lineValueRater;
import static net.splitcells.gel.solution.SolutionBuilder.defineProblem;
import static net.splitcells.gel.solution.optimization.meta.Backtracking.backtracking;
import static net.splitcells.gel.solution.optimization.primitive.enumerable.Initializer.initializer;
import static net.splitcells.gel.solution.optimization.space.EnumerableOptimizationSpaceI.enumerableOptimizationSpace;
import static org.assertj.core.api.Assertions.assertThat;

public class BacktrackingTest {
    @Test
    public void testSimplestCase() {
        final var demandAttribute = integerAttribute("d");
        final var supplyAttribute = integerAttribute("s");
        final var testData = defineProblem()
                .withDemandAttributes(demandAttribute)
                .withDemands(list
                        (list(1)
                                , list(2)
                                , list(3)))
                .withSupplyAttributes(supplyAttribute)
                .withSupplies(list
                        (list(4)
                                , list(5)
                                , list(6)))
                .withConstraint(forAll())
                .toProblem()
                .asSolution();
        backtracking().optimize(testData);
        assertThat(testData.size()).isEqualTo(3);
        assertThat(testData.columnView(demandAttribute).get(0)).isEqualTo(1);
        assertThat(testData.columnView(supplyAttribute).get(0)).isEqualTo(4);
        assertThat(testData.columnView(demandAttribute).get(1)).isEqualTo(2);
        assertThat(testData.columnView(supplyAttribute).get(1)).isEqualTo(5);
        assertThat(testData.columnView(demandAttribute).get(2)).isEqualTo(3);
        assertThat(testData.columnView(supplyAttribute).get(2)).isEqualTo(6);
    }

    @Test
    public void testBranching() {
        final var demandAttribute = integerAttribute("d");
        final var supplyAttribute = integerAttribute("s");
        final var testData = defineProblem()
                .withDemandAttributes(demandAttribute)
                .withDemands(list
                        (list(1)
                                , list(2)
                                , list(3)))
                .withSupplyAttributes(supplyAttribute)
                .withSupplies(list
                        (list(4)
                                , list(5)
                                , list(6)))
                .withConstraint(c -> {
                    c.forAll(lineValueRater(l -> l.value(demandAttribute).equals(2)))
                            .then(lineValueRater(l -> l.value(supplyAttribute).equals(6)));
                    return c;
                })
                .toProblem()
                .asSolution();
        backtracking().optimize(testData);
        assertThat(testData.size()).isEqualTo(3);
        assertThat(testData.columnView(demandAttribute).get(0)).isEqualTo(1);
        assertThat(testData.columnView(supplyAttribute).get(0)).isEqualTo(4);
        assertThat(testData.columnView(demandAttribute).get(1)).isEqualTo(2);
        assertThat(testData.columnView(supplyAttribute).get(1)).isEqualTo(6);
        assertThat(testData.columnView(demandAttribute).get(2)).isEqualTo(3);
        assertThat(testData.columnView(supplyAttribute).get(2)).isEqualTo(5);
        assertThat(testData.isOptimal()).isTrue();
    }
}