这里写目录标题
参数问题
参数问题()
此处初始温度为1000,最低温度为0.001,温度的下降率为0.98,Mapkov链长为500
C++模拟退火实现TSP
马可夫链
TSP_solution SA_TSP(Graph G){
srand ( unsigned ( time(0) ) );
// 当前温度
double Current_Temperature = INITIAL_TEMPERATURE;
// 最优解
TSP_solution Best_solution;
Best_solution.length_path = MAX_INT;
// 初始路径
for (int i = 0;i < G.vex_num; i++)
{
Best_solution.path[i] = 'A' + i;
}
random_shuffle(Best_solution.path + 1, Best_solution.path + G.vex_num);
// 当前解, 与最优解比较
TSP_solution Current_solution;
// 模拟退火过程
while(MIN_TEMPERATURE < Current_Temperature){
// 满足迭代次数
for (int i = 0; i < LEGNTH_Mapkob; i++)
{
Current_solution = FindNewSolution(G, Best_solution);
if (Current_solution.length_path <= Best_solution.length_path) // 接受新解
{
if (Current_solution.length_path == Best_solution.length_path)
{
// cout<<"不同路径出现相同的最优解."<<endl;
}
Best_solution = Current_solution;
}
else{ // 按 Metropolis 判断是否接受
if ((int)exp((Best_solution.length_path - Current_solution.length_path) / Current_Temperature)*100 > (rand()*101))
{
Best_solution = Current_solution;
}
else{
// cout<<"不接受当前解."<<endl;
}
}
}
Current_Temperature *= SPEED; // 按 SPEED 速率退火
} // while
return Best_solution;
}
TSP_solution FindNewSolution(Graph G, TSP_solution bestSolution){
// 产生新的解
TSP_solution newSolution;
// 起始城市固定为A, 终点也要返回A, 即需要关注起点A和终点A之间的所有城市
int i = rand() % (G.vex_num - 1) + 1; // % 取余 -> 即将随机数控制在[1, G.vex_num - 1]
int j = rand() % (G.vex_num - 1) + 1;
if (i > j)
{
int temp = i;
i = j;
j = temp;
}
else if (i == j)
{ // 表示产生的随机数没有改变的作用, 将此路程设置为最大并结束该函数
newSolution = bestSolution;
return newSolution;
}
/* way 2 */
int choose = rand() % 3;
if (choose == 0)
{ // 随机交换任意两个城市的位置
char temp = bestSolution.path[i];
bestSolution.path[i] = bestSolution.path[j];
bestSolution.path[j] = temp;
}else if (choose == 1)
{ // 随机逆置城市的位置
reverse(bestSolution.path + i, bestSolution.path + j);
}
else{ // 随机移位城市的位置
if (j+1 == G.vex_num) //边界处不处理
{
newSolution = bestSolution;
return newSolution;
}
rotate(bestSolution.path + i, bestSolution.path + j, bestSolution.path + j + 1);
}
newSolution = bestSolution;
newSolution.path[G.vex_num] = newSolution.path[0]; // 终点与起始点相同
newSolution.path[G.vex_num + 1] = '\0';
newSolution.length_path = CalculateLength(G, newSolution);
return newSolution;
}
int CalculateLength(Graph G,TSP_solution newSolution){
int _length = 0;
for (int i = 0; i < G.vex_num - 1; i++)
{
int _startCity = (int)newSolution.path[i] - 65;
int _endCity = (int)newSolution.path[i+1] - 65;
if (G.arcs[_startCity][_endCity] == -1)
{
return MAX_INT;
}
else{
_length += G.arcs[_startCity][_endCity];
}
}
// 判断该路径是否能回到起始城市
if (G.arcs[(int)newSolution.path[G.vex_num - 1] - 65][(int)newSolution.path[0]-65] == -1)
{
return MAX_INT;
}
else{
_length += G.arcs[(int)newSolution.path[G.vex_num - 1] - 65][(int)newSolution.path[0]-65];
return _length;
}
}
源代码C++
内循环终止条件,状态接收函数 以及初始状态
准则函数
具体形式对算法影响不大, 一般采用min[1,exp(-∆C/t)]
初温
通过理论分析可以得到初温的解析式,但解决实际问题时难以得到精确的参数;所以 初温应充分大;
(1)均匀抽样一组状态,以各状态目标值的方差为初温;
(2)随机产生一组状态,确定两两状态间的最大目标值差,根据差值,利用一定的函数确定初温;
(3)利用经验公式。
内循环终止条件
九、温度更新函数
若固定每一温度,算法均计算至平稳分布,然后下降温度,则称为时齐算法;
若无需各温度下算法均达到平稳分布,但温度需按一定速率下降,则称为非时齐算法。
十、内循环终止准则
1.非时齐模拟退火算法
每个温度下只产生一个或少量候选解
2. 时齐算法—常用的Metropolis抽样稳定准则
(1)检验目标函数的均值是否稳定;
(2)连续若干步的目标值变化较小;
(3)按一定的步数抽样。
下图为非时齐算法按照一定步数抽样的结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210528014744621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzUwNjkwNTc4,size_16,color_FFFFFF,t_70)
Markov链 与时齐算法参数制约
(所以在T+,时只需少量的变换就可达到准平衡。 这样就可选取较短长度的Markov 链来 减少算法时间。)
原始网址
温度更新函数(十分不实用)
温度下降过快1/ln(3)=0.91; 1/ln(1000)=0.4
概念
模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而可有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法。
流程图
结合局部搜索与二次升温
原文网址
局部搜索
这篇文章说对于初始值也是比较敏感那么我们可以进行局部搜索设置初始值(靠运气的感觉)
局部升温
这篇文章仅仅用到二次升温,也就是在步数过于小(*******升温生得超级高来弥补局部搜索带来的危害)或者第一次降温降到百分之二十的时候进行局部升温或者每降百分之十升温百分之五
温度下降系数
对于精度要求为小数点后1位的,下界可以取1e-3或1e-4,降温系数取 0.8 ,对于精度要求为1e-5 , 下界可取1e-7或1e-8 ,降温系数取 0.98。
原文网址
大神的参数分析终结版
原文网址
遗传算法
原文网址
原文网址
读写excel 与 csv
1.首先打开excel办公软件,通过ctrl+n新建工作簿。
2.在现有工作簿中进行编辑表格,通过编辑完成后按组合命令ctrl+s打开另存为窗口。
3.其中指定保存路径,文件名更改,和选择文件类型。
4.其中文件类型中选择*.csv格式,选择完成点击保存
5.在弹出窗口中阅读提示点击是即可,此时即代表创建csv文件成功。
利用python操作excel (方便)
原文网址
python操作excel
python操作csv
C++操作csv
C++重定向