首页 > 其他分享 >使用JMetal解决分配优化问题

使用JMetal解决分配优化问题

时间:2025-01-12 12:55:03浏览次数:1  
标签:int JMetal new value add workerId import 优化 分配

遗传算法是一种基于自然选择和遗传学原理的优化算法,也很适合解决任务分配问题, 比如达到任务总耗时最短, 比如再兼顾每个工人工作量相对均衡.
下面代码中 TaskAssignmentProblem(单目标优化) 和 BalancedTaskAssignmentProblem(多目标优化) .

package com.example;

import java.util.ArrayList;
import java.util.List;

import org.uma.jmetal.algorithm.Algorithm;
import org.uma.jmetal.algorithm.examples.AlgorithmRunner;
import org.uma.jmetal.algorithm.multiobjective.nsgaii.NSGAIIBuilder;
import org.uma.jmetal.operator.crossover.impl.IntegerSBXCrossover;
import org.uma.jmetal.operator.mutation.impl.IntegerPolynomialMutation;
import org.uma.jmetal.operator.selection.SelectionOperator;
import org.uma.jmetal.operator.selection.impl.BinaryTournamentSelection;
import org.uma.jmetal.problem.Problem;
import org.uma.jmetal.problem.integerproblem.impl.AbstractIntegerProblem;
import org.uma.jmetal.solution.integersolution.IntegerSolution;
import org.uma.jmetal.util.AbstractAlgorithmRunner;
import org.uma.jmetal.util.JMetalLogger;
import org.uma.jmetal.util.fileoutput.SolutionListOutput;
import org.uma.jmetal.util.fileoutput.impl.DefaultFileOutputContext;

public class App {

	public static void main(String[] args) {
		// 1. 定义问题
		Problem<IntegerSolution> problem = null;
		//problem = new TaskAssignmentProblem();
		problem = new  BalancedTaskAssignmentProblem();

		// 2. 设置交叉和变异算子 和 设置选择算子

		// 定义交叉操作: SBX交叉
		double crossoverProbability = 0.9;
		double crossoverDistributionIndex = 20.0;
		var crossover = new IntegerSBXCrossover(crossoverProbability, crossoverDistributionIndex);

		// 定义变异操作: 多项式变异
		double mutationProbability = 1.0 / problem.numberOfVariables();
		double mutationDistributionIndex = 20.0;
		var mutation = new IntegerPolynomialMutation(mutationProbability, mutationDistributionIndex);

		// 定义选择操作: 二元竞标赛选择
		SelectionOperator<List<IntegerSolution>, IntegerSolution> selection = new BinaryTournamentSelection<IntegerSolution>();

		// 3. 迭代次数和种群大小
		int populationSize = 100;

		// 4. 定义算法(NSGA-II)	
		Algorithm<List<IntegerSolution>> algorithm = new NSGAIIBuilder<IntegerSolution>(problem, crossover, mutation,
				populationSize)
				.setSelectionOperator(selection)
				.setMaxEvaluations(25000)
				.build();

		// 5. 运行算法
		AlgorithmRunner algorithmRunner = new AlgorithmRunner.Executor(algorithm).execute();
		List<IntegerSolution> solutionSet = algorithm.result();

		long computingTime = algorithmRunner.getComputingTime();
		JMetalLogger.logger.info("Total execution time: " + computingTime + "ms");

		// 6. 打印非支配排序结果,每个solution包含决策变量取值和目标函数取值.
		for (IntegerSolution solution : solutionSet) {
			JMetalLogger.logger.info("Solution: " + solution);
		}
		JMetalLogger.logger.info("Solution Count: " + solutionSet.size());

		// 7. save to tsv files
		new SolutionListOutput(solutionSet).setVarFileOutputContext(new DefaultFileOutputContext("VAR.csv", ","))
				.setFunFileOutputContext(new DefaultFileOutputContext("FUN.csv", ",")).print();
		AbstractAlgorithmRunner.printFinalSolutionSet(solutionSet);
	}

}

