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

vbopmzt1  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(163)

我试图实现一个简单的云平衡系统与过度约束规划与Optaplanner与java.
我正在尝试用Java的Optaplanner库实现一个简单的云平衡系统。我将模型Map到我的问题(车辆和资产),做变量替换cpuPower -〉weight,memory -〉volume。规则定义为不超过这2个变量中的任何一个后,drl文件:

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的目的是将实现更改为overconstrained plannig。文档说明:

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

我在compare方法中做了nullable注解和检查:

@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();
}

由于此更改,解决方法后的过程均未指定,且解决方案不正确,原因是曾经是0软/0硬。
如何定义一个新的约束(中等级别)来惩罚未分配实体的数量?

yi0zb3m4

yi0zb3m41#

首先在您的DRL中使用HardMediumSoftScoreHolder,在您的域中使用HardMediumSoftScore

相关问题