There is no need for "greedy" strategy when searching for extra cable paths
This commit is contained in:
parent
e68f3a7996
commit
e708d3e6b2
@ -10,6 +10,9 @@ import ru.dbotthepony.mc.otm.UNIVERSE_TICKS
|
||||
import ru.dbotthepony.mc.otm.capability.receiveEnergy
|
||||
import ru.dbotthepony.mc.otm.config.CablesConfig
|
||||
import ru.dbotthepony.mc.otm.core.addAll
|
||||
import ru.dbotthepony.mc.otm.core.collect.map
|
||||
import ru.dbotthepony.mc.otm.core.collect.max
|
||||
import ru.dbotthepony.mc.otm.core.collect.reduce
|
||||
import ru.dbotthepony.mc.otm.core.math.Decimal
|
||||
import ru.dbotthepony.mc.otm.core.math.RelativeSide
|
||||
import ru.dbotthepony.mc.otm.core.shuffle
|
||||
@ -168,6 +171,11 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
private set
|
||||
|
||||
val availableThroughput: Decimal get() {
|
||||
if (lastTick != UNIVERSE_TICKS) {
|
||||
transferredLastTick = Decimal.ZERO
|
||||
lastTick = UNIVERSE_TICKS
|
||||
}
|
||||
|
||||
checkThroughput()
|
||||
return throughput - transferredLastTick
|
||||
}
|
||||
@ -485,16 +493,17 @@ class EnergyCableGraph : GraphNodeList<EnergyCableBlockEntity.Node, EnergyCableG
|
||||
val maxSearches = CablesConfig.SEARCHES_PER_TICK
|
||||
|
||||
if (!list.saturated && lastTickSearches <= maxSearches) {
|
||||
var maxThroughput = list.paths.maxOfOrNull { it.availableThroughput } ?: Decimal.ZERO
|
||||
var maxThroughput = list.paths.iterator().map { it.availableThroughput }.reduce(Decimal.ZERO, Decimal::plus)
|
||||
|
||||
while (maxThroughput < energyToTransfer && !list.saturated && ++lastTickSearches <= maxSearches) {
|
||||
// TODO: Heuristics here is wrong
|
||||
val find = findPath(a, b, list.paths, maxThroughput)
|
||||
|
||||
if (find == null || find in list.paths) {
|
||||
list.saturated = true
|
||||
} else {
|
||||
list.paths.add(find)
|
||||
maxThroughput = maxOf(maxThroughput, find.availableThroughput)
|
||||
maxThroughput += find.availableThroughput
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user