电科院-电能替代模型工具开发
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
2.6 KiB

package com.dky.calculate;
import com.dky.utils.entity.DevSpec;
import com.dky.utils.entity.DevPrice;
import com.dky.utils.result.MatchedDevice;
import com.dky.utils.result.MatchedDeviceResult;
import java.util.*;
public class RequireDevice {
public static MatchedDeviceResult matchDevices(double demandCapacity,List<DevSpec> deviceList,List<DevPrice> priceList) {
// 对设备按照容量从大到小排序
deviceList.sort((d1, d2) -> Double.compare(d2.getCapacity(), d1.getCapacity()));
double remainingCapacity = demandCapacity;
double totalPrice = 0;
List<MatchedDevice> matchedDevices = new ArrayList<>();
// 遍历设备列表.根据需求容量匹配设备
for (DevSpec spec : deviceList) {
if (spec.getCapacity() <= remainingCapacity) {
int count = (int) Math.floor(remainingCapacity / spec.getCapacity());
remainingCapacity = remainingCapacity - (spec.getCapacity() * count);
matchedDevices.add(new MatchedDevice(spec, count));
if (count > 0) {
DevPrice price = priceList.stream()
.filter(p -> p.getId().equals(spec.getId()))
.findFirst()
.orElse(null);
if (price != null) {
double devicePrice = price.getDevPrice() * count;
totalPrice += devicePrice;
}
}
}else {
for (int i = deviceList.size()-1; i >= 0; i--){
if (deviceList.get(i).getCapacity() >= remainingCapacity){
matchedDevices.add(new MatchedDevice(deviceList.get(i), 1));
int finalI = i;
DevPrice price = priceList.stream()
.filter(p -> p.getId().equals(deviceList.get(finalI).getId()))
.findFirst()
.orElse(null);
if (price != null) {
double devicePrice = price.getDevPrice();
totalPrice += devicePrice;
}
break;
}
}
break;
}
if (remainingCapacity <= 0) {
break; // 当总容量已经满足需求时,跳出循环,不再选择其他设备
}
}
return new MatchedDeviceResult(matchedDevices, Math.round(totalPrice*100.0)/100.0);
}
}