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
35f0e8bb
Commit
35f0e8bb
authored
Jan 14, 2026
by
DESKTOP-VKRD9QF\Administration
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
行程并发修改
parent
a3e69687
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
150 additions
and
4313 deletions
+150
-4313
ProductionDeepCopyUtil.java
...main/java/com/aps/common/util/ProductionDeepCopyUtil.java
+18
-0
Machine.java
src/main/java/com/aps/entity/basic/Machine.java
+1
-1
MachineTimeline.java
src/main/java/com/aps/entity/basic/MachineTimeline.java
+3
-3
GeneticAlgorithm.java
...main/java/com/aps/service/Algorithm/GeneticAlgorithm.java
+6
-0
MachineCalculator.java
...ain/java/com/aps/service/Algorithm/MachineCalculator.java
+24
-21
AlgorithmScheduler6.java
src/main/java/com/aps/service/plan/AlgorithmScheduler6.java
+0
-1033
AlgorithmScheduler7.java
src/main/java/com/aps/service/plan/AlgorithmScheduler7.java
+0
-1691
AlgorithmScheduler8.java
src/main/java/com/aps/service/plan/AlgorithmScheduler8.java
+0
-1302
MachineSchedulerService.java
...in/java/com/aps/service/plan/MachineSchedulerService.java
+18
-18
PlanResultService.java
src/main/java/com/aps/service/plan/PlanResultService.java
+1
-63
PlanSchedulerService.java
src/main/java/com/aps/service/plan/PlanSchedulerService.java
+76
-74
application.yml
src/main/resources/application.yml
+3
-3
MachineSchedulerTest.java
src/test/java/com/aps/demo/MachineSchedulerTest.java
+0
-104
No files found.
src/main/java/com/aps/common/util/ProductionDeepCopyUtil.java
View file @
35f0e8bb
...
...
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import
com.fasterxml.jackson.databind.SerializationFeature
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.concurrent.CopyOnWriteArrayList
;
/**
* 生产环境可用的深拷贝工具类
...
...
@@ -109,4 +110,21 @@ public class ProductionDeepCopyUtil {
throw
new
RuntimeException
(
"列表深拷贝失败"
,
e
);
}
}
public
static
<
T
>
CopyOnWriteArrayList
<
T
>
deepCopyList
(
CopyOnWriteArrayList
<
T
>
source
,
Class
<
T
>
elementType
)
{
if
(
source
==
null
)
{
return
new
CopyOnWriteArrayList
<>();
}
try
{
String
json
=
objectMapper
.
writeValueAsString
(
source
);
return
objectMapper
.
readValue
(
json
,
objectMapper
.
getTypeFactory
().
constructCollectionType
(
CopyOnWriteArrayList
.
class
,
elementType
));
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"列表深拷贝失败"
,
e
);
}
}
}
\ No newline at end of file
src/main/java/com/aps/entity/basic/Machine.java
View file @
35f0e8bb
...
...
@@ -16,7 +16,7 @@ public class Machine {
private
double
totalTaskTime
=
0
;
private
List
<
Shift
>
shifts
;
private
List
<
MaintenanceWindow
>
maintenanceWindows
;
private
List
<
TimeSegment
>
availability
=
new
CopyOnWriteArrayList
()
;
private
CopyOnWriteArrayList
<
TimeSegment
>
availability
;
private
String
code
;
private
List
<
Holiday
>
holidays
;
...
...
src/main/java/com/aps/entity/basic/MachineTimeline.java
View file @
35f0e8bb
...
...
@@ -8,7 +8,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
public
class
MachineTimeline
{
private
Long
machineId
;
private
List
<
TimeSegment
>
segments
;
private
CopyOnWriteArray
List
<
TimeSegment
>
segments
;
private
LocalDateTime
validFrom
;
private
LocalDateTime
validTo
;
private
LocalDateTime
lastUpdated
;
...
...
@@ -27,11 +27,11 @@ public class MachineTimeline {
this
.
machineId
=
machineId
;
}
public
List
<
TimeSegment
>
getSegments
()
{
public
CopyOnWriteArray
List
<
TimeSegment
>
getSegments
()
{
return
segments
;
}
public
void
setSegments
(
List
<
TimeSegment
>
segments
)
{
public
void
setSegments
(
CopyOnWriteArray
List
<
TimeSegment
>
segments
)
{
this
.
segments
=
segments
;
}
...
...
src/main/java/com/aps/service/Algorithm/GeneticAlgorithm.java
View file @
35f0e8bb
...
...
@@ -352,9 +352,15 @@ public class GeneticAlgorithm {
}
private
void
decode
(
GeneticDecoder
decoder
,
Chromosome
chromosome
,
ScheduleParams
param
,
List
<
Entry
>
allOperations
,
List
<
GlobalOperationInfo
>
globalOpList
)
{
if
(
chromosome
==
null
){
System
.
out
.
println
(
"chromosome==null"
);
}
chromosome
.
setResult
(
new
CopyOnWriteArrayList
<>());
// 假设Machine类有拷贝方法,或使用MapStruct等工具进行映射
chromosome
.
setMachines
(
ProductionDeepCopyUtil
.
deepCopyList
(
machines
,
Machine
.
class
));
// 简单拷贝,实际可能需要深拷贝
chromosome
.
setAllOperations
(
allOperations
);
// 简单拷贝,实际可能需要深拷贝
...
...
src/main/java/com/aps/service/Algorithm/MachineCalculator.java
View file @
35f0e8bb
...
...
@@ -5,7 +5,7 @@ import com.aps.common.util.ProductionDeepCopyUtil;
import
com.aps.entity.Algorithm.GAScheduleResult
;
import
com.aps.entity.Algorithm.ScheduleResultDetail
;
import
com.aps.entity.basic.*
;
import
com.aps.service.plan.AlgorithmScheduler8
;
import
com.aps.service.plan.MachineSchedulerService
;
import
com.baomidou.mybatisplus.core.toolkit.StringUtils
;
...
...
@@ -308,10 +308,10 @@ public class MachineCalculator {
LocalDateTime
current
=
start
;
// 预先排序设备可用片段,避免后续遍历混乱
List
<
TimeSegment
>
allUseTimeSegment
=
machine
.
getAvailability
().
stream
()
.
filter
(
slot
->
!
slot
.
isUsed
()
&&
slot
.
getType
()
!=
SegmentType
.
MAINTENANCE
)
.
sorted
(
Comparator
.
comparing
(
TimeSegment:
:
getStart
,
(
a
,
b
)
->
a
.
compareTo
(
b
)))
.
collect
(
Collectors
.
toList
());
//
List<TimeSegment> allUseTimeSegment = machine.getAvailability().stream()
//
.filter(slot -> !slot.isUsed() && slot.getType() != SegmentType.MAINTENANCE)
//
.sorted(Comparator.comparing(TimeSegment::getStart, (a, b) -> a.compareTo(b)))
//
.collect(Collectors.toList());
// 替换while(true),增加明确退出条件(原逻辑保留,可根据业务补充退出判断)
while
(
true
)
{
...
...
@@ -548,8 +548,8 @@ public class MachineCalculator {
return
new
ArrayList
<>();
}
List
<
TimeSegment
>
continuousCompliantSegments
=
new
ArrayList
<>();
List
<
TimeSegment
>
tempContinuousGroup
=
new
ArrayList
<>();
CopyOnWriteArrayList
<
TimeSegment
>
continuousCompliantSegments
=
new
CopyOnWrite
ArrayList
<>();
CopyOnWriteArrayList
<
TimeSegment
>
tempContinuousGroup
=
new
CopyOnWrite
ArrayList
<>();
double
tempContinuous
=
0.0
;
LocalDateTime
lastSegmentEnd
=
currentTime
;
...
...
@@ -700,7 +700,7 @@ public class MachineCalculator {
}
machine
.
getAvailability
().
addAll
(
newSegments
);
List
<
TimeSegment
>
mergedSegments
=
MergeSegments
(
machine
.
getAvailability
());
CopyOnWriteArray
List
<
TimeSegment
>
mergedSegments
=
MergeSegments
(
machine
.
getAvailability
());
// synchronized (machine.getAvailability()) {
// 合并片段(去重+排序),
...
...
@@ -1018,7 +1018,7 @@ public class MachineCalculator {
private
void
RemoveMachineAvailable1
(
Machine
machine
,
ScheduleResultDetail
geneDetails
,
TimeSegment
targetSegment1
)
{
List
<
TimeSegment
>
timeSegments
=
new
ArrayList
<>();
List
<
TimeSegment
>
availabilitySnapshot
=
new
ArrayList
<>(
machine
.
getAvailability
());
CopyOnWriteArrayList
<
TimeSegment
>
availabilitySnapshot
=
new
CopyOnWrite
ArrayList
<>(
machine
.
getAvailability
());
int
index
=
availabilitySnapshot
.
stream
()
.
filter
(
t
->
t
.
getKey
().
equals
(
geneDetails
.
getKey
()))
.
findFirst
()
...
...
@@ -1072,9 +1072,12 @@ if(keys1!=null&&keys1.size()>0) {
keys
.
addAll
(
keys1
);
}
machine
.
getAvailability
().
stream
()
.
filter
(
t
->
keys
.
contains
(
t
.
getKey
()))
.
forEach
(
t
->
t
.
setUsed
(
false
));
List
<
TimeSegment
>
toUpdate
=
machine
.
getAvailability
().
stream
()
.
filter
(
t
->
keys
.
contains
(
t
.
getKey
()))
.
collect
(
Collectors
.
toList
());
// 然后批量修改
toUpdate
.
forEach
(
t
->
t
.
setUsed
(
false
));
...
...
@@ -1082,7 +1085,7 @@ if(keys1!=null&&keys1.size()>0) {
public
void
AddMachineAvailable1
(
Machine
machine
,
List
<
ScheduleResultDetail
>
geneDetails
)
{
if
(
geneDetails
==
null
||
geneDetails
.
isEmpty
())
return
;
List
<
TimeSegment
>
availabilitySnapshot
=
new
ArrayList
<>(
machine
.
getAvailability
());
CopyOnWriteArrayList
<
TimeSegment
>
availabilitySnapshot
=
new
CopyOnWrite
ArrayList
<>(
machine
.
getAvailability
());
for
(
ScheduleResultDetail
detail
:
geneDetails
)
{
if
(
detail
.
getUsedSegment
()!=
null
&&
detail
.
getUsedSegment
().
size
()>
0
)
...
...
@@ -1143,18 +1146,18 @@ if(keys1!=null&&keys1.size()>0) {
machine
.
getAvailability
().
sort
((
a
,
b
)
->
a
.
getStart
().
compareTo
(
b
.
getStart
()));
}
private
List
<
TimeSegment
>
MergeSegments
(
List
<
TimeSegment
>
segments
)
{
List
<
TimeSegment
>
maintenanceSegments
=
segments
.
stream
()
private
CopyOnWriteArrayList
<
TimeSegment
>
MergeSegments
(
CopyOnWriteArray
List
<
TimeSegment
>
segments
)
{
CopyOnWriteArray
List
<
TimeSegment
>
maintenanceSegments
=
segments
.
stream
()
.
filter
(
t
->
t
.
getType
()
==
SegmentType
.
MAINTENANCE
)
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
List
<
TimeSegment
>
unusedRegularSegments
=
segments
.
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
unusedRegularSegments
=
segments
.
stream
()
.
filter
(
t
->
t
.
getType
()
!=
SegmentType
.
MAINTENANCE
&&
!
t
.
isUsed
())
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
List
<
TimeSegment
>
usedRegularSegments
=
segments
.
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
usedRegularSegments
=
segments
.
stream
()
.
filter
(
t
->
t
.
getType
()
!=
SegmentType
.
MAINTENANCE
&&
t
.
isUsed
())
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
unusedRegularSegments
.
sort
(
Comparator
.
comparing
(
TimeSegment:
:
getStart
));
...
...
@@ -1169,7 +1172,7 @@ if(keys1!=null&&keys1.size()>0) {
}
}
List
<
TimeSegment
>
result
=
new
ArrayList
<>(
mergedUnused
);
CopyOnWriteArrayList
<
TimeSegment
>
result
=
new
CopyOnWrite
ArrayList
<>(
mergedUnused
);
result
.
addAll
(
usedRegularSegments
);
result
.
addAll
(
maintenanceSegments
);
result
.
sort
(
Comparator
.
comparing
(
TimeSegment:
:
getStart
));
...
...
src/main/java/com/aps/service/plan/AlgorithmScheduler6.java
deleted
100644 → 0
View file @
a3e69687
This diff is collapsed.
Click to expand it.
src/main/java/com/aps/service/plan/AlgorithmScheduler7.java
deleted
100644 → 0
View file @
a3e69687
This diff is collapsed.
Click to expand it.
src/main/java/com/aps/service/plan/AlgorithmScheduler8.java
deleted
100644 → 0
View file @
a3e69687
This diff is collapsed.
Click to expand it.
src/main/java/com/aps/service/plan/MachineSchedulerService.java
View file @
35f0e8bb
...
...
@@ -67,14 +67,14 @@ public class MachineSchedulerService {
LocalDate
currentDate
=
currentTime
.
toLocalDate
();
LocalDate
endDate
=
currentTime
.
plusDays
(
200
).
toLocalDate
();
List
<
TimeSegment
>
allSegments
=
new
CopyOnWriteArrayList
<>();
CopyOnWriteArray
List
<
TimeSegment
>
allSegments
=
new
CopyOnWriteArrayList
<>();
while
(!
currentDate
.
isAfter
(
endDate
))
{
// 检查是否在假期内
boolean
isHolidayPeriod
=
isHoliday
(
machine
,
currentDate
);
// 生成当日时间段
List
<
TimeSegment
>
daySegments
=
calculateDaySegments
(
machine
,
currentDate
,
isHolidayPeriod
);
CopyOnWriteArray
List
<
TimeSegment
>
daySegments
=
calculateDaySegments
(
machine
,
currentDate
,
isHolidayPeriod
);
allSegments
.
addAll
(
daySegments
);
// 跳到下一天
...
...
@@ -116,7 +116,7 @@ public class MachineSchedulerService {
return
timeline
;
}
public
List
<
TimeSegment
>
generateTimeSegment
(
Machine
machine
,
LocalDateTime
currentTime
,
int
days
)
{
public
CopyOnWriteArray
List
<
TimeSegment
>
generateTimeSegment
(
Machine
machine
,
LocalDateTime
currentTime
,
int
days
)
{
if
(
days
==
0
)
{
days
=
200
;
...
...
@@ -147,9 +147,9 @@ try {
}
if
(
timeline
.
getValidTo
().
compareTo
(
currentTime
)
>
0
)
{
LocalDateTime
currentTime1
=
currentTime
;
List
<
TimeSegment
>
timeSegments
=
timeline
.
getSegments
().
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
timeSegments
=
timeline
.
getSegments
().
stream
()
.
filter
(
t
->
t
.
getStart
().
isAfter
(
currentTime1
)||
t
.
getStart
().
isBefore
(
currentTime1
))
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
return
ProductionDeepCopyUtil
.
deepCopyList
(
timeSegments
,
TimeSegment
.
class
);
}
else
{
...
...
@@ -164,7 +164,7 @@ try {
LocalDate
currentDate
=
currentTime
.
toLocalDate
();
LocalDate
endDate
=
currentTime
.
plusDays
(
days
).
toLocalDate
();
List
<
TimeSegment
>
segments
=
new
CopyOnWriteArrayList
<>();
CopyOnWriteArray
List
<
TimeSegment
>
segments
=
new
CopyOnWriteArrayList
<>();
while
(!
currentDate
.
isAfter
(
endDate
))
{
// 检查是否在假期内
...
...
@@ -236,7 +236,7 @@ try {
machine
.
getAvailability
().
addAll
(
newSegments
);
// 合并片段(去重+排序),并重新赋值给设备的可用片段列表,对应C#的 machine.Availability = MergeSegments(...)
List
<
TimeSegment
>
mergedSegments
=
mergeSegments
(
machine
.
getAvailability
());
CopyOnWriteArray
List
<
TimeSegment
>
mergedSegments
=
mergeSegments
(
machine
.
getAvailability
());
machine
.
setAvailability
(
mergedSegments
);
}
...
...
@@ -260,8 +260,8 @@ try {
return
false
;
}
private
List
<
TimeSegment
>
calculateDaySegments
(
Machine
machine
,
LocalDate
date
,
boolean
isHoliday
)
{
List
<
TimeSegment
>
segments
=
new
CopyOnWriteArrayList
<>();
private
CopyOnWriteArray
List
<
TimeSegment
>
calculateDaySegments
(
Machine
machine
,
LocalDate
date
,
boolean
isHoliday
)
{
CopyOnWriteArray
List
<
TimeSegment
>
segments
=
new
CopyOnWriteArrayList
<>();
if
(
isHoliday
)
{
// 假期:只处理特定日期的班次
...
...
@@ -359,29 +359,29 @@ if(shifts==null||shifts.size()==0) {
return
shiftDays
.
contains
(
targetDayValue
);
}
private
List
<
TimeSegment
>
mergeSegments
(
List
<
TimeSegment
>
segments1
)
{
private
CopyOnWriteArrayList
<
TimeSegment
>
mergeSegments
(
CopyOnWriteArray
List
<
TimeSegment
>
segments1
)
{
List
<
TimeSegment
>
segments
=
ProductionDeepCopyUtil
.
deepCopyList
(
segments1
,
TimeSegment
.
class
);
CopyOnWriteArray
List
<
TimeSegment
>
segments
=
ProductionDeepCopyUtil
.
deepCopyList
(
segments1
,
TimeSegment
.
class
);
if
(
segments
==
null
||
segments
.
size
()==
0
)
{
return
null
;
}
List
<
TimeSegment
>
maintenanceSegments1
=
segments
.
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
maintenanceSegments1
=
segments
.
stream
()
.
filter
(
t
->
t
.
getType
()==
null
)
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
if
(
maintenanceSegments1
.
size
()>
0
)
{
int
i
=
0
;
}
List
<
TimeSegment
>
maintenanceSegments
=
segments
.
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
maintenanceSegments
=
segments
.
stream
()
.
filter
(
t
->
t
.
getType
()!=
null
&&
t
.
getType
()
==
SegmentType
.
MAINTENANCE
)
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
List
<
TimeSegment
>
otherSegments
=
segments
.
stream
()
CopyOnWriteArray
List
<
TimeSegment
>
otherSegments
=
segments
.
stream
()
.
filter
(
t
->
t
.
getType
()!=
null
&&
t
.
getType
()
!=
SegmentType
.
MAINTENANCE
)
.
collect
(
Collectors
.
to
List
(
));
.
collect
(
Collectors
.
to
Collection
(
CopyOnWriteArrayList:
:
new
));
// 按开始时间排序
otherSegments
.
sort
(
Comparator
.
comparing
(
TimeSegment:
:
getStart
));
...
...
@@ -400,7 +400,7 @@ if(shifts==null||shifts.size()==0) {
}
}
List
<
TimeSegment
>
result
=
new
CopyOnWriteArrayList
<>(
merged
);
CopyOnWriteArray
List
<
TimeSegment
>
result
=
new
CopyOnWriteArrayList
<>(
merged
);
result
.
addAll
(
maintenanceSegments
);
// 按开始时间排序
...
...
src/main/java/com/aps/service/plan/PlanResultService.java
View file @
35f0e8bb
...
...
@@ -120,69 +120,7 @@ public class PlanResultService {
private
LocalDateTime
baseTime
=
LocalDateTime
.
of
(
2025
,
11
,
1
,
0
,
0
,
0
);
public
List
<
ScheduleChromosome
>
execute
()
{
try
{
// 1. 读取数据
List
<
Machine
>
machines
=
loadData
(
"machines.json"
,
Machine
.
class
);
List
<
Product
>
products
=
loadData
(
"products.json"
,
Product
.
class
);
List
<
Order
>
orders
=
loadData
(
"orders.json"
,
Order
.
class
);
// 设置机器信息到班次中
for
(
Machine
machine
:
machines
)
{
if
(
machine
.
getShifts
()
!=
null
)
{
for
(
Shift
shift
:
machine
.
getShifts
())
{
shift
.
setMachineId
(
machine
.
getId
());
shift
.
setMachineName
(
machine
.
getName
());
}
}
// 调试:打印机器和班次信息
System
.
out
.
println
(
"Machine: "
+
machine
.
getId
()
+
", Name: "
+
machine
.
getName
());
if
(
machine
.
getShifts
()
!=
null
)
{
for
(
Shift
shift
:
machine
.
getShifts
())
{
System
.
out
.
println
(
" Shift: "
+
shift
.
getStartTime
()
+
" - "
+
shift
.
getEndTime
()
+
", Status: "
+
shift
.
getStatus
()
+
", MachineId: "
+
shift
.
getMachineId
()
+
", MachineName: "
+
shift
.
getMachineName
());
}
}
}
// 创建节假日
List
<
Holiday
>
holidays
=
Arrays
.
asList
(
new
Holiday
(
LocalDateTime
.
of
(
2025
,
10
,
1
,
0
,
0
),
LocalDateTime
.
of
(
2025
,
10
,
7
,
23
,
59
))
);
// 将节假日添加到所有设备中
addHolidaysToAllMachines
(
machines
,
holidays
);
// 3. 创建调度服务
MachineSchedulerService
machineScheduler
=
new
MachineSchedulerService
(
holidays
,
LocalDateTime
.
of
(
2025
,
10
,
1
,
0
,
0
,
0
));
// 4. 初始化机器时间线
for
(
Machine
machine
:
machines
)
{
MachineTimeline
timeline
=
machineScheduler
.
getOrCreateTimeline
(
machine
);
machine
.
setAvailability
(
timeline
.
getSegments
());
}
// 5. 执行调度算法
AlgorithmScheduler7
scheduler
=
new
AlgorithmScheduler7
(
products
,
machines
,
orders
,
machineScheduler
);
List
<
ScheduleChromosome
>
scheduleChromosomes
=
scheduler
.
RunAll
();
// 对调度结果按照 fitness 由高到低排序
scheduleChromosomes
.
sort
((
c1
,
c2
)
->
Double
.
compare
(
c2
.
getFitness
(),
c1
.
getFitness
()));
// 为每个 ScheduleChromosome 分配场景ID(基于排序后的位置)
for
(
int
i
=
0
;
i
<
scheduleChromosomes
.
size
();
i
++)
{
scheduleChromosomes
.
get
(
i
).
setSceneId
(
i
+
1
);
// 场景ID从1开始
}
return
scheduleChromosomes
;
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"调度执行失败"
,
e
);
}
return
null
;
}
...
...
src/main/java/com/aps/service/plan/PlanSchedulerService.java
View file @
35f0e8bb
...
...
@@ -19,80 +19,82 @@ public class PlanSchedulerService {
private
final
LocalDateTime
baseTime
=
LocalDateTime
.
of
(
2025
,
10
,
1
,
0
,
0
,
0
);
public
List
<
PlanResourceTaskGanttVO
>
execute
()
{
try
{
// 1. 读取数据
List
<
Machine
>
machines
=
JsonFileReader
.
readListFromResources
(
"machines.json"
,
Machine
.
class
);
List
<
Product
>
products
=
JsonFileReader
.
readListFromResources
(
"products.json"
,
Product
.
class
);
List
<
Order
>
orders
=
JsonFileReader
.
readListFromResources
(
"orders.json"
,
Order
.
class
);
// 2. 创建节假日
List
<
Holiday
>
holidays
=
Arrays
.
asList
(
new
Holiday
(
LocalDateTime
.
of
(
2025
,
10
,
1
,
0
,
0
),
LocalDateTime
.
of
(
2025
,
10
,
7
,
23
,
59
))
);
// 3. 创建调度服务
MachineSchedulerService
machineScheduler
=
new
MachineSchedulerService
(
holidays
,
LocalDateTime
.
of
(
2025
,
10
,
1
,
0
,
0
,
0
));
// 4. 初始化机器时间线
for
(
Machine
machine
:
machines
)
{
MachineTimeline
timeline
=
machineScheduler
.
getOrCreateTimeline
(
machine
);
machine
.
setAvailability
(
timeline
.
getSegments
());
}
// 5. 执行调度算法
AlgorithmScheduler6
scheduler
=
new
AlgorithmScheduler6
(
products
,
machines
,
orders
,
machineScheduler
);
List
<
ScheduleChromosome
>
scheduleChromosomes
=
scheduler
.
RunAll
();
List
<
PlanResourceTaskGanttVO
>
ganttlist
=
new
ArrayList
<>();
long
sceneId
=
1L
;
for
(
ScheduleChromosome
chromosome
:
scheduleChromosomes
)
{
// 转换基因列表和设备列表
List
<
GenVO
>
genVOS
=
convertGeneListToGenVO
(
chromosome
.
getGenes
(),
baseTime
);
List
<
MachineVO
>
machineVOS
=
machines
.
stream
()
.
map
(
this
::
convertToVO
)
.
collect
(
Collectors
.
toList
());
// 按设备ID分组任务
Map
<
Long
,
List
<
GenVO
>>
taskMap
=
genVOS
.
stream
()
.
collect
(
Collectors
.
groupingBy
(
GenVO:
:
getEquipId
));
// 为每个设备设置任务
for
(
MachineVO
machine
:
machineVOS
)
{
Integer
equipId
=
Integer
.
valueOf
(
machine
.
getEquipId
());
List
<
GenVO
>
tasks
=
taskMap
.
get
(
equipId
);
if
(
tasks
!=
null
)
{
// 按开始时间排序
tasks
.
sort
(
Comparator
.
comparing
(
GenVO:
:
getStartTime
));
machine
.
setTasks
(
tasks
);
}
else
{
machine
.
setTasks
(
new
ArrayList
<>());
// 如果没有任务,设置为空列表
}
}
// 现在machineVOS中的每个MachineVO都包含了对应的任务列表
PlanResourceTaskGanttVO
ganttVO
=
new
PlanResourceTaskGanttVO
()
.
setResources
(
machineVOS
)
.
setEarliestTaskStartTime
(
LocalDateTime
.
of
(
2025
,
9
,
1
,
0
,
0
,
0
))
.
setLastTaskAssignmentTime
(
LocalDateTime
.
of
(
2025
,
12
,
1
,
0
,
0
,
0
))
.
setSceneId
(
sceneId
);
sceneId
++;
ganttlist
.
add
(
ganttVO
);
}
return
ganttlist
;
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"调度执行失败"
,
e
);
}
// try {
// // 1. 读取数据
// List<Machine> machines = JsonFileReader.readListFromResources("machines.json", Machine.class);
// List<Product> products = JsonFileReader.readListFromResources("products.json", Product.class);
// List<Order> orders = JsonFileReader.readListFromResources("orders.json", Order.class);
//
// // 2. 创建节假日
// List<Holiday> holidays = Arrays.asList(
// new Holiday(LocalDateTime.of(2025, 10, 1, 0, 0),
// LocalDateTime.of(2025, 10, 7, 23, 59))
// );
//
// // 3. 创建调度服务
// MachineSchedulerService machineScheduler = new MachineSchedulerService(
// holidays, LocalDateTime.of(2025, 10, 1, 0, 0, 0));
//
// // 4. 初始化机器时间线
// for (Machine machine : machines) {
// MachineTimeline timeline = machineScheduler.getOrCreateTimeline(machine);
// machine.setAvailability(timeline.getSegments());
// }
//
// // 5. 执行调度算法
// AlgorithmScheduler6 scheduler = new AlgorithmScheduler6(products, machines, orders, machineScheduler);
// List<ScheduleChromosome> scheduleChromosomes = scheduler.RunAll();
// List<PlanResourceTaskGanttVO> ganttlist = new ArrayList<>();
// long sceneId = 1L;
//
//
// for (ScheduleChromosome chromosome : scheduleChromosomes
// ) {
//
// // 转换基因列表和设备列表
// List<GenVO> genVOS = convertGeneListToGenVO(chromosome.getGenes(), baseTime);
// List<MachineVO> machineVOS = machines.stream()
// .map(this::convertToVO)
// .collect(Collectors.toList());
//
//// 按设备ID分组任务
// Map<Long, List<GenVO>> taskMap = genVOS.stream()
// .collect(Collectors.groupingBy(GenVO::getEquipId));
//
//// 为每个设备设置任务
// for (MachineVO machine : machineVOS) {
// Integer equipId = Integer.valueOf(machine.getEquipId());
// List<GenVO> tasks = taskMap.get(equipId);
//
// if (tasks != null) {
// // 按开始时间排序
// tasks.sort(Comparator.comparing(GenVO::getStartTime));
// machine.setTasks(tasks);
// } else {
// machine.setTasks(new ArrayList<>()); // 如果没有任务,设置为空列表
// }
// }
//
//// 现在machineVOS中的每个MachineVO都包含了对应的任务列表
// PlanResourceTaskGanttVO ganttVO = new PlanResourceTaskGanttVO()
// .setResources(machineVOS)
// .setEarliestTaskStartTime(LocalDateTime.of(2025, 9, 1, 0, 0, 0))
// .setLastTaskAssignmentTime(LocalDateTime.of(2025, 12, 1, 0, 0, 0))
// .setSceneId(sceneId);
// sceneId++;
// ganttlist.add(ganttVO);
// }
//
//
//
//
// return ganttlist;
//
// } catch (Exception e) {
// throw new RuntimeException("调度执行失败", e);
// }
return
null
;
}
public
GenVO
convertGeneToGenVO
(
Gene
gene
,
LocalDateTime
baseTime
)
{
...
...
src/main/resources/application.yml
View file @
35f0e8bb
...
...
@@ -10,8 +10,8 @@ spring:
pathmatch
:
matching-strategy
:
ant_path_matcher
# Spring Boot 2.6+ 需要这个配置
redis
:
host
:
39.100.88.40
port
:
63
79
host
:
192.168.0.181
port
:
63
80
timeout
:
120000
database
:
10
password
:
redis@228!
...
...
@@ -37,7 +37,7 @@ spring:
# Oracle数据源
oracle
:
driver-class-name
:
oracle.jdbc.OracleDriver
url
:
jdbc:oracle:thin:@//
39.100.78.207:700
2/ORCLPDB1
# ORCL为你的Oracle实例名
url
:
jdbc:oracle:thin:@//
192.168.0.181:152
2/ORCLPDB1
# ORCL为你的Oracle实例名
username
:
mes
# 替换为你的Oracle用户名
password
:
root_mes123456
# 替换为你的Oracle密码
# sqlserver:
...
...
src/test/java/com/aps/demo/MachineSchedulerTest.java
deleted
100644 → 0
View file @
a3e69687
package
com
.
aps
.
demo
;
import
com.aps.common.util.JsonFileReader
;
import
com.aps.entity.basic.ScheduleChromosome
;
import
com.aps.entity.basic.*
;
import
com.aps.service.plan.AlgorithmScheduler7
;
import
com.aps.service.plan.MachineSchedulerService
;
import
java.time.LocalDateTime
;
import
java.util.Arrays
;
import
java.util.List
;
public
class
MachineSchedulerTest
{
public
static
void
main
(
String
[]
args
)
{
try
{
// // 1. 读取JSON文件
// String jsonContent = new String(Files.readAllBytes(Paths.get("src/main/resources/machines.json")));
// // 2. 配置ObjectMapper支持Java 8时间API
// ObjectMapper objectMapper = new ObjectMapper();
// objectMapper.registerModule(new JavaTimeModule());
// objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
List
<
Machine
>
machines
=
JsonFileReader
.
readListFromResources
(
"machines.json"
,
Machine
.
class
);
// 读取产品数据
List
<
Product
>
products
=
JsonFileReader
.
readListFromResources
(
"products.json"
,
Product
.
class
);
// 读取订单数据
List
<
Order
>
orders
=
JsonFileReader
.
readListFromResources
(
"orders.json"
,
Order
.
class
);
// 3. 反序列化JSON到Machine列表
// List<Machine> machines = objectMapper.readValue(jsonContent,
// objectMapper.getTypeFactory().constructCollectionType(List.class, Machine.class));
// 4. 创建节假日数据
List
<
Holiday
>
holidays
=
Arrays
.
asList
(
new
Holiday
(
LocalDateTime
.
of
(
2025
,
10
,
1
,
0
,
0
),
LocalDateTime
.
of
(
2025
,
10
,
7
,
23
,
59
))
);
// 5. 创建调度服务
MachineSchedulerService
machineScheduler
=
new
MachineSchedulerService
(
holidays
,
LocalDateTime
.
of
(
2025
,
10
,
1
,
0
,
0
,
0
));
// 6. 为每个设备生成时间线
for
(
Machine
machine
:
machines
)
{
System
.
out
.
println
(
"处理设备: "
+
machine
.
getName
());
MachineTimeline
machineTimeline
=
machineScheduler
.
getOrCreateTimeline
(
machine
);
machine
.
setAvailability
(
machineTimeline
.
getSegments
());
// 打印结果
System
.
out
.
println
(
"设备 "
+
machine
.
getName
()
+
" 的时间段数量: "
+
(
machine
.
getAvailability
()
!=
null
?
machine
.
getAvailability
().
size
()
:
0
));
if
(
machine
.
getAvailability
()
!=
null
&&
!
machine
.
getAvailability
().
isEmpty
())
{
System
.
out
.
println
(
"时间段:"
);
machine
.
getAvailability
().
stream
().
forEach
(
segment
->
{
System
.
out
.
printf
(
" %s - %s (%s)%n"
,
segment
.
getStart
(),
segment
.
getEnd
(),
segment
.
getType
());
});
}
System
.
out
.
println
(
"---"
);
}
// 7. 测试缓存功能
System
.
out
.
println
(
"缓存中的设备数量: "
+
MachineSchedulerService
.
getCacheSize
());
// 8. 测试特定设备的时间段生成
if
(!
machines
.
isEmpty
())
{
Machine
firstMachine
=
machines
.
get
(
0
);
List
<
TimeSegment
>
segments
=
machineScheduler
.
generateTimeSegment
(
firstMachine
,
LocalDateTime
.
of
(
2025
,
10
,
1
,
0
,
0
,
0
),
0
);
System
.
out
.
println
(
"直接生成的时间段数量: "
+
segments
.
size
());
}
AlgorithmScheduler7
scheduler
=
new
AlgorithmScheduler7
(
products
,
machines
,
orders
,
machineScheduler
);
List
<
ScheduleChromosome
>
scheduleChromosomes
=
scheduler
.
RunAll
();
for
(
ScheduleChromosome
run:
scheduleChromosomes
)
{
System
.
out
.
println
(
"------------------"
+
run
.
getFitness
()+
"------------------"
);
scheduler
.
PrintScheduleSummary
(
run
);
}
ScheduleChromosome
run
=
scheduler
.
Run
();
scheduler
.
PrintScheduleSummary
(
run
);
System
.
out
.
println
(
run
.
getFitness
());
System
.
out
.
println
(
"------------------"
+
scheduleChromosomes
.
size
()+
"------------------"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
\ No newline at end of file
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