当前位置: 首页 > 知识库问答 >
问题:

云平衡Optaplanner:实施过度约束规划

欧阳勇
2023-03-14

我正试图用java的Optaplanner实现一个简单的云平衡系统,该系统具有过度约束的规划。

最喜欢的是,我正在尝试使用Optaplanner Java库实现一个简单的云平衡系统,该系统具有过度约束的规划。我将模型映射到我的问题(车辆和资产),进行变量替换cpuPower-

package org.optaplanner.examples.cloudbalancing.solver;
    dialect "java"

import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScoreHolder;

import org.optaplanner.examples.cloudbalancing.domain.Mission;
import org.optaplanner.examples.cloudbalancing.domain.Vehicle;
import org.optaplanner.examples.cloudbalancing.domain.Asset;

global HardSoftScoreHolder scoreHolder;

// ############################################################################
// Hard constraints
// ############################################################################

rule "requiredVolumeTotal"
    dialect "mvel"
    when
        $vehicle : Vehicle($maxVolume : maxVolume)
        Number( $totalReqVolume : intValue() > $maxVolume ) from accumulate 
            ( Asset( vehicle == $vehicle , $volume : volume),
            sum($volume)) 
    then
        scoreHolder.addHardConstraintMatch(kcontext, -($totalReqVolume -$maxVolume));
end

rule "requiredWeightTotal"
    dialect "mvel"
    when
        $vehicle : Vehicle($maxWeight : maxWeight)
        Number( $totalReqWeight : intValue() > $maxWeight ) from accumulate 
            ( Asset( vehicle == $vehicle , $weight : weight),
            sum($weight)) 
    then
        scoreHolder.addHardConstraintMatch(kcontext, -($totalReqWeight -$maxWeight));
end

如果我使用这个简单的例子,我会收到一个所有进程都已签名的响应,尽管其中一些不能分配给计算机。对于这个问题,optaplanner的目的是将实现更改为配置过度的计划。留档说:

  • 通过切换分数类型添加一个额外的分数级别(通常是硬级别和软级别之间的中等级别)。
  • 使规划变量为空。
  • 在新级别上添加分数约束(通常是中等约束)以惩罚未分配实体的数量(或它们的加权总和)。

我正在执行可空注释和比较方法中的检查:

 @PlanningVariable(valueRangeProviderRefs = {"computerRange"},
        strengthComparatorClass = CloudComputerStrengthComparator.class,
        nullable = true)
public CloudComputer getComputer() {
    return computer;
}

_

@Override
public int compare(CloudComputer a, CloudComputer b) {
     if (a == null || b == null)
         return 0;
    return new CompareToBuilder()
            .append(a.getMultiplicand(), b.getMultiplicand())
            .append(b.getCost(), a.getCost()) // Descending (but this is debatable)
            .append(a.getId(), b.getId())
            .toComparison();
}

这改变了求解方法全部未赋值且解不正确后的过程,因为任何时候都是软/硬的。

如何定义一个新的约束(中等级别)来惩罚未分配实体的数量?

共有1个答案

汪玮
2023-03-14

首先,在您的DRL中使用HardMediumSoftScoreHolder,在您的域中使用HardMediumSoftScore。请看DRL规则的病床规划示例

 类似资料:
  • 此约束是否在分数计算器()中。它是否可以检查一个解决方案中的进程组是否被分配到相同的CPU并给它打分? 有没有其他更好的方法,比如使用ValueSelector? 并且我在缺省情况下得到了一个解决方案,即使进程不能分配给CPU(因为限制)。计划者就是这样工作的吗?

  • 我想为VRP创建一个过度约束规划的增量分数。我创建了一个传统的虚拟车辆,其中包括所有计划外的客户。 示例: Optaplanner将Customer1从Vehicle1移动到Vehicle2: 当我得到AfterVariableChanged:previousStandstill(Customer1)时,在Customer.getVehicle()中,我有旧车辆的价值,我不知道是否需要添加软成本(

  • 我试图解决一个调度问题,它围绕着以下安排: 是否可以使用和实现约束?我尝试过以下路线: 我认为应该没有问题,但不确定如何获得这个来实现我想要的。这里是否需要?还是有一个不同的、更好的整体方法? 作为参考,ShiftAssignment类可以很容易地拥有如下所示的方法:

  • 正如标题所说。我是Optaplanner的新开发人员。在我切换到过度约束规划之前,CH阶段工作正常:这里是CH按预期分配21个实体,LS能够找到一个最优解决方案(忽略中等得分级别): 在切换到可空规划变量后,中等得分水平对每个未分配的实体都有一个惩罚的约束。这是解决optplanner无法找到最佳解决方案的同一个问题实例的日志: null

  • 我一直试图让过度约束的计划来适应我的情况,但不断遇到一些失败的硬约束仍然被分配的问题。如果之前有人回答过这个问题,我很抱歉,但是我看到的大多数示例/解决方案都是围绕Drools展开的,我在这个项目中使用的是streams API。使用optaplanner的quarkus 1.4.2实现,如果有帮助的话。 任何关于我可能做错什么的见解都将不胜感激,并提前感谢:)

  • 我试图将规划实体和一个问题事实加入到约束流中,但我的IDE抛出了一个错误: 我的问题结构和运输问题很相似。我有节点和边,想要计算边的数量。 我的主要问题是: 和规划实体: 约束的代码为: 如果我尝试连接边与边,例如: 这不会出错。原因是,我尝试将节点连接到节点的Edge属性中的Edge中吗?有没有别的办法可以做我想做的事?