繁体   English   中英

Optaplanner:初始化规划变量问题

[英]Optaplanner : Initializing planning variable problem

我是 Optaplanner 的新手,为了熟悉它,我尝试运行一个简单的代码。 这个想法是我有一个 integer 类型的单一计划变量,它的范围在 1 到 30 之间,我试图最大化。 所以通常求解器应该给我一个 30 的值。

我的代码如下:

计划实体和计划变量:

@PlanningEntity
public class variable {

    @PlanningVariable(valueRangeProviderRefs = "xRange")
    private Integer x;

    public variable() {

    }   

    public Integer getX() {
        return x;
    }

    public void setX(Integer x) {
        this.x = x;
    }
    
}

规划解决方案

@PlanningSolution 公共 class Planningsolution {

@PlanningEntityProperty
private variable variable;

@ValueRangeProvider(id="xRange")
public CountableValueRange<Integer> getxRange(){
    return ValueRangeFactory.createIntValueRange(1, 30);
}

@PlanningScore
private HardSoftScore score;

public Planningsolution() {

}

public variable getVariable() {
    return variable;
}

public void setVariable(variable variable) {
    this.variable = variable;
}

public HardSoftScore getScore() {
    return score;
}

public void setScore(HardSoftScore score) {
    this.score = score;
}       

}

约束提供者

public class SimpleConstraintProvider implements ConstraintProvider {


    
     @Override
        public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
            return new Constraint[] {
                    // Hard constraints
                    maxValue(constraintFactory),

            };
     }
            
         private Constraint maxValue (ConstraintFactory constraintFactory) {
                
                return constraintFactory.forEach(variable.class)
                        .reward("maximum", HardSoftScore.ONE_SOFT,variable::getX);
                    }
}

主要的:

public class SimpleApp {

     private static final Logger LOGGER = LoggerFactory.getLogger(SimpleApp.class);

        public static void main(String[] args) {
            SolverFactory<Planningsolution> solverFactory = SolverFactory.create(new SolverConfig()
                    .withSolutionClass(Planningsolution.class)
                    .withEntityClasses(variable.class)
                    .withConstraintProviderClass(SimpleConstraintProvider.class)

                    .withTerminationSpentLimit(Duration.ofSeconds(10)));

            // Load the problem
            Planningsolution problem = new Planningsolution();
            
            

            // Solve the problem
            Solver<Planningsolution> solver = solverFactory.buildSolver();
            Planningsolution solution = solver.solve(problem);

            // Visualize the solution
           System.out.println("solution: " + display(solution) + "\n" + "score: " + solution.getScore());;
        }
    
        
        public static Integer display(Planningsolution solution) {
            variable var = new variable();
            return var.getX();
        }
}

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="appender" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d [%t] %-5p %m%n</pattern>
    </encoder>
  </appender>

  <logger name="org.optaplanner" level="info"/>

  <root level="warn">
    <appender-ref ref="appender"/>
  </root>

</configuration>

我得到的 output 是:

解决方案:null 得分:0hard/0soft

为了使计划变量可初始化,它们必须能够接受null作为值。 Java 原始类型(例如int )无法做到这一点,因此您的计划变量需要是Integer 错误消息甚至告诉您这样做,尽管措辞有点神秘。

作为旁注,我认为我们应该能够更好地处理这种情况。 如果人们不想要null在那里,我们不应该强迫他们。 未来发展需要考虑的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM