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

遗传算法

parent 15b3d7d4
......@@ -15,52 +15,52 @@ public class Chromosome {
/// <summary>
/// 机器选择部分(可选机器集中的顺序号)
/// </summary>
public List<Integer> MachineSelection;
private List<Integer> MachineSelection;
/// <summary>
/// 工序排序部分(工件/订单ID)
/// </summary>
public List<Integer> PperationSequencing;
private List<Integer> OperationSequencing;
/// <summary>
/// 适应度值
/// </summary>
public double Fitness;
private double Fitness;
/// <summary>
/// 机器
/// </summary>
public List<Machine> Machines;
private List<Machine> Machines;
/// <summary>
/// 解码后的调度结果
/// </summary>
public List<ScheduleResult> Result;
private List<ScheduleResult> Result;
/// <summary>
/// 最早完工时间
/// </summary>
public double Makespan;
private double Makespan;
/// <summary>
/// 总流程时间
/// </summary>
public double TotalFlowTime;
private double TotalFlowTime;
/// <summary>
/// 总换型时间
/// </summary>
public double TotalChangeoverTime;
private double TotalChangeoverTime;
/// <summary>
/// 机器负载标准差(越小越均衡)
/// </summary>
public double MachineLoadStd;
private double MachineLoadStd;
/// <summary>
/// 交付期延迟时间
/// </summary>
public double DelayTime;
private double DelayTime;
}
......@@ -7,24 +7,24 @@ import lombok.Data;
* 时间:2025-11-21
*/
@Data
public class GlobalOperationInfo {
public class GlobalOperationInfo {
/**
* 全局唯一工序ID(0开始递增)
*/
public int GlobalOpId;
private int GlobalOpId;
/**
* 所属组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 {
/**
* 工序基因的序号
*/
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;
* 时间:2025-11-21
*/
@Data
public class ScheduleParams {
public Date BaseTime = new Date(); // 当前基准时间
public class ScheduleParams {
private Date BaseTime = new Date(); // 当前基准时间
/// <summary>
/// 设备总数
/// </summary>
public int MachineCount; // 设备总数
private int MachineCount; // 设备总数
/// <summary>
/// 交叉概率
/// </summary>
public double CrossoverProb = 0.8;
private double CrossoverProb = 0.8;
/// <summary>
/// 变异概率
/// </summary>
public double MutationProb = 0.1; // 变异概率
private double MutationProb = 0.1; // 变异概率
/// <summary>
/// 种群规模
/// </summary>
public int PopulationSize = 50; // 种群规模
private int PopulationSize = 50; // 种群规模
/// <summary>
/// 最大迭代次数
/// </summary>
public int MaxIterations = 100; // 最大迭代次数
private int MaxIterations = 100; // 最大迭代次数
/// <summary>
/// 精英保留计数
/// </summary>
public int ElitismCount = 5;
private int ElitismCount = 5;
......@@ -50,17 +50,17 @@ public class ScheduleParams {
/// <summary>
/// 全局选择占比
/// </summary>
public double GsRatio = 0.4; // 全局选择占比
private double GsRatio = 0.4; // 全局选择占比
/// <summary>
/// 局部选择占比
/// </summary>
public double LsRatio = 0.4; // 局部选择占比
private double LsRatio = 0.4; // 局部选择占比
/// <summary>
/// 随机选择占比
/// </summary>
public double RsRatio = 0.2; // 随机选择占比
private double RsRatio = 0.2; // 随机选择占比
}
......@@ -10,15 +10,15 @@ import java.util.List;
*/
@Data
public class ScheduleResult {
public int GroupId;
public int ProductId;
public int OperationId;
public int MachineId;
public int StartTime; // 相对开始时间(分钟)
public int EndTime; // 相对结束时间(分钟)
public int Quantity; // 批次大小(订单可拆分)
public List<ScheduleResultDetail> GeneDetails; // 时间详情
public int OneTime; // 单件工时
public int ProcessingTime; // 绝对处理时间(分钟)
public int ChangeoverTime;
private int GroupId;
private int ProductId;
private int OperationId;
private int MachineId;
private int StartTime; // 相对开始时间(分钟)
private int EndTime; // 相对结束时间(分钟)
private int Quantity; // 批次大小(订单可拆分)
private List<ScheduleResultDetail> GeneDetails; // 时间详情
private int OneTime; // 单件工时
private int ProcessingTime; // 绝对处理时间(分钟)
private int ChangeoverTime;
}
......@@ -8,7 +8,7 @@ import lombok.Data;
*/
@Data
public class ScheduleResultDetail {
public String Key;
public int StartTime; // 相对开始时间(分钟)
public int EndTime; // 相对结束时间(分钟)
private String Key;
private int StartTime; // 相对开始时间(分钟)
private int EndTime; // 相对结束时间(分钟)
}
......@@ -17,17 +17,17 @@ public class MaterialRequirement {
/**
* 物料ID
*/
public int MaterialId;
private int MaterialId;
/**
* 物料类型
*/
public MaterialType MaterialType;
private MaterialType MaterialType;
/**
* 该工序需要的物料数量
*/
public BigDecimal RequiredQuantity;
private BigDecimal RequiredQuantity;
@Override
public String toString() {
......
......@@ -17,17 +17,17 @@ public class MaterialSupply {
/**
* 物料ID
*/
public int MaterialId;
private int MaterialId;
/**
* 数量
*/
public double Quantity;
private double Quantity;
/**
* 预计到货时间
*/
public LocalDateTime ArrivalTime;
private LocalDateTime ArrivalTime;
@Override
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