我正试图用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();
}
这改变了求解方法全部未赋值且解不正确后的过程,因为任何时候都是软/硬的。
如何定义一个新的约束(中等级别)来惩罚未分配实体的数量?
首先,在您的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中吗?有没有别的办法可以做我想做的事?