Commit 28f87b1f authored by Tong Li's avatar Tong Li

遗传算法-策略

parent cd421110
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -27,6 +27,7 @@ public class ProdLaunchOrder {
private String groupCode;
private String colorCode;
private double quantity;
private String orderCode;
private String orderStatus;//S未启动E执行中C已完成
private String materialId;
private String routingCode;
......
......@@ -194,7 +194,7 @@ public class GeneticAlgorithm {
// chromosome.setFitness(fitnessCalc.calculateFitness(chromosome));
// });
if(population!=null&&population.size()>0) {
population.parallelStream().forEach(chromosome -> {
population.forEach(chromosome -> {
chromosome.setResult(new ArrayList<>());
// 假设Machine类有拷贝方法,或使用MapStruct等工具进行映射
......@@ -202,10 +202,10 @@ public class GeneticAlgorithm {
chromosome.setAllOperations(allOperations); // 简单拷贝,实际可能需要深拷贝
chromosome.setGlobalOpList(globalOpList); // 简单拷贝,实际可能需要深拷贝
Chromosome chromosomen = decoder.decodeChromosomeWithCache(chromosome);
// if (chromosomen.getFitness() == 0) {
// chromosomen.setFitness(_fitnessCalculator.calculateFitness(chromosomen));
// }
decoder.decodeChromosomeWithCache(chromosome);
if (chromosome.getFitness() == 0) {
chromosome.setFitness(_fitnessCalculator.calculateFitness(chromosome));
}
});
......
......@@ -62,10 +62,16 @@ public class GeneticDecoder {
// 缓存命中:复用缓存结果
Chromosome cachedResult = decodingCache.get(cacheKey);
// 赋值给染色体
String ID=chromosome.getID();
Chromosome chromosomen= ProductionDeepCopyUtil.deepCopy(cachedResult);
chromosomen.setID(ID);
return chromosomen;
chromosome.setObjectives(cachedResult.getObjectives());
chromosome.setMakespan(cachedResult.getMakespan());
chromosome.setTotalFlowTime(cachedResult.getTotalFlowTime());
chromosome.setTotalChangeoverTime(cachedResult.getTotalChangeoverTime());
chromosome.setMachineLoadStd(cachedResult.getMachineLoadStd());
chromosome.setDelayTime(cachedResult.getDelayTime());
chromosome.setResult(ProductionDeepCopyUtil.deepCopy(cachedResult.getResult()));
// Chromosome chromosomen= ProductionDeepCopyUtil.deepCopy(cachedResult);
return chromosome;
}
} finally {
cacheLock.unlock(); // 确保锁释放
......@@ -414,7 +420,7 @@ public class GeneticDecoder {
List<OperationDependency> SSOperations = currentOp.getPrevEntryIds().stream()
.filter(t -> t.getDependencyType() == DependencyType.StartToStart)
.collect(Collectors.toList());//重叠
if (FsOperations != null && FsOperations.size() > 0) {
if (SSOperations != null && SSOperations.size() > 0) {
List<GAScheduleResult> newScheduleResult = new ArrayList<>();
List<ScheduleResultDetail> newScheduleResultDetails = new ArrayList<>();
......@@ -762,6 +768,7 @@ public class GeneticDecoder {
Objectives[2] = totalSetupTime;
Objectives[3] = machineLoadBalance;
Objectives[4] = tardiness;
chromosome.setObjectives(Objectives);
}
private double calculateTotalFlowTime(Chromosome chromosome) {
......
......@@ -111,56 +111,61 @@ public class NSGAIIUtils {
* 串行快速非支配排序(兼容小规模种群)
*/
public List<List<Chromosome>> fastNonDominatedSort(List<Chromosome> population) {
preprocessObjectives(population);
List<List<Chromosome>> fronts = new ArrayList<>();
// 1. 初始化数据结构:S(被支配集合)、n(支配数)
Map<Chromosome, List<Chromosome>> S = new HashMap<>();
Map<Chromosome, Integer> n = new HashMap<>();
List<Chromosome> front1 = new ArrayList<>();
List<List<Chromosome>> fronts = new ArrayList<>();
// 为每个个体预先初始化 S 和 n
for (Chromosome p : population) {
S.put(p, new ArrayList<>());
n.put(p, 0);
S.put(p, new ArrayList<>()); // 初始化空集合,避免null
n.put(p, 0); // 支配数初始化为0
}
// 2. 计算每个个体的支配关系
for (Chromosome p : population) {
for (Chromosome q : population) {
if (p == q) continue;
if (dominates(p, q)) {
// p支配q,将q加入p的被支配集合S
S.get(p).add(q);
} else if (dominates(q, p)) {
// q支配p,增加p的支配数n
n.put(p, n.get(p) + 1);
}
}
// 3. 初始化第一前沿(支配数为0的个体)
if (n.get(p) == 0) {
p.setRank(1);
front1.add(p);
if (fronts.isEmpty()) {
fronts.add(new ArrayList<>());
}
fronts.get(0).add(p);
}
}
fronts.add(front1);
// 4. 生成后续前沿
int i = 0;
while (fronts.get(i).size() > 0) {
while (!fronts.get(i).isEmpty()) {
List<Chromosome> nextFront = new ArrayList<>();
for (Chromosome p : fronts.get(i)) {
// 遍历p的被支配集合S.get(p)(此时已初始化,不会为null)
for (Chromosome q : S.get(p)) {
n.put(q, n.get(q) - 1);
if (n.get(q) == 0) {
q.setRank(i + 2);
nextFront.add(q);
}
}
}
i++;
if (!nextFront.isEmpty()) {
fronts.add(nextFront);
}
fronts.add(nextFront);
}
return fronts;
}
/**
* 预处理目标值(归一化+加权)
*/
......
......@@ -346,13 +346,13 @@ public class LanuchServiceImpl implements LanuchService {
launchOrder.setSerie(order.getSeries());
launchOrder.setCreateUser(String.valueOf(order.getCreatoruserid()));
launchOrder.setMaterialCode(order.getMmcode());
// launchOrder.setStartDate(order.get);
launchOrder.setStartDate(order.getBegintime());
launchOrder.setEndDate(order.getDeliverytime());
// launchOrder.setOrderPriority(order.getPrioritry());
// launchOrder.setOrderPriority(order.getPrioritry());
launchOrder.setOrderPriority(1);
launchOrder.setQuantity(order.getQuantity());
launchOrder.setMaterialId(order.getMmid());
launchOrder.setOrderCode(order.getCode());
String mmid = order.getMmid();
// // 通过mmid查找对应的工艺
// if (mmid != null && !mmid.isEmpty()) {
......
......@@ -13,9 +13,12 @@ import com.aps.entity.basic.ScheduleChromosome;
import com.aps.entity.Schedule.GenVO;
import com.aps.entity.Schedule.MachineVO;
import com.aps.entity.basic.*;
import com.aps.mapper.ConfigMapper;
import com.aps.service.*;
import com.aps.service.Algorithm.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -74,6 +77,11 @@ public class PlanResultService {
@Autowired
private ConfigService _configService;
@Autowired
private ConfigMapper configMapper;
@Autowired
private StrategyRuleService _strategyRuleService;
......@@ -766,24 +774,36 @@ private GlobalParam InitGlobalParam()
{
GlobalParam globalParam=new GlobalParam();
Config config= _configService.lambdaQuery()
.eq(Config::getComponent,"setting")
.one();
LambdaQueryWrapper<Config> queryWrapper = new LambdaQueryWrapper<Config>()
.eq(Config::getComponent, "setting")
.orderByDesc(Config::getId); // 按更新时间降序
Page<Config> page = new Page<>(1, 1);
configMapper.selectPage(page, queryWrapper);
// 3. 提取最后一条记录
Config config = page.getRecords().isEmpty()
? null
: page.getRecords().get(0);
List<ConfigSetting> configs= _configService.getComponentSettingsByPageAndNote(config.getId(),"setting");
for (ConfigSetting c : configs) {
if(c.getTitle()=="日历")
if(c.getTitle().equals("日历"))
{
globalParam.setIsUseCalendar(c.isValue());
}
else if(c.getTitle()=="设置时间")
else if(c.getTitle().equals("设置时间"))
{
globalParam.setIsUseCalendar(c.isValue());
}else if(c.getTitle()=="原材料")
}else if(c.getTitle().equals("原材料"))
{
globalParam.setIsCheckBom(c.isValue());
}
else if(c.getTitle()=="设置时间平滑")
else if(c.getTitle().equals("设置时间平滑"))
{
globalParam.set_smoothSetup(c.isValue());
}
......@@ -798,8 +818,8 @@ private GlobalParam InitGlobalParam()
for (ProdLaunchOrder lo : ProdLaunchOrders) {
Order order=new Order();
order.setMaterialCode(lo.getMaterialCode());
order.setSerie(lo.getSerie());
order.setOrderCode(lo.getGroupCode());
order.setSerie(lo.getSerie()==null?"":lo.getSerie());
order.setOrderCode(lo.getOrderCode());
order.setOrderId(lo.getOrderId());
order.setRoutingId(lo.getRoutingId());
order.setMaterialId(lo.getMaterialId());
......@@ -841,7 +861,7 @@ private GlobalParam InitGlobalParam()
for (StrategyScheduling strategy : selecteds) {
int Amplitude= strategy.getAmplitude();
if (strategy.getName() == "customer_due_date") {
if (strategy.getName().equals("customer_due_date")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
if(Amplitude>0) {
......@@ -854,10 +874,10 @@ private GlobalParam InitGlobalParam()
condition.setReverse(false); // 递增
conditions.add(condition);
files.add("groupDueDate");
i++;
} else if (strategy.getName() == "startd_date") {
} else if (strategy.getName().equals("startd_date") ) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
if(Amplitude>0) {
......@@ -870,52 +890,58 @@ private GlobalParam InitGlobalParam()
condition.setReverse(false); // 递增
conditions.add(condition);
files.add("groupStartDate");
i++;
} else if (strategy.getName() == "gathering_series") {
} else if (strategy.getName().equals("gathering_series")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("serie");
condition.setReverse(false); // 递增
conditions.add(condition);
files.add("serie");
} else if (strategy.getName() == "maximum_operation_priority" && !files.contains("priority")) {
i++;
} else if (strategy.getName() .equals( "Minimum_wo_priority") && !files.contains("priority")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("priority");
condition.setReverse(false); // 递增
conditions.add(condition);
files.add("priority");
} else if (strategy.getName() == "maximum_wo_priority" && !files.contains("priority")) {
i++;
} else if (strategy.getName() .equals( "maximum_wo_priority") && !files.contains("priority")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("priority");
condition.setReverse(true); // 高优先级在前
conditions.add(condition);
files.add("priority");
} else if (strategy.getName() == "material_rise") {
i++;
} else if (strategy.getName() .equals( "material_rise")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("materialCode");
condition.setReverse(true); // 递增
conditions.add(condition);
files.add("materialCode");
} else if (strategy.getName() == "plan_rise" && !files.contains("orderCode")) {
i++;
} else if (strategy.getName() .equals( "plan_rise") && !files.contains("orderCode")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("orderCode");
condition.setReverse(true); // 递增
conditions.add(condition);
files.add("orderCode");
} else if (strategy.getName() == "plan_drop" && !files.contains("orderCode")) {
i++;
} else if (strategy.getName() .equals( "plan_drop") && !files.contains("orderCode")) {
OrderSortRule.SortCondition condition = new OrderSortRule.SortCondition();
condition.setSequence(i);
condition.setFieldName("orderCode");
condition.setReverse(false); // 递减
conditions.add(condition);
files.add("orderCode");
i++;
}
i++;
}
} else {
......
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