Commit c925515f authored by Tong Li's avatar Tong Li

遗传算法-操作后退前进

parent d15cd28e
......@@ -21,6 +21,8 @@ public class Chromosome {
private String ID = UUID.randomUUID().toString();
private Integer version=0;
/// <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.*;
import com.aps.entity.Algorithm.*;
import com.aps.entity.Algorithm.IDAndChildID.GroupResult;
import com.aps.entity.Algorithm.IDAndChildID.NodeInfo;
import com.aps.entity.Schedule.SceneChromsome;
import com.aps.entity.basic.ScheduleChromosome;
import com.aps.entity.Schedule.GenVO;
import com.aps.entity.Schedule.MachineVO;
......@@ -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;
import com.aps.common.util.redis.RedisUtils;
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.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
import java.util.stream.Collectors;
/**
* SceneService.java
......@@ -22,6 +28,8 @@ public class SceneService {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(SceneService.class);
@Autowired
private RedisUtils redisUtils;
// 统一配置 ObjectMapper
private ObjectMapper createObjectMapper() {
......@@ -58,6 +66,12 @@ public class SceneService {
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对象
*/
......@@ -69,7 +83,14 @@ public class SceneService {
try {
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()) {
logger.warn("染色体文件不存在: {}", file.getAbsolutePath());
......@@ -110,9 +131,46 @@ public class SceneService {
try {
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");
chromosome.setVersion(sceneChromsome.getVersion());
objectMapper.writeValue(tempFile, chromosome);
if (tempFile.length() == 0) {
......@@ -147,6 +205,30 @@ public class SceneService {
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 {
if (sceneId == null || sceneId.trim().isEmpty()) {
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;
}
......@@ -164,7 +252,12 @@ public class SceneService {
*/
public boolean deleteChromosomeFile(String sceneId) {
try {
File file = getChromosomeFile(sceneId);
SceneChromsome sceneChromsome=(SceneChromsome)redisUtils.get("SceneId."+sceneId);
File file;
if(sceneChromsome==null) {
file = getChromosomeFile(sceneId);
if (file.exists()) {
boolean deleted = Files.deleteIfExists(file.toPath());
if (deleted) {
......@@ -172,6 +265,22 @@ public class SceneService {
}
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;
} catch (Exception e) {
logger.error("删除染色体文件失败,场景ID: " + sceneId, e);
......
......@@ -28,8 +28,9 @@ public class PlanResultServiceTest {
public void testExecute() {
// planResultService.getMaterials();
// RangeSubtractUtil.test();
planResultService.execute2("8835EF6E1C8A491D99B16DE59160ED64");
planResultService.testSceneChromsome("qwerty");
// Chromosome chromosome= planResultService.moveChromosome("qwerty",3);
// planResultService.execute2("8835EF6E1C8A491D99B16DE59160ED64");
// planResultService.execute2("BE037838EF074B07B87D7DE763107398");
// LocalDateTime t= LocalDateTime.of(2025, 11, 15, 6, 51, 11);
// 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