在 optaplanner 约束内添加数组

问题描述 投票:0回答:1

在 Optaplanner 约束中,我迭代了一组规划实体,这些实体包含一个属性,该属性是一个固定大小的时间序列。我想将所有时间序列相加并检查总和是否始终低于某个阈值。

在 Optaplanner 中,约束看起来像:

    public Constraint ResourceOverocupation(ConstraintFactory constraintFactory) {

    return constraintFactory
            .forEach(Operation.class)
            .map(operation -> operation.resourceUsage) 
            // operation.resourceUsage is an Array of fixed size, representing a time series
            // Now I want to add all the resourceUsage into an array of the same size.
            // Then I want to count how many items of the array are bigger than a value X and
            // add +1 to the score to optimize.
            .
            .penalize("Overocupation", HardMediumSoftScore.ONE_MEDIUM);
}

在 Optaplanner 之外,我想问题是如何流式传输对象列表,每个对象都包含一系列相同大小的整数,并对这些对象进行逐元素求和。这应该会产生一个相同大小的列表。应该是这样的……

例子:

Object object1;
ArrayList<int> array1 = Arrays.asList(1, 1, 1);
object1.ArrayOfInts = array1;

Object object2;
ArrayList<int> array2 = Arrays.asList(2, 2, 2);
object2.ArrayOfInts = array2; 


ArrayList<Object> listOfObjects = Arrays.asList(object1, object2);


ArrayList<Integer> result = listOfObjects.stream().map(object -> object.ArrayOfInts).sum(...

“结果”将是 [3, 3, 3].

欢迎任何帮助!

java arrays java-stream optaplanner elementwise-operations
1个回答
0
投票
        MyObject object1 = new MyObject();
        object1.arrayOfInts = Arrays.asList(1, 1, 1);

        MyObject object2 = new MyObject();
        object2.arrayOfInts = Arrays.asList(2, 2, 2);


        List<MyObject> listOfObjects = Arrays.asList(object1, object2);

        List<Integer> sumList = IntStream.range(0, listOfObjects.get(0).arrayOfInts.size())
                .mapToObj(i -> listOfObjects.stream()
                        .mapToInt(l -> l.arrayOfInts.get(i))
                        .sum())
                .collect(Collectors.toList());

让 MyObject 简单地成为:

public class MyObject {
    List<Integer> arrayOfInts;
}

只是为了编译和测试的目的,但你可以适应你的解决方案

© www.soinside.com 2019 - 2024. All rights reserved.