/*
 * 有4个任务需要3个工人完成, 需要找出最节省时间的任务分配方式.
 * 目标函数一个, 即所有任务总计耗时
 * 每个任务由哪个worker完成, 即决策变量, 所以共有4个变量,  变量的取值为 workerId, 范围从0~3 
 * 
 *  任务和工人的时间Cost矩阵如下: 
 * 
 * 任务 工人A 工人B 工人C
 * 任务A 2 3 1
 * 任务B 4 2 3
 * 任务C 3 4 2
 * 任务D 1 2 4
 */
class TaskAssignmentProblem extends AbstractIntegerProblem {
	private int evaluationCount;

	private static final int NUMBER_OF_TASK = 4;
	private static final int[][] COMPLETION_TIMES = {
			{ 2, 3, 1 },
			{ 4, 2, 3 },
			{ 3, 4, 2 },
			{ 1, 2, 4 },
	};

	public TaskAssignmentProblem() {
		numberOfObjectives(1);
		name("TaskAssignmentProblem");

		// 4 varabiles for 4 tasks
		var lowerList = new ArrayList<Integer>();
		lowerList.add(0); // workerId lower value
		lowerList.add(0); // workerId lower value
		lowerList.add(0); // workerId lower value
		lowerList.add(0); // workerId lower value
		var upperList = new ArrayList<Integer>();
		upperList.add(2); // workerId upper value
		upperList.add(2); // workerId upper value
		upperList.add(2); // workerId upper value
		upperList.add(2); // workerId upper value

		variableBounds(lowerList, upperList);
	}

	@Override
	public IntegerSolution evaluate(IntegerSolution solution) {
		int totalTime = 0;
		for (int i = 0; i < NUMBER_OF_TASK; i++) {
			var workerId = solution.variables().get(i);
			totalTime += COMPLETION_TIMES[i][workerId];
		}
		solution.objectives()[0] = totalTime;
		return solution;
	}
}




/*
 * 有4个任务需要3个工人完成, 需要找出最节省时间的任务分配方式, 同时要求每个人的工作量尽量平衡
 * 目标函数2个, (1)所有任务总计耗时最小, (2)每个人总耗时最小, 即最忙的那个人耗时最小
 * 每个任务由哪个worker完成, 即决策变量, 所以共有4个变量,  变量的取值为 workerId, 范围从0~3 
 * 
 *  任务和工人的时间Cost矩阵如下: 
 * 
 * 任务 工人A 工人B 工人C
 * 任务A 3 2 4
 * 任务B 5 4 3
 * 任务C 2 3 2
 * 任务D 1 4 2
 */
class BalancedTaskAssignmentProblem extends AbstractIntegerProblem {
	private int evaluationCount;

	private static final int NUMBER_OF_TASK = 4;
	private static final int NUMBER_OF_WORKER = 3;
	private static final int[][] COMPLETION_TIMES = {
			{ 3, 2, 4 },
			{ 5, 4, 3 },
			{ 2, 3, 2 },
			{ 1, 4, 2 },
	};

	public BalancedTaskAssignmentProblem() {
		numberOfObjectives(2);
		name("TaskAssignmentProblem");

		// 4 varabiles for 4 tasks
		var lowerList = new ArrayList<Integer>();
		lowerList.add(0); // workerId lower value
		lowerList.add(0); // workerId lower value
		lowerList.add(0); // workerId lower value
		lowerList.add(0); // workerId lower value
		var upperList = new ArrayList<Integer>();
		upperList.add(2); // workerId upper value
		upperList.add(2); // workerId upper value
		upperList.add(2); // workerId upper value
		upperList.add(2); // workerId upper value

		variableBounds(lowerList, upperList);
	}

