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
d209cd62
Commit
d209cd62
authored
Jan 16, 2026
by
DESKTOP-VKRD9QF\Administration
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
http://39.100.78.207:1213/tongli/hyh.apsj
parents
20d04adf
15136f5f
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
154 additions
and
68 deletions
+154
-68
OperationSort.java
src/main/java/com/aps/entity/Algorithm/OperationSort.java
+25
-0
GeneticAlgorithm.java
...main/java/com/aps/service/Algorithm/GeneticAlgorithm.java
+8
-0
GeneticDecoder.java
src/main/java/com/aps/service/Algorithm/GeneticDecoder.java
+18
-28
ScheduleOperationService.java
...a/com/aps/service/Algorithm/ScheduleOperationService.java
+93
-32
PlanResultService.java
src/main/java/com/aps/service/plan/PlanResultService.java
+3
-1
PlanResultServiceTest.java
src/test/java/com/aps/demo/PlanResultServiceTest.java
+7
-7
No files found.
src/main/java/com/aps/entity/Algorithm/OperationSort.java
0 → 100644
View file @
d209cd62
package
com
.
aps
.
entity
.
Algorithm
;
import
lombok.Data
;
/**
* 作者:佟礼
* 时间:2026-01-15
*/
@Data
public
class
OperationSort
{
int
id
;
int
time
;
int
group
;
/**
* 工序顺序
*/
public
int
sequence
;
public
OperationSort
(
int
id
,
int
time
,
int
group
,
int
sequence
)
{
this
.
id
=
id
;
this
.
time
=
time
;
this
.
group
=
group
;
this
.
sequence
=
sequence
;
}
}
src/main/java/com/aps/service/Algorithm/GeneticAlgorithm.java
View file @
d209cd62
...
...
@@ -125,6 +125,14 @@ public class GeneticAlgorithm {
if
(
population
.
size
()<
param
.
getTournamentSize
())
{
best
.
setBaseTime
(
param
.
getBaseTime
());
best
.
setOrderMaterials
(
orderMaterials
);
best
.
setOperatRel
(
_entryRel
);
if
(
best
.
getInitMachines
()==
null
)
{
best
.
setInitMachines
(
ProductionDeepCopyUtil
.
deepCopyList
(
machines
,
Machine
.
class
));
}
LocalDateTime
endtime1
=
LocalDateTime
.
now
();
FileHelper
.
writeLogFile
(
String
.
format
(
"排产-------总方案数%d----结束---%s----耗时%d----"
,
population
.
size
(),
allOperations
.
get
(
0
).
getSceneId
(),
DateTimeUtil
.
diffDuration
(
starttime
,
endtime1
).
getSeconds
())
);
return
best
;
...
...
src/main/java/com/aps/service/Algorithm/GeneticDecoder.java
View file @
d209cd62
...
...
@@ -382,6 +382,8 @@ if(finishedOrder==null||finishedOrder.size()==0)
int
teardownTime
=
machineOption
.
getTeardownTime
();
int
preTime
=
machineOption
.
getPreTime
();
int
setupTime
=
calculateSetupTime
(
chromosome
.
getResult
(),
operation
,
machine
,
machineOption
);
...
...
@@ -393,29 +395,6 @@ if(finishedOrder==null||finishedOrder.size()==0)
// 确定任务的最早开始时间(基于前一道工序的完整结束时间,包含后处理)
int
earliestStartTime
=
prevOperationEndTime
;
// 检查设备上是否有前一个任务
GAScheduleResult
lastGeneOnMachine
=
chromosome
.
getResult
().
stream
()
.
filter
(
g
->
g
.
getMachineId
()
==
machine
.
getId
())
.
max
(
Comparator
.
comparingInt
(
GAScheduleResult:
:
getEndTime
))
.
orElse
(
null
);
if
(
lastGeneOnMachine
!=
null
)
{
int
machineAvailableTime
=
lastGeneOnMachine
.
getEndTime
();
if
(
setupTime
>
0
)
{
if
(
_globalParam
.
is_smoothSetup
())
{
machineAvailableTime
+=
setupTime
;
// 平滑模式:换型在非工作时间进行,不额外占用设备时间
// System.out.println(" 平滑模式换型:在非工作时间进行,设备可用时间不变");
}
else
{
// 标准模式:换型需要额外占用设备时间
machineAvailableTime
+=
setupTime
;
// System.out.println(" 标准模式换型:需要额外占用设备 " + setupTime + " 分钟");
}
}
earliestStartTime
=
Math
.
max
(
earliestStartTime
,
machineAvailableTime
);
}
// System.out.println(" 最终最早开始时间: " + earliestStartTime +
// " (前序工序结束含后处理: " + prevOperationEndTime + ", 设备可用: " +
...
...
@@ -442,7 +421,6 @@ if(finishedOrder==null||finishedOrder.size()==0)
CopyOnWriteArrayList
<
ScheduleResultDetail
>
geneDetails
=
machineCalculator
.
getNextAvailableTime
(
machine
,
earliestStartTime
,
-
1
,
processingTimeTotal
,
chromosome
.
getResult
(),
operation
.
IsInterrupt
!=
1
,
true
,
processingTime
,
operation
.
getQuantity
(),
true
);
...
...
@@ -457,11 +435,22 @@ if(finishedOrder==null||finishedOrder.size()==0)
.
mapToInt
(
ScheduleResultDetail:
:
getEndTime
)
.
max
()
.
orElse
(
0
);
//换型时间是否占用设备加工时间
//10:00 开始上班 前面的任务:24:00 结束 开始换型 休息时间 10小时
// 换型时间 12小时
// 换型时间 - 中间休息时间 =2小时
//开工时间需往后延 2小时
// 冲突检测和解决
final
int
finalStartTime
=
startTime
;
final
int
finalEndTime
=
endTime
;
//设置时间平滑
//前处理,准备工时 是否可以在前序未完工就开始时间, 就是
// 冲突检测和解决
final
int
finalStartTime
=
startTime
;
//10:00 12
final
int
finalEndTime
=
endTime
;
//15:00
// 7:00-9:00 1
//7:00-11:00 2
// 10<9&&15>7 1
// 10<11&&15>7 2 有任务
GAScheduleResult
conflictingGene
=
chromosome
.
getResult
().
stream
()
.
filter
(
g
->
g
.
getMachineId
()
==
machine
.
getId
())
.
filter
(
g
->
(
finalStartTime
<
g
.
getEndTime
()
&&
finalEndTime
>
g
.
getStartTime
()))
...
...
@@ -470,7 +459,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
if
(
conflictingGene
!=
null
)
{
// System.out.println(" ⚠️ 检测到时间冲突,重新调度");
int
conflictSetupStartTime
=
conflictingGene
.
getEndTime
();
int
conflictSetupStartTime
=
conflictingGene
.
getEndTime
();
//11:00
int
conflictSetupTime
=
calculateSetupTimeForConflict
(
chromosome
.
getResult
(),
operation
,
machine
,
machineOption
,
conflictingGene
);
int
conflictEarliestStartTime
=
conflictSetupStartTime
+
conflictSetupTime
;
...
...
@@ -843,6 +832,7 @@ if(finishedOrder==null||finishedOrder.size()==0)
return
baseTime
.
plusSeconds
(
minute
).
format
(
java
.
time
.
format
.
DateTimeFormatter
.
ofPattern
(
"YYYY-MM-dd HH:mm"
));
}
private
int
calculateSetupTime
(
List
<
GAScheduleResult
>
existingGenes
,
Entry
operation
,
Machine
machine
,
MachineOption
machineOption
)
{
GAScheduleResult
lastGeneOnMachine
=
existingGenes
.
stream
()
.
filter
(
g
->
g
.
getMachineId
()
==
machine
.
getId
())
.
max
(
Comparator
.
comparingInt
(
GAScheduleResult:
:
getEndTime
))
...
...
src/main/java/com/aps/service/Algorithm/ScheduleOperationService.java
View file @
d209cd62
...
...
@@ -36,11 +36,18 @@ public class ScheduleOperationService {
Long
newMachineId
,
GlobalParam
globalParam
,
int
lockStartTime
)
{
List
<
Entry
>
allOperations
=
chromosome
.
getAllOperations
();
int
newStartTime1
=
newStartTime
;
Map
<
Integer
,
Integer
>
opTimeMap
=
chromosome
.
getResult
().
stream
()
.
collect
(
Collectors
.
toMap
(
GAScheduleResult:
:
getOperationId
,
r
->
r
.
getStartTime
()
));
List
<
OperationSort
>
opGroupMap
=
allOperations
.
stream
()
.
map
(
data
->
new
OperationSort
(
data
.
getId
(),
0
,
data
.
getGroupId
(),
data
.
getSequence
()))
// 再提取字段
.
collect
(
Collectors
.
toList
());
Integer
newMachineId1
=
newMachineId
.
intValue
();
for
(
Integer
opId:
opIds
)
{
...
...
@@ -55,6 +62,21 @@ Integer newMachineId1=newMachineId.intValue();
.
filter
(
o
->
o
.
getId
()
==
opId
)
.
findFirst
()
.
orElseThrow
(()
->
new
NoSuchElementException
(
"Operation not found: "
+
opId
));
if
(
targetOp
.
getSequence
()>
1
)
{
Entry
targetOp1
=
allOperations
.
stream
()
.
filter
(
o
->
o
.
getGroupId
()
==
targetOp
.
getGroupId
()
&&
o
.
getSequence
()
==
targetOp
.
getSequence
()
-
1
)
.
findFirst
()
.
orElseThrow
(()
->
new
NoSuchElementException
(
"Operation not found: "
+
opId
));
GAScheduleResult
targetResult1
=
chromosome
.
getResult
().
stream
()
.
filter
(
r
->
r
.
getOperationId
()
==
targetOp1
.
getId
())
.
findFirst
()
.
orElseThrow
(()
->
new
NoSuchElementException
(
"Operation not found: "
+
opId
));
if
(
targetResult1
.
getEndTime
()
<
newStartTime
)
{
throw
new
RuntimeException
(
"不能早于前一工序的结束时间"
);
}
}
if
(
newMachineId1
!=
0
)
{
int
machineOptionIndex
=
targetOp
.
getMachineOptions
().
stream
()
...
...
@@ -85,25 +107,25 @@ Integer newMachineId1=newMachineId.intValue();
targetResult
.
setLockStartTime
(
lockStartTime
);
if
(
targetOp
.
getSequence
()==
1
)
{
opTimeMap
.
put
(
opId
,
newStartTime
);
}
else
{
Entry
targetOp1
=
allOperations
.
stream
()
.
filter
(
o
->
o
.
getGroupId
()
==
targetOp
.
getGroupId
()
&&
o
.
getSequence
()==
targetOp
.
getSequence
()-
1
)
.
findFirst
()
.
orElseThrow
(()
->
new
NoSuchElementException
(
"Operation not found: "
+
opId
));
GAScheduleResult
targetResult1
=
chromosome
.
getResult
().
stream
()
.
filter
(
r
->
r
.
getOperationId
()
==
targetOp1
.
getId
())
.
findFirst
()
.
orElseThrow
(()
->
new
NoSuchElementException
(
"Operation not found: "
+
opId
));
if
(
targetResult1
.
getStartTime
()<
newStartTime
)
{
opTimeMap
.
put
(
opId
,
newStartTime
);
}
else
{
opTimeMap
.
put
(
opId
,
targetResult1
.
getStartTime
()+
1
);
}
}
//
if(targetOp.getSequence()==1) {
//
opTimeMap.put(opId, newStartTime);
//
}else {
//
Entry targetOp1 = allOperations.stream()
//
.filter(o -> o.getGroupId() == targetOp.getGroupId()
//
&&o.getSequence()==targetOp.getSequence()-1)
//
.findFirst()
//
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
//
GAScheduleResult targetResult1 = chromosome.getResult().stream()
//
.filter(r -> r.getOperationId() == targetOp1.getId())
//
.findFirst()
//
.orElseThrow(() -> new NoSuchElementException("Operation not found: " + opId));
//
if(targetResult1.getStartTime()<newStartTime)
//
{
//
opTimeMap.put(opId, newStartTime);
//
}else {
//
opTimeMap.put(opId, targetResult1.getStartTime()+1);
//
}
//
}
newStartTime
=
newStartTime
+
1
;
}
...
...
@@ -126,19 +148,58 @@ Integer newMachineId1=newMachineId.intValue();
List
<
Integer
>
operationSequencing
=
allOperations
.
stream
()
opGroupMap
.
forEach
(
t
->
t
.
setTime
(
opTimeMap
.
get
(
t
.
getId
())));
opGroupMap
=
opGroupMap
.
stream
()
.
sorted
(
Comparator
.
comparingLong
(
OperationSort:
:
getTime
))
.
collect
(
Collectors
.
toList
());
opGroupMap
=
opGroupMap
.
stream
()
.
sorted
((
op1
,
op2
)
->
{
int
time1
=
opTimeMap
.
getOrDefault
(
op1
.
getId
(),
Integer
.
MAX_VALUE
);
int
time2
=
opTimeMap
.
getOrDefault
(
op2
.
getId
(),
Integer
.
MAX_VALUE
);
if
(
time1
!=
time2
)
{
return
Integer
.
compare
(
time1
,
time2
);
}
else
{
return
Integer
.
compare
(
op1
.
getSequence
(),
op2
.
getSequence
());
}
return
Integer
.
compare
(
op2
.
getTime
(),
op1
.
getTime
());
})
.
map
(
Entry:
:
getGroupId
)
.
collect
(
Collectors
.
toList
());
Map
<
Integer
,
Integer
>
groupMap
=
new
HashMap
<>();
Map
<
Integer
,
Integer
>
opidMap
=
new
HashMap
<>();
Map
<
Integer
,
OperationSort
>
outtimeMap
=
new
HashMap
<>();
List
<
OperationSort
>
newops
=
new
ArrayList
<>();
for
(
OperationSort
op:
opGroupMap
)
{
if
(
groupMap
.
containsKey
(
op
.
getGroup
()))
{
if
(
groupMap
.
get
(
op
.
getGroup
())<=
op
.
getSequence
())
{
outtimeMap
.
put
(
op
.
getId
(),
op
);
}
else
{
opidMap
.
put
(
op
.
getGroup
(),
op
.
getSequence
());
newops
.
add
(
op
);
}
}
else
{
groupMap
.
put
(
op
.
getGroup
(),
op
.
getSequence
());
opidMap
.
put
(
op
.
getGroup
(),
op
.
getId
());
newops
.
add
(
op
);
}
}
for
(
OperationSort
op:
outtimeMap
.
values
())
{
int
opid
=(
int
)
opidMap
.
get
(
op
.
getGroup
());
OptionalInt
index
=
IntStream
.
range
(
0
,
newops
.
size
())
.
filter
(
j
->
opid
==
newops
.
get
(
j
).
getId
())
.
findFirst
();
int
opSeq
=
index
.
orElse
(
0
)
;
newops
.
add
(
opSeq
,
op
);
opidMap
.
put
(
op
.
getGroup
(),
op
.
getId
());
}
List
<
Integer
>
operationSequencing
=
newops
.
stream
()
.
map
(
OperationSort:
:
getGroup
)
.
collect
(
Collectors
.
toList
());
Collections
.
reverse
(
operationSequencing
);
chromosome
.
setOperationSequencing
(
operationSequencing
);
// 重新解码
redecode
(
chromosome
,
chromosome
.
getBaseTime
(),
globalParam
);
...
...
@@ -731,10 +792,10 @@ Integer newMachineId1=newMachineId.intValue();
targetResults
.
forEach
(
t
->
t
.
setIsLocked
(
isLocked
));
// 若解锁,重新解码受影响工序
if
(!
isLocked
)
{
redecode
(
chromosome
,
chromosome
.
getBaseTime
(),
globalParam
);
}
//
if (!isLocked)
//
{
//
redecode(chromosome, chromosome.getBaseTime(), globalParam);
//
}
}
public
void
DelOperation
(
Chromosome
chromosome
,
int
opId
,
GlobalParam
globalParam
)
{
...
...
src/main/java/com/aps/service/plan/PlanResultService.java
View file @
d209cd62
...
...
@@ -539,7 +539,7 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
// WriteScheduleSummary(chromosome);
ScheduleOperationService
ScheduleOperation
=
new
ScheduleOperationService
();
WriteScheduleSummary
(
chromosome
);
//
WriteScheduleSummary(chromosome);
ScheduleOperation
.
moveOperation
(
chromosome
,
opId
,
(
int
)
ChronoUnit
.
SECONDS
.
between
(
chromosome
.
getBaseTime
(),
newStartTime
),
newMachineId
,
globalParam
,
lockStartTime
);
// WriteScheduleSummary(chromosome);
...
...
@@ -550,6 +550,8 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
{
Chromosome
chromosome
=
_sceneService
.
loadChromosomeFromFile
(
SceneId
);
ScheduleOperationService
ScheduleOperation
=
new
ScheduleOperationService
();
WriteScheduleSummary
(
chromosome
);
GlobalParam
globalParam
=
new
GlobalParam
();
ScheduleOperation
.
redecode
(
chromosome
,
chromosome
.
getBaseTime
(),
globalParam
);
WriteScheduleSummary
(
chromosome
);
...
...
src/test/java/com/aps/demo/PlanResultServiceTest.java
View file @
d209cd62
...
...
@@ -37,14 +37,14 @@ public class PlanResultServiceTest {
// NSGAIIUtils nsgaiiUtils=new NSGAIIUtils();
// nsgaiiUtils.Test();
//
planResultService.execute2("C5FB5EF2A7334A0A92F826F4937E1008");
planResultService
.
execute2
(
"C5FB5EF2A7334A0A92F826F4937E1008"
);
// planResultService.execute2("726D4C1A712B4B1393175BD44B775B66");
planResultService
.
execute2
(
"265F24B6DF3C40E4B17D193B0CC8AAF2"
);
// LocalDateTime t= LocalDateTime.of(202
5, 11, 15, 6, 51, 11
);
// List<Integer> opids=new ArrayList<>();BCA6FA43FFA444D3952CF8F6E1EA291B
// opids.add(
1
);
// planResultService.Move("
B571EF6682DB463AB2977B1055A74112",opids,t,3403L
);
// planResultService.Redecode("12345679
");
//
planResultService.execute2("265F24B6DF3C40E4B17D193B0CC8AAF2");
// LocalDateTime t= LocalDateTime.of(202
6, 02, 14, 1, 25, 52
);
// List<Integer> opids=new ArrayList<>();
//
BCA6FA43FFA444D3952CF8F6E1EA291B
// opids.add(
9
);
// planResultService.Move("
27065EA0ECD14A81B7FAAFEF52273F93",opids,t,1265l,0
);
// planResultService.Redecode("27065EA0ECD14A81B7FAAFEF52273F93
");
// MaintenanceWindow maintenanceWindow=new MaintenanceWindow();
// maintenanceWindow.setStartTime(LocalDateTime.of(2025, 10, 21, 0, 0, 0));
// maintenanceWindow.setEndTime(LocalDateTime.of(2025, 10, 31, 0, 0, 0));
...
...
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