文章目录

  • 前言
  • 优化目标
  • 求解结果
  • 搜索过程可视化
  • Java代码
  • 可视化代码

前言

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

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

优化目标

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

求解结果

变量取值为:[8.00013867452009, 6.000077817430381]
最优解为:8.000000014494901

搜索过程可视化

Java代码

import java.util.Arrays;
import java.util.Random;/*** @Author:WSKH* @ClassName:FA_Solve* @ClassType:* @Description:* @Date:2022/6/8/18:26* @Email:1187560563@qq.com* @Blog:https://blog.csdn.net/weixin_51545953?type=blog*/
public class FA_Solve {// 萤火虫对象class Firefly {// 当前萤火虫的坐标(自变量数组)double[] curVars;// 当前自变量对应的目标函数值double curObjValue;// 适应度(解决最小化问题,所以适应度为目标函数值的倒数)double fit;// 全参构造public Firefly(double[] curVars, double curObjValue, double fit) {this.curVars = curVars;this.curObjValue = curObjValue;this.fit = fit;}}// 算法参数// 变量个数int varNum = 2;// 最大迭代次数int maxGen = 500;// 萤火虫群中萤火虫的个数int fireflyNum = 200;// 光吸收系数double gamma = 0.3;// 步长数组(各个维度的步长)double[] stepArr = new double[]{1.2, 1.2};// 变量的上下界double[] ub = new double[]{1000, 1000};double[] lb = new double[]{-1000, -1000};// 随机数对象Random random = new Random();// 萤火虫群Firefly[] fireflies;// 最佳的萤火虫Firefly bestFirefly;// 记录迭代过程public double[][][] positionArr;// 当前记录的行数int r;// 求解主函数public void solve() {// 初始化萤火虫群initFireflyes();// 开始迭代for (int t = 0; t < maxGen; t++) {for (int i = 0; i < fireflyNum; i++) {for (int j = 0; j < fireflyNum; j++) {double light = getLight(getDistance(fireflies[i], fireflies[j]), fireflies[j].fit);if (i != j && fireflies[i].fit < fireflies[j].fit) {Firefly tempFirefly = copyFirefly(fireflies[i]);for (int m = 0; m < varNum; m++) {double move = light * (fireflies[j].curVars[m] - fireflies[i].curVars[m]) + stepArr[m] * (random.nextDouble()-0.5);moveFirefly(tempFirefly, m,move);}updateFireFly(tempFirefly);if(tempFirefly.fit > fireflies[i].fit){fireflies[i] = tempFirefly;if(bestFirefly.fit < tempFirefly.fit){bestFirefly = copyFirefly(tempFirefly);}}}}}report();}// 输出最好的结果System.out.println("变量取值为:" + Arrays.toString(bestFirefly.curVars));System.out.println("最优解为:" + bestFirefly.curObjValue);}// 记录void report() {for (int i = 0; i < fireflies.length; i++) {for (int j = 0; j < varNum; j++) {positionArr[r][i][j] = fireflies[i].curVars[j];}}r++;}// 获取光强double getLight(double r, double fit) {return fit * Math.exp(-gamma * Math.pow(r, 2));}// 求两个萤火虫之间的距离double getDistance(Firefly f1, Firefly 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 initFireflyes() {positionArr = new double[maxGen][fireflyNum][varNum];fireflies = new Firefly[fireflyNum];for (int i = 0; i < fireflyNum; i++) {fireflies[i] = getRandomFirefly();if (i == 0 || bestFirefly.fit < fireflies[i].fit) {bestFirefly = copyFirefly(fireflies[i]);}}}// 控制萤火虫在第m个维度上移动n个距离public void moveFirefly(Firefly firefly, int m, double n) {// 移动firefly.curVars[m] += n;// 超出定义域的判断if (firefly.curVars[m] < lb[m]) {firefly.curVars[m] = lb[m];}if (firefly.curVars[m] > ub[m]) {firefly.curVars[m] = ub[m];}}// 更新萤火虫信息void updateFireFly(Firefly firefly) {double objValue = getObjValue(firefly.curVars);firefly.curObjValue = objValue;firefly.fit = 1 / objValue;}// 获取一个随机生成的萤火虫Firefly getRandomFirefly() {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 Firefly(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;}// 复制萤火虫Firefly copyFirefly(Firefly old) {return new Firefly(old.curVars.clone(), old.curObjValue, old.fit);}}

可视化代码

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 {// 调用算法获取绘图数据FA_Solve solver = new FA_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);}}}

【智能算法】FA萤火虫算法求解无约束多元函数最值(Java代码实现)相关推荐

  1. 【运筹优化】AFSA人工鱼群算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 求解结果 迭代结果可视化 算法流程 Java代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 u ...

  2. 【运筹优化】SMO蜘蛛猴优化算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 优化结果 迭代过程可视化 Java代码 可视化代码 优化流程(图太大了,所以放最后...) 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: ...

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

    文章目录 一.前言 二.优化目标 三.求解结果 四.迭代结果可视化 五.算法流程图 六.Java代码实现 6.1 算法部分代码 6.2 可视化部分代码 一.前言 本文以求解二元函数最小值为例,如果需要 ...

  4. 【运筹优化】SOA海鸥优化算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 求解结果 搜索过程可视化 Java算法代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 ub和l ...

  5. 【运筹优化】SCSO沙丘猫群优化算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 求解结果 搜索过程可视化 java算法代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 ub和l ...

  6. 【运筹优化】MFO飞蛾扑火算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 求解结果 搜索过程可视化 Java算法代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 ub和l ...

  7. 【运筹优化】DE差分进化算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 求解结果 进化过程可视化 Java算法代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 ub和l ...

  8. 【运筹优化】SSA樽海鞘优化算法求解无约束多元函数最值(Java代码实现)

    文章目录 前言 优化目标 求解结果 搜索过程可视化 Java算法代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 ub和l ...

  9. 群体智能优化算法之萤火虫算法(Firefly Algorithm,FA)

    获取更多资讯,赶快关注上面的公众号吧! 文章目录 第八章 萤火虫算法 8.1 介绍 8.2 天然萤火虫的行为 8.3 萤火虫算法 8.4 萤火虫算法改进 参考文献 第八章 萤火虫算法 8.1 介绍 萤 ...

最新文章

  1. EVEREST Corporate Edition 使用SQL保存数据的简易方法
  2. Excel 向程序发送命令时出现问题 解决方法 VS
  3. VMware中怎样克隆虚拟机
  4. VNC与RDP的区别
  5. 解决Nginx出现403 forbidden (13: Permission denied)报错的四种方法
  6. 静态链接库与动态链接库
  7. QT5更改应用程序图标
  8. 给 MySQL 增加 Sequence 管理功能
  9. (王道408考研操作系统)第三章内存管理-第一节6-2:非连续分配管理方式之基本分页存储管理之基本地址变换机构
  10. 一起学习C语言:初谈指针(二)
  11. 计算机三四级网络技术,全国计算机等级考试四级网络技术论述题真题(2-3)
  12. 清华同方台式计算机 U盘启动,清华同方台式机BIOS设置U盘启动方法
  13. Maya2018安装报错:visual c++ 2010 sp1 错误代码1612
  14. android吉他谱组件,android手机吉他谱
  15. Input length must be multiple of 8 when decrypting with padded cipher
  16. 设置名字的第一个字为默认头像
  17. SpyNote V5.0图形化工具远程控制Android手机教程(图文教程+演示视频)
  18. MySQL 安装时出现初始化数据失败的解决方案
  19. 慧算账张述刚荣获最佳产品领导力人物奖
  20. 基于JAVA微博网站计算机毕业设计源码+系统+mysql数据库+lw文档+部署

热门文章

  1. Topic Exchange介绍
  2. JCE无限制权限策略文件(java.security.InvalidKeyException: Illegal key size解决方案)
  3. 无线路由器如何设置连接上网
  4. 重庆大学计算机学院刘然,刘然-重庆大学微电子与通信工程学院
  5. CSM32RV20 是 32位低功耗MCU芯片 RISC-V RV32IMAC 内核
  6. 用计算机绘制阀体各零件步骤,UG10.0经典实例之液压球阀建模方法
  7. 检测电脑有没有装旺旺-2
  8. pdf文件怎么去除水印,pdf去除水印方法介绍
  9. [HNOI2006]潘多拉的宝盒
  10. 改变软件开发生态,云表打造无代码的“倚天剑”