Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
HYH.APSJ
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
佟礼
HYH.APSJ
Commits
4d0bfa78
Commit
4d0bfa78
authored
Jan 14, 2026
by
Tong Li
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
多线程优化
parent
e90e9ad9
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
54 additions
and
51 deletions
+54
-51
Chromosome.java
src/main/java/com/aps/entity/Algorithm/Chromosome.java
+1
-1
GeneticDecoder.java
src/main/java/com/aps/service/Algorithm/GeneticDecoder.java
+2
-1
MachineCalculator.java
...ain/java/com/aps/service/Algorithm/MachineCalculator.java
+48
-47
ScheduleOperationService.java
...a/com/aps/service/Algorithm/ScheduleOperationService.java
+3
-2
No files found.
src/main/java/com/aps/entity/Algorithm/Chromosome.java
View file @
4d0bfa78
...
@@ -109,7 +109,7 @@ public class Chromosome {
...
@@ -109,7 +109,7 @@ public class Chromosome {
/// <summary>
/// <summary>
/// 解码后的调度结果
/// 解码后的调度结果
/// </summary>
/// </summary>
private
List
<
GAScheduleResult
>
Result
;
private
CopyOnWriteArray
List
<
GAScheduleResult
>
Result
;
/// <summary>
/// <summary>
/// 解码后的调度结果
/// 解码后的调度结果
...
...
src/main/java/com/aps/service/Algorithm/GeneticDecoder.java
View file @
4d0bfa78
...
@@ -20,6 +20,7 @@ import java.time.Duration;
...
@@ -20,6 +20,7 @@ import java.time.Duration;
import
java.time.LocalDateTime
;
import
java.time.LocalDateTime
;
import
java.time.temporal.ChronoUnit
;
import
java.time.temporal.ChronoUnit
;
import
java.util.*
;
import
java.util.*
;
import
java.util.concurrent.CopyOnWriteArrayList
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
import
java.util.concurrent.locks.ReentrantLock
;
import
java.util.concurrent.locks.ReentrantLock
;
...
@@ -436,7 +437,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
...
@@ -436,7 +437,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
List
<
ScheduleResultDetail
>
geneDetails
=
machineCalculator
.
getNextAvailableTime
(
machine
,
earliestStartTime
,
-
1
,
CopyOnWriteArray
List
<
ScheduleResultDetail
>
geneDetails
=
machineCalculator
.
getNextAvailableTime
(
machine
,
earliestStartTime
,
-
1
,
processingTimeTotal
,
chromosome
.
getResult
(),
operation
.
IsInterrupt
!=
1
,
true
,
processingTime
,
operation
.
getQuantity
(),
true
);
processingTimeTotal
,
chromosome
.
getResult
(),
operation
.
IsInterrupt
!=
1
,
true
,
processingTime
,
operation
.
getQuantity
(),
true
);
...
...
src/main/java/com/aps/service/Algorithm/MachineCalculator.java
View file @
4d0bfa78
...
@@ -40,9 +40,9 @@ public class MachineCalculator {
...
@@ -40,9 +40,9 @@ public class MachineCalculator {
/**
/**
* 获取机器下一个可用时间窗口(考虑班次约束)
* 获取机器下一个可用时间窗口(考虑班次约束)
*/
*/
public
List
<
ScheduleResultDetail
>
getNextAvailableTime
(
Machine
machine
,
int
proposedStartTime
,
public
CopyOnWriteArray
List
<
ScheduleResultDetail
>
getNextAvailableTime
(
Machine
machine
,
int
proposedStartTime
,
int
prevtime
,
int
processingTime
,
int
prevtime
,
int
processingTime
,
List
<
GAScheduleResult
>
existingTasks
,
CopyOnWriteArray
List
<
GAScheduleResult
>
existingTasks
,
boolean
isInterrupt
,
boolean
istask
,
boolean
isInterrupt
,
boolean
istask
,
double
oneTime
,
double
quantity
,
double
oneTime
,
double
quantity
,
boolean
islockMachineTime
)
{
boolean
islockMachineTime
)
{
...
@@ -62,16 +62,16 @@ public class MachineCalculator {
...
@@ -62,16 +62,16 @@ public class MachineCalculator {
// 查找最早可用开始时间
// 查找最早可用开始时间
private
List
<
ScheduleResultDetail
>
findEarliestStart
(
private
CopyOnWriteArray
List
<
ScheduleResultDetail
>
findEarliestStart
(
Machine
machine
,
int
processingTime
,
LocalDateTime
currentTime
,
Machine
machine
,
int
processingTime
,
LocalDateTime
currentTime
,
String
prevtime
,
List
<
GAScheduleResult
>
existingTasks
,
double
oneTime
,
double
quantity
,
boolean
checkprevtime
,
boolean
islockMachineTime
String
prevtime
,
CopyOnWriteArray
List
<
GAScheduleResult
>
existingTasks
,
double
oneTime
,
double
quantity
,
boolean
checkprevtime
,
boolean
islockMachineTime
,
boolean
isInterrupt
)
{
,
boolean
isInterrupt
)
{
List
<
GAScheduleResult
>
machineTasks
=
existingTasks
.
stream
()
CopyOnWriteArray
List
<
GAScheduleResult
>
machineTasks
=
existingTasks
.
stream
()
.
filter
(
t
->
t
.
getMachineId
()
==
machine
.
getId
())
.
filter
(
t
->
t
.
getMachineId
()
==
machine
.
getId
())
.
sorted
(
Comparator
.
comparingInt
(
GAScheduleResult:
:
getStartTime
))
.
sorted
(
Comparator
.
comparingInt
(
GAScheduleResult:
:
getStartTime
))
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
List
<
ScheduleResultDetail
>
times
=
new
ArrayList
<>();
CopyOnWriteArrayList
<
ScheduleResultDetail
>
times
=
new
CopyOnWrite
ArrayList
<>();
TimeSegment
slot
=
GetCurrentOrNextShift
(
machine
,
currentTime
,
prevtime
,
checkprevtime
);
TimeSegment
slot
=
GetCurrentOrNextShift
(
machine
,
currentTime
,
prevtime
,
checkprevtime
);
if
(
slot
==
null
)
return
times
;
if
(
slot
==
null
)
return
times
;
...
@@ -173,17 +173,16 @@ public class MachineCalculator {
...
@@ -173,17 +173,16 @@ public class MachineCalculator {
return
times
;
return
times
;
}
}
private
List
<
ScheduleResultDetail
>
CaldEarliestStart
(
private
CopyOnWriteArray
List
<
ScheduleResultDetail
>
CaldEarliestStart
(
Machine
machine
,
int
processingTime
,
LocalDateTime
currentTime
,
Machine
machine
,
int
processingTime
,
LocalDateTime
currentTime
,
String
prevtime
,
List
<
GAScheduleResult
>
machineTasks
,
double
oneTime
,
double
quantity
,
boolean
checkprevtime
,
boolean
islockMachineTime
String
prevtime
,
CopyOnWriteArray
List
<
GAScheduleResult
>
machineTasks
,
double
oneTime
,
double
quantity
,
boolean
checkprevtime
,
boolean
islockMachineTime
,
boolean
isInterrupt
)
{
,
boolean
isInterrupt
)
{
int
remainingTime
=
processingTime
;
int
remainingTime
=
processingTime
;
LocalDateTime
st
=
StringUtils
.
isEmpty
(
prevtime
)
?
currentTime
:
LocalDateTime
.
parse
(
prevtime
);
LocalDateTime
st
=
StringUtils
.
isEmpty
(
prevtime
)
?
currentTime
:
LocalDateTime
.
parse
(
prevtime
);
LocalDateTime
prevEnd
=
LocalDateTime
.
of
(
2000
,
1
,
1
,
0
,
0
,
0
);
LocalDateTime
prevEnd
=
LocalDateTime
.
of
(
2000
,
1
,
1
,
0
,
0
,
0
);
List
<
ScheduleResultDetail
>
times
=
new
ArrayList
<>();
CopyOnWriteArrayList
<
ScheduleResultDetail
>
times
=
new
CopyOnWriteArrayList
<>();
List
<
ScheduleResultDetail
>
oldTimes
=
new
ArrayList
<>();
List
<
TimeSegment
>
timeSegments
=
findAvailableSegments
(
machine
,
currentTime
,
machineTasks
,
remainingTime
,
isInterrupt
);
CopyOnWriteArray
List
<
TimeSegment
>
timeSegments
=
findAvailableSegments
(
machine
,
currentTime
,
machineTasks
,
remainingTime
,
isInterrupt
);
int
estimateIndex
=
(
int
)
Math
.
ceil
(
remainingTime
/
(
double
)
ONE_DAY_MINUTES
);
int
estimateIndex
=
(
int
)
Math
.
ceil
(
remainingTime
/
(
double
)
ONE_DAY_MINUTES
);
List
<
TimeSegment
>
timeSegments1
=
null
;
List
<
TimeSegment
>
timeSegments1
=
null
;
// if(estimateIndex>10)
// if(estimateIndex>10)
...
@@ -211,13 +210,13 @@ public class MachineCalculator {
...
@@ -211,13 +210,13 @@ public class MachineCalculator {
return
times
;
return
times
;
}
}
private
List
<
ScheduleResultDetail
>
CaldScheduleResultDetail
(
List
<
TimeSegment
>
timeSegments
,
Machine
machine
,
LocalDateTime
st
,
int
remainingTime
,
double
oneTime
)
private
List
<
ScheduleResultDetail
>
CaldScheduleResultDetail
(
CopyOnWriteArray
List
<
TimeSegment
>
timeSegments
,
Machine
machine
,
LocalDateTime
st
,
int
remainingTime
,
double
oneTime
)
{
{
int
processable1
=(
int
)
calculateTotalAvailableSecond
(
timeSegments
,
st
);
int
processable1
=(
int
)
calculateTotalAvailableSecond
(
timeSegments
,
st
);
List
<
ScheduleResultDetail
>
times
=
new
ArrayList
<>();
List
<
ScheduleResultDetail
>
times
=
new
CopyOnWrite
ArrayList
<>();
TimeSegment
shiftfrist
=
timeSegments
.
get
(
0
);
TimeSegment
shiftfrist
=
timeSegments
.
get
(
0
);
...
@@ -229,7 +228,7 @@ public class MachineCalculator {
...
@@ -229,7 +228,7 @@ public class MachineCalculator {
// 计算有效时间
// 计算有效时间
List
<
TimeSegment
>
timeSegments2
=
timeSegments
.
subList
(
1
,
timeSegments
.
size
()-
1
);
CopyOnWriteArrayList
<
TimeSegment
>
timeSegments2
=
new
CopyOnWriteArrayList
<>(
timeSegments
.
subList
(
1
,
timeSegments
.
size
()-
1
)
);
LocalDateTime
effectiveStart
=
timeSegments2
.
get
(
0
).
getStart
();
LocalDateTime
effectiveStart
=
timeSegments2
.
get
(
0
).
getStart
();
LocalDateTime
effectiveend
=
timeSegments2
.
get
(
timeSegments2
.
size
()-
1
).
getEnd
();
LocalDateTime
effectiveend
=
timeSegments2
.
get
(
timeSegments2
.
size
()-
1
).
getEnd
();
...
@@ -298,10 +297,10 @@ public class MachineCalculator {
...
@@ -298,10 +297,10 @@ public class MachineCalculator {
* @param requireContinuous 是否不可中断(true=不可中断)
* @param requireContinuous 是否不可中断(true=不可中断)
* @return 满足条件的可用片段列表
* @return 满足条件的可用片段列表
*/
*/
private
List
<
TimeSegment
>
findAvailableSegments
(
private
CopyOnWriteArray
List
<
TimeSegment
>
findAvailableSegments
(
Machine
machine
,
Machine
machine
,
LocalDateTime
start
,
LocalDateTime
start
,
List
<
GAScheduleResult
>
machineTasks
,
CopyOnWriteArray
List
<
GAScheduleResult
>
machineTasks
,
double
requiredMinutes
,
double
requiredMinutes
,
boolean
requireContinuous
)
{
boolean
requireContinuous
)
{
List
<
TimeSegment
>
availableSegments
=
new
ArrayList
<>();
List
<
TimeSegment
>
availableSegments
=
new
ArrayList
<>();
...
@@ -316,7 +315,7 @@ public class MachineCalculator {
...
@@ -316,7 +315,7 @@ public class MachineCalculator {
// 替换while(true),增加明确退出条件(原逻辑保留,可根据业务补充退出判断)
// 替换while(true),增加明确退出条件(原逻辑保留,可根据业务补充退出判断)
while
(
true
)
{
while
(
true
)
{
// 统一过滤逻辑:消除重复的FindAll代码
// 统一过滤逻辑:消除重复的FindAll代码
List
<
TimeSegment
>
useSegments
=
filterValidUseSegments
(
machine
.
getAvailability
(),
current
,
requireContinuous
,
requiredMinutes
);
CopyOnWriteArray
List
<
TimeSegment
>
useSegments
=
filterValidUseSegments
(
machine
.
getAvailability
(),
current
,
requireContinuous
,
requiredMinutes
);
if
(
useSegments
!=
null
&&
!
useSegments
.
isEmpty
())
{
if
(
useSegments
!=
null
&&
!
useSegments
.
isEmpty
())
{
// 计算可用时间总和(保留原有逻辑)
// 计算可用时间总和(保留原有逻辑)
...
@@ -334,7 +333,7 @@ public class MachineCalculator {
...
@@ -334,7 +333,7 @@ public class MachineCalculator {
{
{
days
=
0
;
days
=
0
;
}
}
List
<
TimeSegment
>
newSegments
=
machineScheduler
.
generateTimeSegment
(
machine
,
lastSegmentEnd
.
plusDays
(
1
),
days
);
CopyOnWriteArray
List
<
TimeSegment
>
newSegments
=
machineScheduler
.
generateTimeSegment
(
machine
,
lastSegmentEnd
.
plusDays
(
1
),
days
);
addSegmentsWithDeduplication
(
machine
,
newSegments
);
addSegmentsWithDeduplication
(
machine
,
newSegments
);
...
@@ -350,7 +349,7 @@ public class MachineCalculator {
...
@@ -350,7 +349,7 @@ public class MachineCalculator {
LocalDateTime
firstSegmentStart
=
useSegments
.
get
(
0
).
getStart
().
compareTo
(
current
)
<
0
?
current:
useSegments
.
get
(
0
).
getStart
();
LocalDateTime
firstSegmentStart
=
useSegments
.
get
(
0
).
getStart
().
compareTo
(
current
)
<
0
?
current:
useSegments
.
get
(
0
).
getStart
();
LocalDateTime
lastSegmentEnd
=
useSegments
.
get
(
useSegments
.
size
()
-
1
).
getEnd
();
LocalDateTime
lastSegmentEnd
=
useSegments
.
get
(
useSegments
.
size
()
-
1
).
getEnd
();
//获取维修和当前任务
//获取维修和当前任务
List
<
TimeSegment
>
conflictSegments
=
getConflictIntervals
(
machine
,
machineTasks
,
firstSegmentStart
,
lastSegmentEnd
);
CopyOnWriteArray
List
<
TimeSegment
>
conflictSegments
=
getConflictIntervals
(
machine
,
machineTasks
,
firstSegmentStart
,
lastSegmentEnd
);
if
(
conflictSegments
==
null
||
conflictSegments
.
isEmpty
())
{
if
(
conflictSegments
==
null
||
conflictSegments
.
isEmpty
())
{
// 无冲突:直接返回可用片段(保留原有逻辑)
// 无冲突:直接返回可用片段(保留原有逻辑)
...
@@ -361,7 +360,7 @@ public class MachineCalculator {
...
@@ -361,7 +360,7 @@ public class MachineCalculator {
return
useSegments
;
return
useSegments
;
}
else
{
}
else
{
// 有冲突:可选返回冲突前足够片段或跳过冲突
// 有冲突:可选返回冲突前足够片段或跳过冲突
List
<
TimeSegment
>
resultSegments
=
handleConflictsWithSumLogic
(
useSegments
,
conflictSegments
,
current
,
requiredMinutes
);
CopyOnWriteArray
List
<
TimeSegment
>
resultSegments
=
handleConflictsWithSumLogic
(
useSegments
,
conflictSegments
,
current
,
requiredMinutes
);
if
(
resultSegments
!=
null
&&
!
resultSegments
.
isEmpty
())
{
if
(
resultSegments
!=
null
&&
!
resultSegments
.
isEmpty
())
{
if
(
resultSegments
.
get
(
0
).
getStart
().
compareTo
(
current
)
<
0
)
{
if
(
resultSegments
.
get
(
0
).
getStart
().
compareTo
(
current
)
<
0
)
{
spiltMachineAvailable
(
machine
,
resultSegments
.
get
(
0
),
current
);
spiltMachineAvailable
(
machine
,
resultSegments
.
get
(
0
),
current
);
...
@@ -384,7 +383,7 @@ public class MachineCalculator {
...
@@ -384,7 +383,7 @@ public class MachineCalculator {
.
max
(
Comparator
.
comparing
(
TimeSegment:
:
getEnd
,
(
a
,
b
)
->
a
.
compareTo
(
b
)))
.
max
(
Comparator
.
comparing
(
TimeSegment:
:
getEnd
,
(
a
,
b
)
->
a
.
compareTo
(
b
)))
.
map
(
TimeSegment:
:
getEnd
)
.
map
(
TimeSegment:
:
getEnd
)
.
orElse
(
current
);
.
orElse
(
current
);
List
<
TimeSegment
>
newSegments
=
machineScheduler
.
generateTimeSegment
(
machine
,
lastSegmentEnd
.
plusDays
(
1
),
0
);
CopyOnWriteArray
List
<
TimeSegment
>
newSegments
=
machineScheduler
.
generateTimeSegment
(
machine
,
lastSegmentEnd
.
plusDays
(
1
),
0
);
addSegmentsWithDeduplication
(
machine
,
newSegments
);
addSegmentsWithDeduplication
(
machine
,
newSegments
);
}
}
}
}
...
@@ -400,8 +399,8 @@ public class MachineCalculator {
...
@@ -400,8 +399,8 @@ public class MachineCalculator {
* @return 刚好满足时长的片段数组
* @return 刚好满足时长的片段数组
* @throws IllegalArgumentException 总时长不足时抛出
* @throws IllegalArgumentException 总时长不足时抛出
*/
*/
public
List
<
TimeSegment
>
getEnoughSegmentsByEstimateIndex
(
public
CopyOnWriteArray
List
<
TimeSegment
>
getEnoughSegmentsByEstimateIndex
(
List
<
TimeSegment
>
availableSegments
,
CopyOnWriteArray
List
<
TimeSegment
>
availableSegments
,
LocalDateTime
currentTime
,
LocalDateTime
currentTime
,
int
requiredMinutes
)
{
int
requiredMinutes
)
{
// 基础校验
// 基础校验
...
@@ -470,37 +469,39 @@ public class MachineCalculator {
...
@@ -470,37 +469,39 @@ public class MachineCalculator {
}
}
// ========== 步骤3:精准裁剪片段,返回最终结果 ==========
// ========== 步骤3:精准裁剪片段,返回最终结果 ==========
List
<
TimeSegment
>
resultList
=
availableSegments
.
subList
(
0
,
targetIndex
)
;
CopyOnWriteArrayList
<
TimeSegment
>
resultList
=
new
CopyOnWriteArrayList
<>(
availableSegments
.
subList
(
0
,
targetIndex
))
;
return
resultList
;
return
resultList
;
}
}
/**
/**
* 计算从0到指定索引的所有时段的总有效分钟数
* 计算从0到指定索引的所有时段的总有效分钟数
*/
*/
private
double
calculateTotalMinutesByIndex
(
List
<
TimeSegment
>
segments
,
LocalDateTime
currentTime
,
int
endIndex
)
{
private
double
calculateTotalMinutesByIndex
(
CopyOnWriteArrayList
<
TimeSegment
>
segments
,
LocalDateTime
currentTime
,
int
endIndex
)
{
return
calculateTotalAvailableSecond
(
segments
.
subList
(
0
,
endIndex
),
currentTime
);
return
calculateTotalAvailableSecond
(
new
CopyOnWriteArrayList
(
segments
.
subList
(
0
,
endIndex
)),
currentTime
);
}
}
/**
/**
* 统一过滤有效可用片段
* 统一过滤有效可用片段
*/
*/
private
List
<
TimeSegment
>
filterValidUseSegments
(
List
<
TimeSegment
>
allSegments
,
private
CopyOnWriteArrayList
<
TimeSegment
>
filterValidUseSegments
(
CopyOnWriteArray
List
<
TimeSegment
>
allSegments
,
LocalDateTime
currentTime
,
LocalDateTime
currentTime
,
boolean
requireContinuous
,
boolean
requireContinuous
,
double
requiredMinutes
)
{
double
requiredMinutes
)
{
// 空判断
// 空判断
if
(
allSegments
==
null
||
allSegments
.
isEmpty
())
{
if
(
allSegments
==
null
||
allSegments
.
isEmpty
())
{
return
new
ArrayList
<>();
return
new
CopyOnWrite
ArrayList
<>();
}
}
// 统一过滤条件
// 统一过滤条件
List
<
TimeSegment
>
baseValidSegments
=
allSegments
.
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
baseValidSegments
=
allSegments
.
stream
()
.
filter
(
slot
->
!
slot
.
isUsed
()
// 对应 !slot.IsUsed
.
filter
(
slot
->
!
slot
.
isUsed
()
// 对应 !slot.IsUsed
&&
slot
.
getType
()
!=
SegmentType
.
MAINTENANCE
// 对应 slot.Type != SegmentType.Maintenance
&&
slot
.
getType
()
!=
SegmentType
.
MAINTENANCE
// 对应 slot.Type != SegmentType.Maintenance
&&
slot
.
getEnd
().
compareTo
(
currentTime
)
>
0
)
// 对应 slot.End > currentTime
&&
slot
.
getEnd
().
compareTo
(
currentTime
)
>
0
)
// 对应 slot.End > currentTime
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
// 无需不可中断或所需时长无效时,直接返回基础有效片段
// 无需不可中断或所需时长无效时,直接返回基础有效片段
if
(!
requireContinuous
||
requiredMinutes
<=
0
)
{
if
(!
requireContinuous
||
requiredMinutes
<=
0
)
{
...
@@ -517,7 +518,7 @@ public class MachineCalculator {
...
@@ -517,7 +518,7 @@ public class MachineCalculator {
* @param currentTime 当前时间
* @param currentTime 当前时间
* @return 总可用时长(分钟)
* @return 总可用时长(分钟)
*/
*/
private
double
calculateTotalAvailableSecond
(
List
<
TimeSegment
>
useSegments
,
LocalDateTime
currentTime
)
{
private
double
calculateTotalAvailableSecond
(
CopyOnWriteArray
List
<
TimeSegment
>
useSegments
,
LocalDateTime
currentTime
)
{
// 空判断:
// 空判断:
if
(
useSegments
==
null
||
useSegments
.
size
()==
0
)
{
if
(
useSegments
==
null
||
useSegments
.
size
()==
0
)
{
return
0.0
;
return
0.0
;
...
@@ -539,13 +540,13 @@ public class MachineCalculator {
...
@@ -539,13 +540,13 @@ public class MachineCalculator {
* 辅助方法:过滤出满足连续时长要求的片段(仅不可中断配置生效时调用)
* 辅助方法:过滤出满足连续时长要求的片段(仅不可中断配置生效时调用)
* 前置剔除零散无效片段,减少后续逻辑处理量
* 前置剔除零散无效片段,减少后续逻辑处理量
*/
*/
private
List
<
TimeSegment
>
filterContinuousCompliantSegments
(
private
CopyOnWriteArray
List
<
TimeSegment
>
filterContinuousCompliantSegments
(
List
<
TimeSegment
>
baseValidSegments
,
CopyOnWriteArray
List
<
TimeSegment
>
baseValidSegments
,
LocalDateTime
currentTime
,
LocalDateTime
currentTime
,
double
requiredContinuous
)
{
double
requiredContinuous
)
{
// 空判断
// 空判断
if
(
baseValidSegments
==
null
||
baseValidSegments
.
isEmpty
())
{
if
(
baseValidSegments
==
null
||
baseValidSegments
.
isEmpty
())
{
return
new
ArrayList
<>();
return
new
CopyOnWrite
ArrayList
<>();
}
}
CopyOnWriteArrayList
<
TimeSegment
>
continuousCompliantSegments
=
new
CopyOnWriteArrayList
<>();
CopyOnWriteArrayList
<
TimeSegment
>
continuousCompliantSegments
=
new
CopyOnWriteArrayList
<>();
...
@@ -605,22 +606,22 @@ public class MachineCalculator {
...
@@ -605,22 +606,22 @@ public class MachineCalculator {
* 批量获取冲突区间(优化边界判断,更严谨)
* 批量获取冲突区间(优化边界判断,更严谨)
* 依赖:Machine、ScheduleResult、TimeSegment、DateTime 类(已在前序代码中定义,需补充部分属性)
* 依赖:Machine、ScheduleResult、TimeSegment、DateTime 类(已在前序代码中定义,需补充部分属性)
*/
*/
private
List
<
TimeSegment
>
getConflictIntervals
(
private
CopyOnWriteArray
List
<
TimeSegment
>
getConflictIntervals
(
Machine
machine
,
Machine
machine
,
List
<
GAScheduleResult
>
machineTasks
,
CopyOnWriteArray
List
<
GAScheduleResult
>
machineTasks
,
LocalDateTime
start
,
LocalDateTime
start
,
LocalDateTime
end
)
{
LocalDateTime
end
)
{
List
<
TimeSegment
>
conflictIntervals
=
new
ArrayList
<>();
CopyOnWriteArrayList
<
TimeSegment
>
conflictIntervals
=
new
CopyOnWrite
ArrayList
<>();
// 1. 维护窗口冲突(优化重叠判断,更严谨)
// 1. 维护窗口冲突(优化重叠判断,更严谨)
if
(
machine
.
getMaintenanceWindows
()
!=
null
&&
!
machine
.
getMaintenanceWindows
().
isEmpty
())
{
if
(
machine
.
getMaintenanceWindows
()
!=
null
&&
!
machine
.
getMaintenanceWindows
().
isEmpty
())
{
// 过滤重叠的维护窗口并转换为TimeSegment
// 过滤重叠的维护窗口并转换为TimeSegment
List
<
TimeSegment
>
maintenanceConflicts
=
machine
.
getMaintenanceWindows
().
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
maintenanceConflicts
=
machine
.
getMaintenanceWindows
().
stream
()
// 正确的重叠判断:w.StartTime < end && w.EndTime > start
// 正确的重叠判断:w.StartTime < end && w.EndTime > start
.
filter
(
w
->
w
.
getStartTime
().
compareTo
(
end
)
<
0
&&
w
.
getEndTime
().
compareTo
(
start
)
>
0
)
.
filter
(
w
->
w
.
getStartTime
().
compareTo
(
end
)
<
0
&&
w
.
getEndTime
().
compareTo
(
start
)
>
0
)
// 转换为TimeSegment对象
// 转换为TimeSegment对象
.
map
(
w
->
new
TimeSegment
(
w
.
getStartTime
(),
w
.
getEndTime
()))
.
map
(
w
->
new
TimeSegment
(
w
.
getStartTime
(),
w
.
getEndTime
()))
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
// 批量添加冲突片段
// 批量添加冲突片段
conflictIntervals
.
addAll
(
maintenanceConflicts
);
conflictIntervals
.
addAll
(
maintenanceConflicts
);
}
}
...
@@ -648,7 +649,7 @@ public class MachineCalculator {
...
@@ -648,7 +649,7 @@ public class MachineCalculator {
// 按开始时间排序
// 按开始时间排序
return
conflictIntervals
.
stream
()
return
conflictIntervals
.
stream
()
.
sorted
(
Comparator
.
comparing
(
TimeSegment:
:
getStart
,
Comparator
.
nullsLast
(
LocalDateTime:
:
compareTo
)))
.
sorted
(
Comparator
.
comparing
(
TimeSegment:
:
getStart
,
Comparator
.
nullsLast
(
LocalDateTime:
:
compareTo
)))
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
}
}
/**
/**
* 按总和逻辑处理冲突(保留原有冲突处理逻辑,优化严谨性)
* 按总和逻辑处理冲突(保留原有冲突处理逻辑,优化严谨性)
...
@@ -658,9 +659,9 @@ public class MachineCalculator {
...
@@ -658,9 +659,9 @@ public class MachineCalculator {
* @param requiredMinutes 所需总时长(分钟)
* @param requiredMinutes 所需总时长(分钟)
* @return 满足条件的片段列表,无满足条件时返回null
* @return 满足条件的片段列表,无满足条件时返回null
*/
*/
private
List
<
TimeSegment
>
handleConflictsWithSumLogic
(
private
CopyOnWriteArray
List
<
TimeSegment
>
handleConflictsWithSumLogic
(
List
<
TimeSegment
>
useSegments
,
CopyOnWriteArray
List
<
TimeSegment
>
useSegments
,
List
<
TimeSegment
>
conflictSegments
,
CopyOnWriteArray
List
<
TimeSegment
>
conflictSegments
,
LocalDateTime
currentTime
,
LocalDateTime
currentTime
,
double
requiredMinutes
)
{
double
requiredMinutes
)
{
...
@@ -668,12 +669,12 @@ public class MachineCalculator {
...
@@ -668,12 +669,12 @@ public class MachineCalculator {
for
(
TimeSegment
conflict
:
conflictSegments
)
{
for
(
TimeSegment
conflict
:
conflictSegments
)
{
LocalDateTime
currentTime1
=
currentTime
;
LocalDateTime
currentTime1
=
currentTime
;
// 过滤冲突前的可用片段(
// 过滤冲突前的可用片段(
List
<
TimeSegment
>
preConflictSegments
=
useSegments
.
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
preConflictSegments
=
useSegments
.
stream
()
.
filter
(
slot
->
.
filter
(
slot
->
(
slot
.
getStart
().
compareTo
(
currentTime1
)
>=
0
||
slot
.
getEnd
().
compareTo
(
currentTime1
)
>
0
)
(
slot
.
getStart
().
compareTo
(
currentTime1
)
>=
0
||
slot
.
getEnd
().
compareTo
(
currentTime1
)
>
0
)
&&
slot
.
getEnd
().
compareTo
(
conflict
.
getStart
())
<=
0
&&
slot
.
getEnd
().
compareTo
(
conflict
.
getStart
())
<=
0
)
)
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
// 计算冲突前片段的总可用时长
// 计算冲突前片段的总可用时长
double
preConflictTotalTime
=
calculateTotalAvailableSecond
(
preConflictSegments
,
currentTime
);
double
preConflictTotalTime
=
calculateTotalAvailableSecond
(
preConflictSegments
,
currentTime
);
...
@@ -693,7 +694,7 @@ public class MachineCalculator {
...
@@ -693,7 +694,7 @@ public class MachineCalculator {
/**
/**
* 追加片段并去重、排序(避免冗余片段和遍历混乱)
* 追加片段并去重、排序(避免冗余片段和遍历混乱)
*/
*/
private
void
addSegmentsWithDeduplication
(
Machine
machine
,
List
<
TimeSegment
>
newSegments
)
{
private
void
addSegmentsWithDeduplication
(
Machine
machine
,
CopyOnWriteArray
List
<
TimeSegment
>
newSegments
)
{
// 空判断:新片段为null或空集合时直接返回,对应C#的 newSegments == null || newSegments.Count == 0
// 空判断:新片段为null或空集合时直接返回,对应C#的 newSegments == null || newSegments.Count == 0
if
(
newSegments
==
null
||
newSegments
.
isEmpty
())
{
if
(
newSegments
==
null
||
newSegments
.
isEmpty
())
{
return
;
return
;
...
...
src/main/java/com/aps/service/Algorithm/ScheduleOperationService.java
View file @
4d0bfa78
...
@@ -12,6 +12,7 @@ import org.springframework.context.annotation.ScopeMetadata;
...
@@ -12,6 +12,7 @@ import org.springframework.context.annotation.ScopeMetadata;
import
javax.xml.transform.Result
;
import
javax.xml.transform.Result
;
import
java.time.LocalDateTime
;
import
java.time.LocalDateTime
;
import
java.util.*
;
import
java.util.*
;
import
java.util.concurrent.CopyOnWriteArrayList
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
import
java.util.stream.IntStream
;
import
java.util.stream.IntStream
;
...
@@ -931,9 +932,9 @@ Integer newMachineId1=newMachineId.intValue();
...
@@ -931,9 +932,9 @@ Integer newMachineId1=newMachineId.intValue();
chromosome
.
setResultOld
(
ProductionDeepCopyUtil
.
deepCopyList
(
chromosome
.
getResult
(),
GAScheduleResult
.
class
));
chromosome
.
setResultOld
(
ProductionDeepCopyUtil
.
deepCopyList
(
chromosome
.
getResult
(),
GAScheduleResult
.
class
));
chromosome
.
getResult
().
clear
();
chromosome
.
getResult
().
clear
();
List
<
GAScheduleResult
>
Resultlock
=
chromosome
.
getResult
().
stream
()
CopyOnWriteArray
List
<
GAScheduleResult
>
Resultlock
=
chromosome
.
getResult
().
stream
()
.
filter
(
o
->
o
.
isIsLocked
()
==
true
)
.
filter
(
o
->
o
.
isIsLocked
()
==
true
)
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
chromosome
.
setResult
(
ProductionDeepCopyUtil
.
deepCopyList
(
Resultlock
,
GAScheduleResult
.
class
));
chromosome
.
setResult
(
ProductionDeepCopyUtil
.
deepCopyList
(
Resultlock
,
GAScheduleResult
.
class
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment