Hello Mat

 找回密码
 立即注册
查看: 2602|回复: 3

教与学算法

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2021-11-13 16:38:52 | 显示全部楼层 |阅读模式
TLBO.cpp
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #include<math.h>
  6. #include"roundx.h"
  7. #include"KP01.h"
  8. #include"maxValue.h"
  9. #include"maxValueIndex.h"
  10. #include"minValue.h"
  11. #include"randi.h"

  12. /* 教与学算法 */
  13. #define sizepop 10      /* 表示种群数 */
  14. #define maxiter 50     /* 进化次数 */
  15. #define C 2.6           /* 背包载重  */  
  16. #define nvar 3          /* 3个变量 */

  17. extern double v[3][3] = { { 0.5, 0.4, 0.9 },
  18.                                               { 0.4, 0.7, 1.1 },
  19.                                               { 0.3, 0.7, 1.0 } };
  20. extern double w[3][3] = { { 0.6, 0.7, 0.8 },
  21.                                                   { 0.7, 0.4, 0.8 },
  22.                                               { 0.5, 0.6, 0.7 } };
  23. void main(void)
  24. {
  25.         typedef long clock_t;
  26.         clock_t start, finish;
  27.         double duration;
  28.         start = clock();  //启动计时
  29.         srand((unsigned int)time(NULL));  //随机种子
  30.         srand(time(0));  // 初始化随机种子

  31.         // 变量声明
  32.         int pop[sizepop][nvar] = { 0 }, zbest[nvar] = { 0 }, newpop[nvar] = { 0 }, Mean[nvar] = { 0 }, Teacher_pop[nvar] = { 0 }, Step[nvar] = {0};
  33.         int popmin[nvar] = { 1, 1, 1 };
  34.         int popmax[nvar] = { 3, 3, 3 };
  35.         int S = 0, Smin = 0, Smax = 5, Exponent = 2;
  36.         double sigma_initial = 0.5, sigma_final = 0.001;
  37.         double fitness[sizepop] = { 0 }, newfitness = 0.0, Teacher_fitness = 0.0;
  38.         double temp = 0.0, randk = 0.0;
  39.         double bestfitness = 0.0, sigma = 0.0, BestCost = 0.0, WorstCost = 0.0, ratio = 0.0;
  40.         int bestLoc = 0, bestLoc2 = 0, TF = 1;
  41.         int xx[nvar][nvar] = { 0 };

  42.         // 初始化种群
  43.         for (int i = 0; i < sizepop; i++)
  44.         {
  45.                 for (int j = 0; j < nvar; j++)
  46.                 {
  47.                         randk = double(rand()) / double(RAND_MAX); //0-1随机数
  48.                         temp = (popmin[j] + randk*(popmax[j] - popmin[j]));
  49.                         pop[i][j] = roundx(temp);
  50.                 }
  51.                 fitness[i] = KPO1(pop[i]);   // 适应度函数
  52.         }
  53.         // 记录一组最优值
  54.         bestfitness = maxValue(fitness);
  55.         bestLoc = maxValueIndex(fitness);
  56.         memcpy(zbest, pop[bestLoc], 12); // 3个整型,12个字节

  57.         // 迭代寻优
  58.         for (int iter = 0; iter < maxiter; iter++)
  59.         {
  60.                 // Calculate Population Mean
  61.                 for (int k = 0; k < nvar; k++)
  62.                         Mean[k] = 0;
  63.                 for (int k = 0; k < nvar; k++)
  64.                 {
  65.                         for (int i = 0; i < sizepop; i++)
  66.                         {
  67.                                 Mean[k] = Mean[k] + pop[i][k];
  68.                         }
  69.                         Mean[k] = (int)(Mean[k] / sizepop);
  70.                 }
  71.                 // Select Teacher
  72.                 Teacher_fitness = maxValue(fitness);
  73.                 bestLoc = maxValueIndex(fitness);
  74.                 memcpy(Teacher_pop, pop[bestLoc], 12); // 3个整型,12个字节

  75.                 // Teacher Phase
  76.                 for (int i = 0; i < sizepop; i++)
  77.                 {
  78.                         TF = randi(1, 2);
  79.                         // Teaching (moving towards teacher)
  80.                         S = roundx(Smin + (Smax - Smin)*ratio);
  81.                         for (int k = 0; k < nvar; k++)
  82.                         {
  83.                                 randk = double(rand()) / double(RAND_MAX); //0-1随机数
  84.                                 newpop[k] = roundx(pop[i][k] + (Teacher_pop[k] - TF*Mean[k])*randk);
  85.                                 // 局部搜索
  86.                                 if (iter>int(maxiter / 2))
  87.                                 {
  88.                                         newpop[k] = roundx(zbest[k] + (Teacher_pop[k] - TF*Mean[k])*randk);
  89.                                 }

  90.                                 if (newpop[k]>popmax[k])
  91.                                         newpop[k] = popmax[k];
  92.                                 else if (newpop[k] < popmin[k])
  93.                                         newpop[k] = popmin[k];
  94.                         }
  95.                         newfitness = KPO1(newpop);   // 适应度函数

  96.                         if (newfitness>fitness[i])
  97.                         {
  98.                                 fitness[i] = newfitness;
  99.                                 memcpy(pop[i], newpop, 12); // 3个整型,12个字节
  100.                         }
  101.                         if (newfitness > bestfitness)
  102.                         {
  103.                                 bestfitness = newfitness;
  104.                                 memcpy(zbest, newpop, 12); // 3个整型,12个字节
  105.                         }
  106.                 }

  107.                 //printf("最优适应度值为: %lf\n", bestfitness);         // 输出显示
  108.         }
  109.         // Learner Phase
  110.         for (int i = 0; i < sizepop; i++)
  111.         {
  112.                 bestLoc = randi(1, sizepop);
  113.                 bestLoc2 = randi(1, sizepop);
  114.                 for (int k = 0; k < nvar; k++)
  115.                 {
  116.                         Step[k] = pop[i][k] - pop[bestLoc][k];
  117.                 }
  118.                 if (fitness[bestLoc] < fitness[i])
  119.                 {
  120.                         for (int k = 0; k < nvar; k++)
  121.                         {
  122.                                 Step[k] = -Step[k];
  123.                         }
  124.                 }
  125.                 for (int k = 0; k < nvar; k++)
  126.                 {
  127.                         // 交叉
  128.                         newpop[k] = 0.5*pop[bestLoc][k] + 0.5*pop[bestLoc2][k];
  129.                         // 变异
  130.                         randk = double(rand()) / double(RAND_MAX); //0-1随机数
  131.                         if (randk>0.5)
  132.                         {
  133.                                 newpop[k] = roundx(pop[i][k] + randk*Step[k]);
  134.                         }       
  135.                 }
  136.                 newfitness = KPO1(newpop);   // 适应度函数

  137.                 if (newfitness>fitness[i])
  138.                 {
  139.                         fitness[i] = newfitness;
  140.                         memcpy(pop[i], newpop, 12); // 3个整型,12个字节
  141.                 }
  142.                 if (newfitness > bestfitness)
  143.                 {
  144.                         bestfitness = newfitness;
  145.                         memcpy(zbest, newpop, 12); // 3个整型,12个字节
  146.                 }

  147.                 printf("最优适应度值为: %lf\n", bestfitness);         // 输出显示
  148.         }

  149.         printf("\n");         // 输出显示

  150.         // 最终的解
  151.         printf("最终的解为: \n");         // 输出显示
  152.         for (int i = 0; i < nvar; i++)
  153.         {
  154.                 if (zbest[i] == 1)
  155.                         xx[i][0] = 1;
  156.                 else if (zbest[i] == 2)
  157.                         xx[i][1] = 1;
  158.                 else if (zbest[i] == 3)
  159.                         xx[i][2] = 1;
  160.                 printf("%d\t %d\t %d\n", xx[i][0], xx[i][1], xx[i][2]);   // C0-C4输出显示
  161.         }

  162.         printf("\n");         // 输出显示
  163.         system("pause");    // 消除屏幕一闪即消失的情况
  164. }
复制代码
roundx.cpp
  1. #include<stdio.h>
  2. #include<math.h>

  3. int roundx(double x)
  4. {
  5.         int x1 = (int)x;
  6.         if (x - x1 >= 0.5)
  7.                 return x1 + 1;
  8.         else
  9.                 return x1;
  10. }
复制代码
randi.cpp
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #include<math.h>
  6. #include"roundx.h"

  7. // 函数目的:随机产生在某个区间的整数
  8. int randi(int a, int b)
  9. {
  10.         typedef long clock_t;
  11.         clock_t start, finish;
  12.         double duration;
  13.         start = clock();  //启动计时
  14.         srand((unsigned int)time(NULL));  //随机种子
  15.         srand(time(0));  // 初始化随机种子

  16.         double randk = double(rand()) / double(RAND_MAX); //0-1随机数
  17.         return roundx(a + (b - a)*randk);
  18. }
复制代码
minValue.cpp
  1. #include<stdio.h>
  2. #include<math.h>
  3. // 函数目的:求解最小值
  4. #define sizepop 50      /* 表示种群数 */
  5. double minValue(double x[sizepop])
  6. {
  7.         double temp = 100000.0;
  8.         for (int i = 0; i < sizepop; i++)
  9.         {
  10.                 if (x[i]<temp)
  11.                         temp = x[i];
  12.         }
  13.         return temp;
  14. }
