启发式算法,比较万能的优化方法。 python库scikit-opt很好用
(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 中国(参考)
[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约束
clear
clc
load('q3')
%%
% [x,fval] = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option)
global data
global ok
x0 = ones(1, 40);
A = [];
b = [];
Aeq = [];
beq = [];
lb = zeros(1, 40) - 0.0000001;
ub = ones(1, 40) + 0.000000;
% [x,fval] = fmincon(@q3_fun,x0,A,b,Aeq,beq,lb,ub,@q3_yueshu) % 规划 无效
% x = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options)
[x,fval] = ga(@q3_fun, 40, A, b, Aeq, beq, lb, ub, @q3_yueshu, [1:40])
function f = q3_fun(x)
f = 0;
flag = 0;
global data
global ok
tmp = -10 * ones(1, 21);
for i = 1:40
if x(i) == 1
if flag == 0
tmp = data(i, :);
flag = 1;
else
tmp = [tmp; data(i, :)];
end
end
end
% if flag == 0
% tmp = -10 * ones(1, 21);
% end
tmp = mean(tmp, 1);
for i = 4:14
f = f + abs(ok(i) - tmp(i));
end
% f
end
function [c,ceq] = q3_yueshu(x)
jiange = 0;
global data
for i = 1:40
if x(i) == 1
jiange = jiange + data(i, 4);
end
end
% jiange
c = [jiange - 1300;
1150 - jiange];
ceq = [];
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
#%% 初始化
%matplotlib inline
import numpy as np
from sko.GA import GA
import pandas as pd
import matplotlib.pyplot as plt
print('start')
#%% 定义函数
def schaffer0(p):
'''
This function has plenty of local minimum, with strong shocks
global minimum at (0,0) with value 0
'''
x1, x2 = p
x = np.square(x1) + np.square(x2)
return 0.5 + (np.square(np.sin(x)) - 0.5) / np.square(1 + 0.001 * x)# + x1 * x2 + x1
def schaffer(p):
x1, x2, x3, x4, x5 = p
ans = x1**2 + x2**2 + x3**2 + x4**2 + x5**2 + 1.0
return ans
narvs = 5 # 变量个数
lbs = [-10] * narvs # 下届 包含等于
ubs = [10] * narvs # 上届 包含等于
# precisions = [1, 2, 1, 1, 1e-7] # 指定间隔 整数 间隔1 间隔2 浮点数间隔1e-7
precisions = [1, 1, 1, 1, 1] # 指定间隔 全整数规划 01规划修改上下界
# 遗传算法
ga = GA(func=schaffer, n_dim=narvs, size_pop=50, max_iter=800, prob_mut=0.001, lb=lbs, ub=ubs, precision=precisions)
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
# 画图
Y_history = pd.DataFrame(ga.all_history_Y)
fig, ax = plt.subplots(2, 1)
ax[0].plot(Y_history.index, Y_history.values, '.', color='red')
Y_history.min(axis=1).cummin().plot(kind='line')
plt.show()
print('finish')