启发式算法,比较万能的优化方法。 python库scikit-opt很好用

image.png
(b站视频资源,链接丢失了)

算法 基本原理 变量个数 整数规划 0-1规划 TSP
Matlab Python
模拟退火 依据最好解 按规则变为新解 一个 自定义规则 ×
遗传算法 选择 交叉 变异 一个 多种群 自带 自带
粒子群 个体 全局 多个 × × ×

模拟退火 SA

定义一个解,根据自己设定的产生新解规则,对已知最优解进行改变,迭代寻找最优
讲义
D:\00000MCM\清风\0 课件和代码\公开课:“模拟退火算法”的课件和代码\模拟退火算法直播的讲义PL.pdf

Matlab

使用清风代码(自定义条件实现整数规划)
清风代码:
D:\00000MCM\清风\0 课件和代码\公开课:“模拟退火算法”的课件和代码\模拟退火算法的代码\课堂上用到的
2019D题目 :
D:\00000MCM\0 codes\2019Dsum\q3_sa.m

自带函数 帮助文档
Find minimum of function using simulated annealing algorithm - MATLAB simulannealbnd - MathWorks 中国
matlab模拟退火算法(SA)详解(一)算法入门_viafcccy的博客-CSDN博客_matlab模拟退火算法

(Python)

参数说明
模拟退火算法-文档

遗传算法 GA

文章:D:\00000MCM\0 研究生数学建模竞赛历年真题和优秀论文集锦\研究生数学建模-优秀论文\2020年优秀论文\B题\B20105340008.pdf(用于选择关键变量 自定义适应度函数 余弦相似度)
2020B 0019(基本原理 对比试验 种群大小 迭代次数 交叉率 变异率)
0031
0004

Matlab

使用自带算法(可以实现整数规划)
使用于2019D 选取片段 每一段为一个决策变量 是否选中为0或1 实则为非线性整数规划 -> 决策变量直接构成染色体 使用ga()求解 目标函数 约束条件参考非线性(G12)

D:\00000MCM\0 codes\2019Dsum\ q3.m主程序 q3_fun.m目标函数 q3_yueshu约束
基于MATLAB的遗传算法使用浅谈 - 知乎(参考)
Find minimum of function using genetic algorithm - MATLAB ga - MathWorks 中国(参考)
image.png

[x,fval,exitflag,output,population,scores] = ga()
x 最优解
fval 最优适应度值
exitflag 结束标志
output 结构体 内容
population 种群 ?行个体 * ?特征
scores 每个个体适应度

遗传算法(Genetic Algorithm, GA)及MATLAB实现 - 午夜的行人 - 博客园
【GA算法】遗传算法原理及其Matlab代码小白兔de窝-CSDN博客遗传算法matlab程序

q3.m主程序 q3_fun.m目标函数 q3_yueshu约束

  1. clear
  2. clc
  3. load('q3')
  4. %%
  5. % [x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option)
  6. global data
  7. global ok
  8. x0 = ones(1, 40);
  9. A = [];
  10. b = [];
  11. Aeq = [];
  12. beq = [];
  13. lb = zeros(1, 40) - 0.0000001;
  14. ub = ones(1, 40) + 0.000000;
  15. % [x,fval] = fmincon(@q3_fun,x0,A,b,Aeq,beq,lb,ub,@q3_yueshu) % 规划 无效
  16. % x = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options)
  17. [x,fval] = ga(@q3_fun, 40, A, b, Aeq, beq, lb, ub, @q3_yueshu, [1:40])
  1. function f = q3_fun(x)
  2. f = 0;
  3. flag = 0;
  4. global data
  5. global ok
  6. tmp = -10 * ones(1, 21);
  7. for i = 1:40
  8. if x(i) == 1
  9. if flag == 0
  10. tmp = data(i, :);
  11. flag = 1;
  12. else
  13. tmp = [tmp; data(i, :)];
  14. end
  15. end
  16. end
  17. % if flag == 0
  18. % tmp = -10 * ones(1, 21);
  19. % end
  20. tmp = mean(tmp, 1);
  21. for i = 4:14
  22. f = f + abs(ok(i) - tmp(i));
  23. end
  24. % f
  25. end
  1. function [c,ceq] = q3_yueshu(x)
  2. jiange = 0;
  3. global data
  4. for i = 1:40
  5. if x(i) == 1
  6. jiange = jiange + data(i, 4);
  7. end
  8. end
  9. % jiange
  10. c = [jiange - 1300;
  11. 1150 - jiange];
  12. ceq = [];
  13. end

Python

GitHub - guofei9987/scikit-opt: Genetic Algorithm, Particle Swarm Optimization, Simulated Annealing, Ant Colony Optimization Algorithm,Immune Algorithm, Artificial Fish Swarm Algorithm, Differential Evolution and TSP(Traveling salesman)
文档

等式 不等式约束
差分进化算法解决有约束优化问题(Python实现)_guofei9987的博客-CSDN博客
sko.GA实现遗传算法的源码解析_tommy2005的专栏-CSDN博客
七种启发式算法 - 知乎
D:\00000py\1\mcm jupytertest3.ipynb

D:\00000py\1\mcm jupytertest2.ipynb

  1. #%% 初始化
  2. %matplotlib inline
  3. import numpy as np
  4. from sko.GA import GA
  5. import pandas as pd
  6. import matplotlib.pyplot as plt
  7. print('start')
  8. #%% 定义函数
  9. def schaffer0(p):
  10. '''
  11. This function has plenty of local minimum, with strong shocks
  12. global minimum at (0,0) with value 0
  13. '''
  14. x1, x2 = p
  15. x = np.square(x1) + np.square(x2)
  16. return 0.5 + (np.square(np.sin(x)) - 0.5) / np.square(1 + 0.001 * x)# + x1 * x2 + x1
  17. def schaffer(p):
  18. x1, x2, x3, x4, x5 = p
  19. ans = x1**2 + x2**2 + x3**2 + x4**2 + x5**2 + 1.0
  20. return ans
  21. narvs = 5 # 变量个数
  22. lbs = [-10] * narvs # 下届 包含等于
  23. ubs = [10] * narvs # 上届 包含等于
  24. # precisions = [1, 2, 1, 1, 1e-7] # 指定间隔 整数 间隔1 间隔2 浮点数间隔1e-7
  25. precisions = [1, 1, 1, 1, 1] # 指定间隔 全整数规划 01规划修改上下界
  26. # 遗传算法
  27. ga = GA(func=schaffer, n_dim=narvs, size_pop=50, max_iter=800, prob_mut=0.001, lb=lbs, ub=ubs, precision=precisions)
  28. best_x, best_y = ga.run()
  29. print('best_x:', best_x, '\n', 'best_y:', best_y)
  30. # 画图
  31. Y_history = pd.DataFrame(ga.all_history_Y)
  32. fig, ax = plt.subplots(2, 1)
  33. ax[0].plot(Y_history.index, Y_history.values, '.', color='red')
  34. Y_history.min(axis=1).cummin().plot(kind='line')
  35. plt.show()
  36. print('finish')