【运筹优化】CSO蟑螂算法求解无约束多元函数最值(Java代码实现)

文章目录

  • 一、前言
  • 二、优化目标
  • 三、求解结果
  • 四、迭代结果可视化
  • 五、算法流程图
  • 六、Java代码实现
    • 6.1 算法部分代码
    • 6.2 可视化部分代码


一、前言

本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可:

  • varNum:变量维度数
  • ub和lb:变量的上下界
  • vMaxArr:每个维度的搜索速度限制

二、优化目标

目标:在变量区间范围最小化 Z = x^2 + y^2 - xy - 10x - 4y +60

三、求解结果

变量取值为:[8.00000005186109, 5.999999963566031]
最优解为:7.999999999999986

四、迭代结果可视化

这收敛速度也太快了,已经和SMO相当了!
在这里插入图片描述

五、算法流程图

在这里插入图片描述

六、Java代码实现

本项目的所有代码均上传至 GitHub 仓库:https://github.com/WSKH0929/SwarmIntelligenceAlgorithm(如果对你有帮助的话可以点个Star❤️哟~)

6.1 算法部分代码

import java.util.Arrays;
import java.util.Random;/*** @Author:WSKH* @ClassName:CSO_Solve* @ClassType:* @Description:* @Date:2022/6/8/18:26* @Email:1187560563@qq.com* @Blog:https://blog.csdn.net/weixin_51545953?type=blog*/
public class CSO_Solve {// 蟑螂对象class Cockroach {// 当前蟑螂的坐标(自变量数组)double[] curVars;// 当前自变量对应的目标函数值double curObjValue;// 适应度(解决最小化问题,所以适应度为目标函数值的倒数)double fit;// 全参构造public Cockroach(double[] curVars, double curObjValue, double fit) {this.curVars = curVars;this.curObjValue = curObjValue;this.fit = fit;}}// 算法参数// 变量个数int varNum = 2;// 最大迭代次数int maxGen = 1000;// 蟑螂群中蟑螂的个数int cockroachNum = 500;// 视野double visual = 50;// 残忍行为次数int ruthlessBehaviorCnt = 1;// 分散行为次数int dispersingBehaviorCnt = 30;// 步长数组(各个维度的步长)double[] stepArr = new double[]{1.2, 1.2};// 变量的上下界double[] ub = new double[]{1000, 1000};double[] lb = new double[]{-1000, -1000};// 随机数对象Random random = new Random();// 蟑螂群Cockroach[] cockroaches;// 最佳的蟑螂Cockroach bestCockroach;// 记录迭代过程public double[][][] positionArr;// 当前记录的行数int r;// 求解主函数public void solve() {// 初始化蟑螂群initCockroaches();// 开始迭代for (int t = 0; t < maxGen; t++) {// 聚集行为ChaseSwarmingBehavior();report();// 分散行为DispersingBehavior();report();// 残忍行为RuthlessBehavior();report();}// 输出最好的结果System.out.println("变量取值为:" + Arrays.toString(bestCockroach.curVars));System.out.println("最优解为:" + bestCockroach.curObjValue);}// 聚集行为void ChaseSwarmingBehavior() {// 找到个体最优Cockroach[] localBestCockroaches = new Cockroach[cockroachNum];for (int i = 0; i < cockroaches.length; i++) {localBestCockroaches[i] = findLocalBestCockroach(i);if(bestCockroach.fit < cockroaches[i].fit){bestCockroach = copyCockroach(cockroaches[i]);}}for (int i = 0; i < cockroaches.length; i++) {// 说明当前蟑螂就是个体最优(或接近个体最优)if(Math.abs(localBestCockroaches[i].curObjValue-cockroaches[i].curObjValue) <= 0.00001){// 那就朝着全局最优靠近Cockroach tempCockroach = copyCockroach(cockroaches[i]);for (int m = 0; m < varNum; m++) {moveCockroach(tempCockroach,m,stepArr[m]*(bestCockroach.curVars[m]-tempCockroach.curVars[m]));}tempCockroach.curObjValue = getObjValue(tempCockroach.curVars);tempCockroach.fit = 1/tempCockroach.curObjValue;if(tempCockroach.fit > cockroaches[i].fit){cockroaches[i] = tempCockroach;}}else{// 朝着个体最优移动Cockroach tempCockroach = copyCockroach(cockroaches[i]);for (int m = 0; m < varNum; m++) {moveCockroach(tempCockroach,m,stepArr[m]*(localBestCockroaches[i].curVars[m]-tempCockroach.curVars[m]));}tempCockroach.curObjValue = getObjValue(tempCockroach.curVars);tempCockroach.fit = 1/tempCockroach.curObjValue;if(tempCockroach.fit > cockroaches[i].fit){cockroaches[i] = tempCockroach;}}}}// 分散行为void DispersingBehavior() {for (int i = 0; i < cockroaches.length; i++) {for (int j = 0; j < dispersingBehaviorCnt; j++) {Cockroach tempCockroach = copyCockroach(cockroaches[i]);for (int m = 0; m < varNum; m++) {double move = stepArr[m] * (random.nextDouble()-0.5)*2;moveCockroach(tempCockroach,m,move);}if(tempCockroach.fit > cockroaches[i].fit){cockroaches[i] = tempCockroach;if(tempCockroach.fit > bestCockroach.fit){bestCockroach = copyCockroach(tempCockroach);}}}}}// 残忍行为void RuthlessBehavior() {for (int i = 0; i < ruthlessBehaviorCnt; i++) {cockroaches[random.nextInt(cockroachNum)] = copyCockroach(bestCockroach);}}// 寻找个体最优蟑螂Cockroach findLocalBestCockroach(int j) {Cockroach localBest = copyCockroach(cockroaches[j]);for (int i = 0; i < cockroaches.length; i++) {if (i != j) {if (localBest.fit < cockroaches[i].fit && getDistance(cockroaches[j], cockroaches[i]) <= visual) {localBest = copyCockroach(cockroaches[i]);}}}return localBest;}// 记录void report() {for (int i = 0; i < cockroaches.length; i++) {for (int j = 0; j < varNum; j++) {positionArr[r][i][j] = cockroaches[i].curVars[j];}}r++;}// 求两个蟑螂之间的距离double getDistance(Cockroach f1, Cockroach f2) {double dis = 0d;for (int i = 0; i < varNum; i++) {dis += Math.pow(f1.curVars[i] - f2.curVars[i], 2);}return Math.sqrt(dis);}// 初始化蟑螂群private void initCockroaches() {positionArr = new double[3 * maxGen][cockroachNum][varNum];cockroaches = new Cockroach[cockroachNum];for (int i = 0; i < cockroachNum; i++) {cockroaches[i] = getRandomCockroach();if (i == 0 || bestCockroach.fit < cockroaches[i].fit) {bestCockroach = copyCockroach(cockroaches[i]);}}}// 控制蟑螂在第m个维度上移动n个距离public void moveCockroach(Cockroach cockroach, int m, double n) {// 移动cockroach.curVars[m] += n;// 超出定义域的判断if (cockroach.curVars[m] < lb[m]) {cockroach.curVars[m] = lb[m];}if (cockroach.curVars[m] > ub[m]) {cockroach.curVars[m] = ub[m];}}// 获取一个随机生成的蟑螂Cockroach getRandomCockroach() {double[] vars = new double[varNum];for (int j = 0; j < vars.length; j++) {vars[j] = lb[j] + random.nextDouble() * (ub[j] - lb[j]);}double objValue = getObjValue(vars);return new Cockroach(vars.clone(), objValue, 1 / objValue);}/*** @param vars 自变量数组* @return 返回目标函数值*/public double getObjValue(double[] vars) {//目标:在变量区间范围最小化 Z = x^2 + y^2 - xy - 10x - 4y +60return Math.pow(vars[0], 2) + Math.pow(vars[1], 2) - vars[0] * vars[1] - 10 * vars[0] - 4 * vars[1] + 60;}// 复制蟑螂Cockroach copyCockroach(Cockroach old) {return new Cockroach(old.curVars.clone(), old.curObjValue, old.fit);}}

6.2 可视化部分代码

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;/*** @Author:WSKH* @ClassName:PlotUtil* @ClassType:* @Description:* @Date:2022/6/6/18:31* @Email:1187560563@qq.com* @Blog:https://blog.csdn.net/weixin_51545953?type=blog*/
public class PlotUtil extends Application {//当前的时间轴private Timeline nowTimeline;//绘图位置坐标private double[][][] positionArr;public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {// 调用算法获取绘图数据CSO_Solve solver = new CSO_Solve();solver.solve();positionArr = solver.positionArr;// 画图try {BorderPane root = new BorderPane();root.setStyle("-fx-padding: 20;");Scene scene = new Scene(root, 1600, 900);double canvasWid = 800;double canvasHei = 800;//根据画布大小缩放坐标值this.fixPosition(canvasWid - 100, canvasHei - 100);//画布和画笔HBox canvasHbox = new HBox();Canvas canvas = new Canvas();canvas.setWidth(canvasWid);canvas.setHeight(canvasHei);canvasHbox.setPrefWidth(canvasWid);canvasHbox.getChildren().add(canvas);canvasHbox.setAlignment(Pos.CENTER);canvasHbox.setStyle("-fx-spacing: 20;" +"-fx-background-color: #87e775;");root.setTop(canvasHbox);GraphicsContext paintBrush = canvas.getGraphicsContext2D();//启动HBox hBox2 = new HBox();Button beginButton = new Button("播放迭代过程");hBox2.getChildren().add(beginButton);root.setBottom(hBox2);hBox2.setAlignment(Pos.CENTER);//启动仿真以及暂停仿真beginButton.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> {nowTimeline.play();});//创建扫描线连接动画nowTimeline = new Timeline();createAnimation(paintBrush);primaryStage.setScene(scene);primaryStage.show();} catch (Exception e) {e.printStackTrace();}}/*** 修正cityPositionArr的坐标,让画出来的点在画布内** @param width* @param height*/private void fixPosition(double width, double height) {double minX = Double.MAX_VALUE;double maxX = -Double.MAX_VALUE;double minY = Double.MAX_VALUE;double maxY = -Double.MAX_VALUE;for (int i = 0; i < this.positionArr.length; i++) {for (int j = 0; j < this.positionArr[0].length; j++) {minX = Math.min(minX, this.positionArr[i][j][0]);maxX = Math.max(maxX, this.positionArr[i][j][0]);minY = Math.min(minY, this.positionArr[i][j][1]);maxY = Math.max(maxY, this.positionArr[i][j][1]);}}double multiple = Math.max((maxX - minX) / width, (maxY - minY) / height);//转化为正数数for (int i = 0; i < this.positionArr.length; i++) {for (int j = 0; j < this.positionArr[0].length; j++) {if (minX < 0) {this.positionArr[i][j][0] = this.positionArr[i][j][0] - minX;}if (minY < 0) {this.positionArr[i][j][1] = this.positionArr[i][j][1] - minY;}}}for (int i = 0; i < this.positionArr.length; i++) {for (int j = 0; j < this.positionArr[0].length; j++) {this.positionArr[i][j][0] = this.positionArr[i][j][0] / multiple;this.positionArr[i][j][1] = this.positionArr[i][j][1] / multiple;}}}/*** 用画笔在画布上画出所有的孔* 画第i代的所有粒子*/private void drawAllCircle(GraphicsContext paintBrush, int i) {paintBrush.clearRect(0, 0, 2000, 2000);paintBrush.setFill(Color.RED);for (int j = 0; j < this.positionArr[i].length; j++) {drawCircle(paintBrush, i, j);}}/*** 用画笔在画布上画出一个孔* 画第i代的第j个粒子*/private void drawCircle(GraphicsContext paintBrush, int i, int j) {double x = this.positionArr[i][j][0];double y = this.positionArr[i][j][1];double radius = 2;// 圆的直径double diameter = radius * 2;paintBrush.fillOval(x, y, diameter, diameter);}/*** 创建动画*/private void createAnimation(GraphicsContext paintBrush) {for (int i = 0; i < this.positionArr[0].length; i++) {int finalI = i;KeyFrame keyFrame = new KeyFrame(Duration.seconds(i * 0.05), event -> drawAllCircle(paintBrush, finalI));nowTimeline.getKeyFrames().add(keyFrame);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]

1.视频演示&#xff1a; [项目分享]Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&#xff06;部署教程]_哔哩哔哩_bilibili 2.图片演示&#xff1a; 3.算法原理&#xff1a; 该博客提出的移动侦测即是根据视频每帧或者几帧之间像素的差异&#xff0c;对差异值设置阈值&am…

蟑螂相关菌与人类健康风险

谷禾健康 说起蟑螂&#xff0c;大部分人都不太喜欢&#xff0c;甚至生理性恐惧... 你可能有100个讨厌它的理由&#xff0c;见到它就想消灭它&#xff0c;然而怎么都灭不完... 算起来&#xff0c;蟑螂早在3亿年前就已经存在了。蟑螂在线数据库中登记了4685种蟑螂&#xff08;截止…

群体智能优化算法之蟑螂算法((Cockroach Swarm Optimization,CSO)

获取更多资讯&#xff0c;赶快关注上面的公众号吧&#xff01; 文章目录 第十二章 蟑螂算法12.1 介绍12.2 聚集行为&#xff08;Chase-Swarming behavior&#xff09;12.3 分散行为&#xff08;Dispersing behavior&#xff09;12.4 残忍行为&#xff08;Ruthless behavior&…

李开复首谈ChatGPT:看好六大领域、三大投资机会

李开复表示&#xff0c;AI2.0的发展范式是迭代的&#xff0c;第一阶段是人机协同&#xff0c;第二阶段是局部自动&#xff0c;第三阶段是全程自动。 基于此&#xff0c;李开复提出&#xff0c;AI2.0将在六大领域加速点燃商业潜能&#xff0c;进入提升生产力的应用井喷期。 第一…

精选|商汤4月10号将发布大模型,3万字实录、腾讯研究院,真格基金chatgpt深度报告...

点击上方“Python与机器智能”&#xff0c;选择“星标”公众号 第一时间获取价值内容 一、商汤(4月10号将发布大模型)报告 这是由商汤(4月10号将发布大模型)一个半小时&#xff0c;近3万字的实录&#xff0c;解答关于人工智能&#xff0c;大模型的非常多关键问题&#xff0c;强…

企业如何稳定、安全使用ChatGPT?

随着人工智能技术的不断发展&#xff0c;商业模式正在发生颠覆。ChatGPT作为当下最热门的AI技术之一&#xff0c;已经在各行各业中广泛应用。 ChatGPT技术的应用可以使企业更高效、更智能地处理业务需求&#xff0c;大幅提升各类型工作任务的完成效率。 然而对于国内企业&#…

国内企业开发出类ChatGPT模型

最近&#xff0c;一款由国内高新技术企业开发的类ChatGPT模型问世&#xff0c;据悉该模型自主积累了40TB的数据集&#xff0c;还可以自动生成高达100G以上的优质语料&#xff0c;被称为“硅基知识大模型”。 该模型不仅具备了ChatGPT的功能&#xff0c;对数据的本地化的优化更好…

ChatGPT的快速发展究竟给我们带来了什么?

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

图观 | ChatGTP是如何通过知识图谱回答问题的?

文/Emma Z 1950年&#xff0c;图灵发表了具有里程碑意义的论文《计算机器与智能》&#xff08;Computing Machinery and Intelligence&#xff09;&#xff0c;提出了一个关于机器人的著名判断原则——图灵测试&#xff0c;也被称为图灵判断&#xff0c;它指出如果第三者无法辨…

Java程序员摸鱼技巧,推荐这9个 !

小编给大家推荐几个优质的公众号 他们都是各领域的资深主理人 他们的每一个公众号都值得你关注 简说Python RECOMMEND 推荐理由&#xff1a; 关注「简说Python」遇见老表&#xff0c;AI与数据分析的探索者&#xff01;Python学习路上的伙伴&#xff0c;原创文章超200篇。涵盖P…

LLM探索:环境搭建与模型本地部署

1前言 最近一直在炼丹&#xff08;搞AIGC这块&#xff09;&#xff0c;突然发现业务代码都索然无味了… 上次发了篇AI画图的文章&#xff0c;ChatGPT虽然没法自己部署&#xff0c;但现在开源的LLM还是不少的&#xff0c;只要有一块差不多的显卡&#xff0c;要搞个LLM本地部署还…

超越诺奖?生物界「ChatGPT」首次实现从零合成全新蛋白,登Nature子刊!喂了2.8亿种氨基酸序列...

新智元报道 编辑&#xff1a;好困 Aeneas 【新智元导读】这家成立三年的小初创公司&#xff0c;首次利用深度学习语言模型合成出了自然界中不存在的全新蛋白质&#xff0c;引爆蛋白质设计革命。 人工智能的应用&#xff0c;已经极大地加速了蛋白质工程的研究。 最近&#xff…

【R】Mac如何配置R和RStudio

前言 本篇文章将讲述如何在Mac上配置R和RStudio&#xff0c;惯例是先看看chatgpt会怎么回答这个问题&#xff1a; miniconda配置R和RStudio&#xff08; Mac m系列芯片暂不适用&#xff09; 安装R 在终端中执行一下命令 conda search -c conda-forge r-base # 备注-c conda…

深度学习实战26-(Pytorch)搭建TextCNN实现多标签文本分类的任务

大家好,我是微学AI,今天给大家介绍一下深度学习实战26-(Pytorch)搭建TextCNN实现多标签文本分类的任务,TextCNN是一种用于文本分类的深度学习模型,它基于卷积神经网络(Convolutional Neural Networks, CNN)实现。TextCNN的主要思想是使用卷积操作从文本中提取有用的特征,并…

写在2023年年中

写在2023年年中 收拾旧山河再出发 很久没有写规划了&#xff0c;博客也很少写&#xff0c;着实是太懒了。想想自己年纪也不小了&#xff0c;加上程序员的环境越来越不好&#xff0c;总得想想自己的出路不是。 目标 提升系统设计能力保持算法刷题能力(一般面试需要)知识输出能…

英语学习-29190410雅思图表作文写作--bar grapgh

主要参考来源&#xff1a;https://www.bilibili.com/video/av23014883?p2 Simon雅思 搜狐 http://www.sohu.com/a/130635097_372408 注意事项 开头语不能照抄题干中的句子&#xff0c;阅卷老师不会评估照抄的句子&#xff0c;所以你抄上去只是在浪费时间 请注意时态&…

四六级作文模板对提高写作成绩是否有用?让人工智能给我这套用模板的文章打分看看

最近的四六级考试又又又要开始啦&#xff0c;这里更新一下作文模板&#xff0c;来自B站大表哥的高级四六级通用模板&#xff1b; 原视频链接&#xff1a;【【救命抢分】四六级写作全能超强模板&#xff01;&#xff08;2022&#xff09;| 四级672六级674 | 四六级作文模板】 ht…

雅思作文模板.html,【雅思备考外国视角】雅思大作文discuss both views模板

编者按&#xff1a;这是从国外一个考官的的博客里搬过来的一篇关于雅思大作文discus both views型的大作文改如何作答的一些结构上的归纳&#xff0c;有一些借鉴意义&#xff0c;特分享给大家。 A Task 2 questions often ask you to Discuss both views and give your own opi…

汉字无法被计算机替代作文,雅思大作文范文:老师会被电脑替代吗

新东方在线雅思频道特为大家收集整理了雅思大作文范文&#xff1a;老师会被电脑替代吗&#xff0c;供大家阅读参考。认真研读一定的雅思范文及作文模板可以帮助我们检验自己的写作水平&#xff0c;并能很好地吸收和应用优秀范文里的优秀内容~更多雅思报名官网的最新消息&#x…

托福改革后的Academic Discussion如何拿高分?

这次托福改革最大的变化当属写作部分。原来的Task 2独立写作取消&#xff0c;替换成了一篇10分钟长度的Academic Discussion。写这篇小短文之前是需要考生先阅读一小段文章&#xff0c;是关于一个教授引出的一个课堂讨论的话题以及两位持不同观点的学生给出的自己的想法。 我们…