	@Override
	public IntegerSolution evaluate(IntegerSolution solution) {
		int totalTime = 0;
		int[] workerTime= new int[NUMBER_OF_WORKER] ;

		//目标函数: 总耗时最小
		for (int i = 0; i < NUMBER_OF_TASK; i++) {
			var workerId = solution.variables().get(i);
			totalTime += COMPLETION_TIMES[i][workerId];
			workerTime[workerId]+=COMPLETION_TIMES[i][workerId];
		}
		solution.objectives()[0] = totalTime;

		//目标函数:每个人总耗时最小
		int maxTime=0 ;
		for (int time : workerTime) {
			if (maxTime<time){
				maxTime=time;
			}
		}
		solution.objectives()[1]=maxTime;
		return solution;
	}
}

标签:int,JMetal,new,value,add,workerId,import,优化,分配
From: https://www.cnblogs.com/harrychinese/p/18666883

相关文章

  • 【架构师从入门到进阶】第四章:前端优化思路——第三节:前置资源和缓存
    【架构师从入门到进阶】第四章:前端优化思路——第三节:前置资源和缓存前置资源缓存http缓存什么是http缓存http缓存如何做缓存风险更改文件名使用后端验证缓存的有效性基于资源最后修改时间验证基于资源版本号的验证方式客户端缓存各种客户端缓存风险本篇文章我们......
  • Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
    CountArrays:一眼秒的计数题。思路显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是\(1\),就会形成一个基环树森林。那么考虑这个环上能填什么数。因为所有数都小于等于他后面的数,所以所有数都只能相等。这就启发我们在基环树上缩点之后再进行计数。那么当缩完点......
  • Google Play:应用优化与性能提升技巧_2024-07-19_08-26-19.Tex
    GooglePlay:应用优化与性能提升技巧应用性能基础了解应用性能指标在深入探讨应用优化与性能提升的技巧之前,理解应用性能指标是至关重要的第一步。应用性能指标(PerformanceMetrics)是衡量应用运行效率、响应速度和资源消耗的关键数据点。这些指标可以帮助开发者识别应用中......
  • springboot毕设 高校新生报道及宿舍分配平台 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高校招生规模的不断扩大,每年新生报道期间的各项管理工作变得日益复杂。传统的手工登记、分配宿舍等流程不仅效率低下,还容易出现信息错误和遗漏,给......
  • Python、R用深度学习神经网络组合预测优化能源消费总量时间序列预测及ARIMA、xgboost
    全文链接:https://tecdat.cn/?p=38726原文出处:拓端数据部落公众号分析师:QingxiaWang在能源领域,精准预测能源消费总量对制定合理能源战略至关重要。当前,能源消费预测分析主要运用单一模型(如灰色预测法、时间序列分析法等)和组合模型两种方式。然而,单一模型存在系统误差较高、预测......
  • 【Elasticsearch】批量操作:优化性能
    ......
  • SQL Server性能优化(3)使用SQL Server Profiler查询性能瓶颈
    关于SQLServerProfiler的使用,网上已经有很多教程,比如这一篇文章:SQLServerProfiler:使用方法和指标说明。微软官方文档:https://msdn.microsoft.com/zh-cn/library/ms179428(v=sql.105).aspx有更详细的介绍。经过使用Profiler进行监视,得到监视结果。=========================......
  • SQL Server性能优化(2)获取基本信息
    以下常用的SQL语句有利于我们分析数据库的基本信息,然后根据查询的结果进行优化。1.查看索引碎片   无论何时对基础数据执行插入、更新或删除操作,SQLServer数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引包含......
  • FFmpeg音视频流媒体,视频编解码性能优化
    你是不是也有过这样一个疑问:视频如何从一个简单的文件变成你手机上快速播放的短片,或者是那种占满大屏幕的超高清大片?它背后的法宝,离不开一个神奇的工具——FFmpeg!说它强大,完全不为过,它在音视频处理领域专业度很高。从格式转换、音视频编解码,到流媒体处理,FFmpeg就像是视频领......
  • 【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍自动驾驶检测
    【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据…本篇介绍自动驾驶检测模型如何针对cornercase优化?【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据…本篇介绍自动驾驶检测模型如何针对cornercase优化?文章目录【大厂面试AI算法题中的知......