复制代码
maxValueIndex.cpp
  1. #include<stdio.h>
  2. #include<math.h>
  3. // 函数目的:求解最大值对应的索引
  4. #define sizepop 50      /* 表示种群数 */
  5. int maxValueIndex(double x[sizepop])
  6. {
  7.         int index = 0;
  8.         double temp = 0.0;
  9.         for (int i = 0; i < sizepop; i++)
  10.         {
  11.                 if (x[i]>temp)
  12.                 {
  13.                         temp = x[i];
  14.                         index = i;
  15.                 }
  16.         }
  17.         return index;
  18. }
复制代码
maxValue.cpp
  1. #include<stdio.h>
  2. #include<math.h>
  3. // 函数目的:求解最大值
  4. #define sizepop 50      /* 表示种群数 */
  5. double maxValue(double x[sizepop])
  6. {
  7.         double temp = 0.0;
  8.         for (int i = 0; i < sizepop; i++)
  9.         {
  10.                 if (x[i]>temp)
  11.                         temp = x[i];
  12.         }
  13.         return temp;
  14. }
复制代码
目标函数:
  1. #include<stdio.h>
  2. #include<math.h>
  3. /* 适应度函数 */
  4. /*全局变量*/
  5. #define C 2.6           /* 背包载重  */
  6. #define nvar 3          /* 3个变量 */
  7. extern double v[3][3], w[3][3];

  8. double KPO1(int *x)
  9. {
  10.         int i = 0, j = 0;
  11.         double xw = 0, xv = 0;
  12.         int xx[nvar][nvar] = {0};
  13.         for (i = 0; i < nvar; i++)
  14.         {
  15.                 if (x[i] == 1)
  16.                         xx[i][0] = 1;
  17.                 else if (x[i] == 2)
  18.                         xx[i][1] = 1;
  19.                 else if (x[i] == 3)
  20.                         xx[i][2] = 1;
  21.         }
  22.         for (i = 0; i < nvar; i++)
  23.         {
  24.                 for (j = 0; j < nvar; j++)
  25.                 {
  26.                         xw = xw + xx[i][j] * w[i][j];
  27.                         xv = xv + xx[i][j] * v[i][j];
  28.                 }
  29.         }
  30.         if (xw <= C)
  31.                 return xv;
  32.         else
  33.                 return -1;
  34. }
复制代码





















算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
 楼主| 发表于 2021-11-13 16:41:01 | 显示全部楼层
roundx.h
  1. #ifndef _ROUNDX_H_
  2. #define _ROUNDX_H_

  3. int roundx(double x);

  4. #endif
复制代码
minValue.h
  1. #ifndef _MINVALUE_H_
  2. #define _MINVALUE_H_

  3. #define sizepop 50      /* 表示种群数 */
  4. double minValue(double x[sizepop]);

  5. #endif
复制代码
maxValue.h
  1. #ifndef _MAXVALUE_H_
  2. #define _MAXVALUE_H_

  3. #define sizepop 50      /* 表示种群数 */
  4. double maxValue(double x[sizepop]);

  5. #endif
复制代码
其余
KP01.h、maxValueIndex.h、randi.h同理









算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
 楼主| 发表于 2021-11-13 16:41:50 | 显示全部楼层
目标函数的matlab代码如下:
% 适应度函数
CostFunction = @(x) KP01(x);  % 目标函数Objective Function
nvar = 3;           % 变量个数
popmin = [1,1,1];       % Lower Bound of Decision Variables
popmax = [3, 3, 3];        % Upper Bound of Decision Variables
maxiter=100;       % 最大迭代次数
sizepop = 50;      % 最大种群数量
  1. function [fitness, xx ]= KP01(x)
  2. C = 2.6;
  3. v = [0.5        0.4        0.9
  4.     0.4        0.7        1.1
  5.     0.3        0.7        1.0];
  6. w = [0.6        0.7        0.8
  7.     0.7        0.4        0.8
  8.     0.5        0.6        0.7];
  9. xx = zeros(size(v));
  10. for i=1:length(x)
  11.     if x(i)==1
  12.         xx(i,1) = 1;
  13.     elseif(x(i)==2)
  14.         xx(i,2) = 1;
  15.     elseif(x(i)==3)
  16.         xx(i,3) = 1;
  17.     end
  18. end
  19. if(sum(sum(xx.*w))<=C)
  20.     fitness = sum(sum(xx.*v));
  21. else
  22.     fitness = -1;
  23. end
复制代码
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
 楼主| 发表于 2021-11-14 16:50:00 | 显示全部楼层
bilibili视频观察代码运行效果:
https://www.bilibili.com/video/BV12L4y1v7NK/
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-25 15:43 , Processed in 0.240240 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表