Commit 681b20a8 authored by Tong Li's avatar Tong Li

遗传算法

parent 15b3d7d4
...@@ -15,52 +15,52 @@ public class Chromosome { ...@@ -15,52 +15,52 @@ public class Chromosome {
/// <summary> /// <summary>
/// 机器选择部分(可选机器集中的顺序号) /// 机器选择部分(可选机器集中的顺序号)
/// </summary> /// </summary>
public List<Integer> MachineSelection; private List<Integer> MachineSelection;
/// <summary> /// <summary>
/// 工序排序部分(工件/订单ID) /// 工序排序部分(工件/订单ID)
/// </summary> /// </summary>
public List<Integer> PperationSequencing; private List<Integer> OperationSequencing;
/// <summary> /// <summary>
/// 适应度值 /// 适应度值
/// </summary> /// </summary>
public double Fitness; private double Fitness;
/// <summary> /// <summary>
/// 机器 /// 机器
/// </summary> /// </summary>
public List<Machine> Machines; private List<Machine> Machines;
/// <summary> /// <summary>
/// 解码后的调度结果 /// 解码后的调度结果
/// </summary> /// </summary>
public List<ScheduleResult> Result; private List<ScheduleResult> Result;
/// <summary> /// <summary>
/// 最早完工时间 /// 最早完工时间
/// </summary> /// </summary>
public double Makespan; private double Makespan;
/// <summary> /// <summary>
/// 总流程时间 /// 总流程时间
/// </summary> /// </summary>
public double TotalFlowTime; private double TotalFlowTime;
/// <summary> /// <summary>
/// 总换型时间 /// 总换型时间
/// </summary> /// </summary>
public double TotalChangeoverTime; private double TotalChangeoverTime;
/// <summary> /// <summary>
/// 机器负载标准差(越小越均衡) /// 机器负载标准差(越小越均衡)
/// </summary> /// </summary>
public double MachineLoadStd; private double MachineLoadStd;
/// <summary> /// <summary>
/// 交付期延迟时间 /// 交付期延迟时间
/// </summary> /// </summary>
public double DelayTime; private double DelayTime;
} }
...@@ -11,20 +11,20 @@ public class GlobalOperationInfo { ...@@ -11,20 +11,20 @@ public class GlobalOperationInfo {
/** /**
* 全局唯一工序ID(0开始递增) * 全局唯一工序ID(0开始递增)
*/ */
public int GlobalOpId; private int GlobalOpId;
/** /**
* 所属组ID * 所属组ID
*/ */
public int GroupId; private int GroupId;
/** /**
* 订单内工序顺序号 * 订单内工序顺序号
*/ */
public int Sequence; private int Sequence;
/** /**
* 对应的工序实例 * 对应的工序实例
*/ */
public Entry Op; private Entry Op;
} }
...@@ -11,13 +11,13 @@ public class OperationSequencingWeight { ...@@ -11,13 +11,13 @@ public class OperationSequencingWeight {
/** /**
* 工序基因的序号 * 工序基因的序号
*/ */
public int Index ; private int Index ;
/** /**
* 工序基因的值 * 工序基因的值
*/ */
public int OsValue; private int OsValue;
/** /**
* 权重 * 权重
*/ */
public int Weight; private int Weight;
} }
...@@ -10,39 +10,39 @@ import java.util.Date; ...@@ -10,39 +10,39 @@ import java.util.Date;
* 时间:2025-11-21 * 时间:2025-11-21
*/ */
@Data @Data
public class ScheduleParams { public class ScheduleParams {
public Date BaseTime = new Date(); // 当前基准时间 private Date BaseTime = new Date(); // 当前基准时间
/// <summary> /// <summary>
/// 设备总数 /// 设备总数
/// </summary> /// </summary>
public int MachineCount; // 设备总数 private int MachineCount; // 设备总数
/// <summary> /// <summary>
/// 交叉概率 /// 交叉概率
/// </summary> /// </summary>
public double CrossoverProb = 0.8; private double CrossoverProb = 0.8;
/// <summary> /// <summary>
/// 变异概率 /// 变异概率
/// </summary> /// </summary>
public double MutationProb = 0.1; // 变异概率 private double MutationProb = 0.1; // 变异概率
/// <summary> /// <summary>
/// 种群规模 /// 种群规模
/// </summary> /// </summary>
public int PopulationSize = 50; // 种群规模 private int PopulationSize = 50; // 种群规模
/// <summary> /// <summary>
/// 最大迭代次数 /// 最大迭代次数
/// </summary> /// </summary>
public int MaxIterations = 100; // 最大迭代次数 private int MaxIterations = 100; // 最大迭代次数
/// <summary> /// <summary>
/// 精英保留计数 /// 精英保留计数
/// </summary> /// </summary>
public int ElitismCount = 5; private int ElitismCount = 5;
...@@ -50,17 +50,17 @@ public class ScheduleParams { ...@@ -50,17 +50,17 @@ public class ScheduleParams {
/// <summary> /// <summary>
/// 全局选择占比 /// 全局选择占比
/// </summary> /// </summary>
public double GsRatio = 0.4; // 全局选择占比 private double GsRatio = 0.4; // 全局选择占比
/// <summary> /// <summary>
/// 局部选择占比 /// 局部选择占比
/// </summary> /// </summary>
public double LsRatio = 0.4; // 局部选择占比 private double LsRatio = 0.4; // 局部选择占比
/// <summary> /// <summary>
/// 随机选择占比 /// 随机选择占比
/// </summary> /// </summary>
public double RsRatio = 0.2; // 随机选择占比 private double RsRatio = 0.2; // 随机选择占比
} }
...@@ -10,15 +10,15 @@ import java.util.List; ...@@ -10,15 +10,15 @@ import java.util.List;
*/ */
@Data @Data
public class ScheduleResult { public class ScheduleResult {
public int GroupId; private int GroupId;
public int ProductId; private int ProductId;
public int OperationId; private int OperationId;
public int MachineId; private int MachineId;
public int StartTime; // 相对开始时间(分钟) private int StartTime; // 相对开始时间(分钟)
public int EndTime; // 相对结束时间(分钟) private int EndTime; // 相对结束时间(分钟)
public int Quantity; // 批次大小(订单可拆分) private int Quantity; // 批次大小(订单可拆分)
public List<ScheduleResultDetail> GeneDetails; // 时间详情 private List<ScheduleResultDetail> GeneDetails; // 时间详情
public int OneTime; // 单件工时 private int OneTime; // 单件工时
public int ProcessingTime; // 绝对处理时间(分钟) private int ProcessingTime; // 绝对处理时间(分钟)
public int ChangeoverTime; private int ChangeoverTime;
} }
...@@ -8,7 +8,7 @@ import lombok.Data; ...@@ -8,7 +8,7 @@ import lombok.Data;
*/ */
@Data @Data
public class ScheduleResultDetail { public class ScheduleResultDetail {
public String Key; private String Key;
public int StartTime; // 相对开始时间(分钟) private int StartTime; // 相对开始时间(分钟)
public int EndTime; // 相对结束时间(分钟) private int EndTime; // 相对结束时间(分钟)
} }
...@@ -17,17 +17,17 @@ public class MaterialRequirement { ...@@ -17,17 +17,17 @@ public class MaterialRequirement {
/** /**
* 物料ID * 物料ID
*/ */
public int MaterialId; private int MaterialId;
/** /**
* 物料类型 * 物料类型
*/ */
public MaterialType MaterialType; private MaterialType MaterialType;
/** /**
* 该工序需要的物料数量 * 该工序需要的物料数量
*/ */
public BigDecimal RequiredQuantity; private BigDecimal RequiredQuantity;
@Override @Override
public String toString() { public String toString() {
......
...@@ -17,17 +17,17 @@ public class MaterialSupply { ...@@ -17,17 +17,17 @@ public class MaterialSupply {
/** /**
* 物料ID * 物料ID
*/ */
public int MaterialId; private int MaterialId;
/** /**
* 数量 * 数量
*/ */
public double Quantity; private double Quantity;
/** /**
* 预计到货时间 * 预计到货时间
*/ */
public LocalDateTime ArrivalTime; private LocalDateTime ArrivalTime;
@Override @Override
public String toString() { public String toString() {
......
package com.aps.service.Algorithm;
import com.aps.entity.Algorithm.OperationSequencingWeight;
import com.aps.entity.basic.Entry;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 作者:佟礼
* 时间:2025-11-21
*/
public class CommonCalculator {
public static List<OperationSequencingWeight> getOsw(List<Integer> os, List<Entry> allOperations) {
// 计算最大优先级并加1
int maxPriority = allOperations.stream()
.mapToInt(Entry::getPriority)
.max()
.orElse(0) + 1;
// 为每个工序分配权重
List<OperationSequencingWeight> weightedOs = new ArrayList<>();
for (int idx = 0; idx < os.size(); idx++) {
int groupId = os.get(idx);
// 查找对应groupId的第一个操作
Entry entry = allOperations.stream()
.filter(o -> o.getGroupId() == groupId)
.findFirst()
.orElse(null);
OperationSequencingWeight osw = new OperationSequencingWeight();
osw.setIndex(idx);
osw.setOsValue(groupId);
osw.setWeight(maxPriority - entry.getPriority());
weightedOs.add(osw);
}
return weightedOs;
}
public static int getOsIndex(List<OperationSequencingWeight> indexWeights) {
Random rnd = new Random();
int totalWeight = indexWeights.stream()
.mapToInt(OperationSequencingWeight::getWeight)
.sum();
int randomWeight = rnd.nextInt(totalWeight);
int cumulativeWeight = 0;
for (OperationSequencingWeight w : indexWeights) {
cumulativeWeight += w.getWeight();
if (cumulativeWeight >= randomWeight) {
return w.getIndex();
}
}
return 0;
}
public static int getOsIndex2(List<OperationSequencingWeight> weightedOs) {
Random rnd = new Random();
int totalWeight = weightedOs.stream()
.mapToInt(OperationSequencingWeight::getWeight)
.sum();
int randomWeight = rnd.nextInt(totalWeight);
int cumulativeWeight = 0;
int selectedIndex = -1;
for (int i = 0; i < weightedOs.size(); i++) {
cumulativeWeight += weightedOs.get(i).getWeight();
if (cumulativeWeight >= randomWeight) {
selectedIndex = i;
break;
}
}
return 0;
}
}
This diff is collapsed.
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