Commit c925515f authored by Tong Li's avatar Tong Li

遗传算法-操作后退前进

parent d15cd28e
...@@ -21,6 +21,8 @@ public class Chromosome { ...@@ -21,6 +21,8 @@ public class Chromosome {
private String ID = UUID.randomUUID().toString(); private String ID = UUID.randomUUID().toString();
private Integer version=0;
/// <summary> /// <summary>
/// 机器选择部分(可选机器集中的顺序号) /// 机器选择部分(可选机器集中的顺序号)
/// </summary> /// </summary>
......
package com.aps.entity.Schedule;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 作者:佟礼
* 时间:2025-12-26
*/
@Data
public class SceneChromsome {
private String SceneID;
private Integer Version;
private List<SceneDetail> SceneDetails=new ArrayList<>();
}
package com.aps.entity.Schedule;
import lombok.Data;
/**
* 作者:佟礼
* 时间:2025-12-26
*/
@Data
public class SceneDetail {
private Integer version;
private String fileName;
}
...@@ -7,6 +7,7 @@ import com.aps.entity.*; ...@@ -7,6 +7,7 @@ import com.aps.entity.*;
import com.aps.entity.Algorithm.*; import com.aps.entity.Algorithm.*;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult; import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo; import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
import com.aps.entity.Schedule.SceneChromsome;
import com.aps.entity.basic.ScheduleChromosome; import com.aps.entity.basic.ScheduleChromosome;
import com.aps.entity.Schedule.GenVO; import com.aps.entity.Schedule.GenVO;
import com.aps.entity.Schedule.MachineVO; import com.aps.entity.Schedule.MachineVO;
...@@ -574,7 +575,22 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0)); ...@@ -574,7 +575,22 @@ order.setDueDate(LocalDateTime.of(2025, 12, 1,0,0,0));
//场景回退前进
public Chromosome moveChromosome(String sceneId,Integer version)
{
return _sceneService.moveChromosome( sceneId, version);
}
//场景下所有操作版本
public SceneChromsome getSceneChromsome(String sceneId)
{
return _sceneService.getSceneChromsome( sceneId);
}
public void testSceneChromsome(String sceneId)
{
Chromosome chromosome=new Chromosome();
_sceneService.saveChromosomeToFile(chromosome,sceneId);
}
......
package com.aps.service.plan; package com.aps.service.plan;
import com.aps.common.util.redis.RedisUtils;
import com.aps.entity.Algorithm.Chromosome; import com.aps.entity.Algorithm.Chromosome;
import com.aps.entity.Schedule.SceneChromsome;
import com.aps.entity.Schedule.SceneDetail;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* SceneService.java * SceneService.java
...@@ -22,6 +28,8 @@ public class SceneService { ...@@ -22,6 +28,8 @@ public class SceneService {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SceneService.class); private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SceneService.class);
@Autowired
private RedisUtils redisUtils;
// 统一配置 ObjectMapper // 统一配置 ObjectMapper
private ObjectMapper createObjectMapper() { private ObjectMapper createObjectMapper() {
...@@ -58,6 +66,12 @@ public class SceneService { ...@@ -58,6 +66,12 @@ public class SceneService {
return new File(resultDir, fileName); return new File(resultDir, fileName);
} }
private File getChromosomeFile(String sceneId,String ver) {
File resultDir = getResultDirectory();
String fileName = "chromosome_result_" + sceneId +"_"+ver+"_.json";
return new File(resultDir, fileName);
}
/** /**
* 从文件中读取Chromosome对象 * 从文件中读取Chromosome对象
*/ */
...@@ -69,7 +83,14 @@ public class SceneService { ...@@ -69,7 +83,14 @@ public class SceneService {
try { try {
ObjectMapper objectMapper = createObjectMapper(); ObjectMapper objectMapper = createObjectMapper();
File file = getChromosomeFile(sceneId); SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
File file;
if(sceneChromsome==null) {
file = getChromosomeFile(sceneId);
}else {
file = getChromosomeFile(sceneId,sceneChromsome.getVersion().toString());
}
if (!file.exists()) { if (!file.exists()) {
logger.warn("染色体文件不存在: {}", file.getAbsolutePath()); logger.warn("染色体文件不存在: {}", file.getAbsolutePath());
...@@ -110,9 +131,46 @@ public class SceneService { ...@@ -110,9 +131,46 @@ public class SceneService {
try { try {
ObjectMapper objectMapper = createObjectMapper(); ObjectMapper objectMapper = createObjectMapper();
File file = getChromosomeFile(sceneId);
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
if(sceneChromsome==null)
{
sceneChromsome=new SceneChromsome();
sceneChromsome.setSceneID(sceneId);
sceneChromsome.setVersion(1);
}else {
Integer v = sceneChromsome.getVersion();
// 回退后编辑,会清除后续版本,重新生成
List<SceneDetail> nexts= sceneChromsome.getSceneDetails().stream()
.filter(t -> t.getVersion() > v)
.collect(Collectors.toList());
if(nexts!=null&&nexts.size()>0)
{
for (SceneDetail d:nexts) {
File file1 = getChromosomeFile(sceneId,d.getVersion().toString());
Files.deleteIfExists(file1.toPath());
}
}
sceneChromsome.getSceneDetails().removeIf(t -> t.getVersion() > v);
sceneChromsome.setVersion(sceneChromsome.getVersion() + 1);
}
SceneDetail sceneDetail=new SceneDetail();
sceneDetail.setVersion(sceneChromsome.getVersion());
sceneChromsome.getSceneDetails().add(sceneDetail);
redisUtils.set("SceneId."+sceneId,sceneChromsome);
File file = getChromosomeFile(sceneId,sceneChromsome.getVersion().toString());
File tempFile = new File(file.getParentFile(), file.getName() + ".tmp"); File tempFile = new File(file.getParentFile(), file.getName() + ".tmp");
chromosome.setVersion(sceneChromsome.getVersion());
objectMapper.writeValue(tempFile, chromosome); objectMapper.writeValue(tempFile, chromosome);
if (tempFile.length() == 0) { if (tempFile.length() == 0) {
...@@ -147,6 +205,30 @@ public class SceneService { ...@@ -147,6 +205,30 @@ public class SceneService {
return false; return false;
} }
} }
public SceneChromsome getSceneChromsome(String sceneId) {
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
return sceneChromsome;
}
public Chromosome moveChromosome(String sceneId,Integer version)
{
try {
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
if(sceneChromsome==null) {
return null;
}else {
sceneChromsome.setVersion(version);
redisUtils.set("SceneId."+sceneId,sceneChromsome);
return loadChromosomeFromFile(sceneId);
}
} catch (Exception e) {
logger.error("回退/前进失败,场景ID: " + sceneId, e);
return null;
}
}
/** /**
* 检查染色体文件是否存在 * 检查染色体文件是否存在
...@@ -155,7 +237,13 @@ public class SceneService { ...@@ -155,7 +237,13 @@ public class SceneService {
if (sceneId == null || sceneId.trim().isEmpty()) { if (sceneId == null || sceneId.trim().isEmpty()) {
return false; return false;
} }
File file = getChromosomeFile(sceneId); SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
File file;
if(sceneChromsome==null) {
file = getChromosomeFile(sceneId);
}else {
file = getChromosomeFile(sceneId,sceneChromsome.getVersion().toString());
}
return file.exists() && file.length() > 0; return file.exists() && file.length() > 0;
} }
...@@ -164,14 +252,35 @@ public class SceneService { ...@@ -164,14 +252,35 @@ public class SceneService {
*/ */
public boolean deleteChromosomeFile(String sceneId) { public boolean deleteChromosomeFile(String sceneId) {
try { try {
File file = getChromosomeFile(sceneId);
if (file.exists()) {
boolean deleted = Files.deleteIfExists(file.toPath()); SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
if (deleted) { File file;
logger.info("删除染色体文件成功: {}", file.getAbsolutePath()); if(sceneChromsome==null) {
file = getChromosomeFile(sceneId);
if (file.exists()) {
boolean deleted = Files.deleteIfExists(file.toPath());
if (deleted) {
logger.info("删除染色体文件成功: {}", file.getAbsolutePath());
}
return deleted;
} }
return deleted; }else {
for (SceneDetail d:sceneChromsome.getSceneDetails()) {
file = getChromosomeFile(sceneId,d.getVersion().toString());
if (file.exists()) {
boolean deleted = Files.deleteIfExists(file.toPath());
if (deleted) {
logger.info("删除染色体文件成功: {}", file.getAbsolutePath());
}
}
return true;
}
} }
return true; return true;
} catch (Exception e) { } catch (Exception e) {
logger.error("删除染色体文件失败,场景ID: " + sceneId, e); logger.error("删除染色体文件失败,场景ID: " + sceneId, e);
......
...@@ -28,8 +28,9 @@ public class PlanResultServiceTest { ...@@ -28,8 +28,9 @@ public class PlanResultServiceTest {
public void testExecute() { public void testExecute() {
// planResultService.getMaterials(); // planResultService.getMaterials();
// RangeSubtractUtil.test(); // RangeSubtractUtil.test();
planResultService.testSceneChromsome("qwerty");
planResultService.execute2("8835EF6E1C8A491D99B16DE59160ED64"); // Chromosome chromosome= planResultService.moveChromosome("qwerty",3);
// planResultService.execute2("8835EF6E1C8A491D99B16DE59160ED64");
// planResultService.execute2("BE037838EF074B07B87D7DE763107398"); // planResultService.execute2("BE037838EF074B07B87D7DE763107398");
// LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11); // LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11);
// List<Integer> opids=new ArrayList<>(); // List<Integer> opids=new ArrayList<>();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment