POS基本算法详细解析

标题POS基本算法详细解析

在这里插入图片描述
粒子xi(t)与群相互交流,保存更新自己的最优点Pi(t),并且与群交流后得知全局(群)的最优点g(t),由原来的方向Vi(t)变到Vi(t+1)。
在这里插入图片描述
首先看懂上面两张图!再看程序

function[xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
% c1,c2:学习因子
% w:惯性权重
% M:最大迭代次数
% D:搜索空间维数,也就是表示目标点需要几个参数,比如是三维的点,就需要三个维数,简单来说就是空间向量要三个参数确定xyz
% N:初始化群体个体数目

% 初始化种群的个体(可以在这里限定位置和速度的范围)
format long;%针对数据的显示形式进行控制,显示15位双精度,7位单精度
for i = 1:N
for j=1:D
x(i,j) = randn; % 随机初始化位置
v(i,j) = randn; % 随即初始化速度,共NxD个
end
end

% 先计算各个粒子的适应度(就是要计算的目标函数),并初始化pi和pg
for i=1:N
p(i) = fitness(x(i,:));%赋予随机初值
y(i,:) = x(i,:);%赋予粒子随机初值,状态方程用y(i,:)代替了
end
pg = x(N,:); % pg为全局最优,先定义随机选了x第N行的值为初值
for i=1:(N-1)%这里没搞懂N-1,不是N次循环吗?希望读者可以交流一下
if(fitness(x(i,:))<fitness(pg))%比较适应度(目标函数)全局Pg各个维度上最优和x第i行单个粒子最优,然后把N行中的D个维度综合最大的一行所有数据赋值给pg
pg = x(i,:);
end
end

% 进入主要循环,按照公式依次迭代,直到满足精度要求
for t=1:M
for i=1:N % 更新N个粒子速度、位移
v(i,:)=wv(i,:)+c1rand*(y(i,:)-x(i,:))+c2rand(pg-x(i,:));%这个地方y(i,:)不太懂,为啥不是p(i),多交流,后来想清楚了,没错
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:)) < p(i)%比较当前值和本身历史最优,若当前值最优
p(i)=fitness(x(i,:));%替换本身历史最优
y(i,:)=x(i,:);%更新当前位置
end
if p(i) < fitness(pg)%进一步比较当前值和全局历史最优,若当前值最优
pg=y(i,:);%替换全局历史最优,第一次迭代下来就得到了N粒子中最优的全局值了,第M次迭代就得到了M次迭代下最优的值了
end
end
Pbest(t)=fitness(pg);
end

% 输出结果
disp(‘目标函数取最小值时的自变量:’)
xm=pg’;
disp(‘目标函数的最小值为:’)
fv=fitness(pg);

目标函数自己编写一个M文件,
主界面运行程序
x = zeros(1,D);
[xm1,fv1] = PSO(@fitness,N,c1,c2,w,M,D)

————————————————

原文链接:https://blog.csdn.net/zhaohaibo_/article/details/82465789

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用A*算法解决八数码问题的Java代码示例: ```java import java.util.*; public class EightPuzzle { private static final int[][] GOAL = {{1, 2, 3}, {4, 5, 6}, {7, 8, 0}}; // 目标状态 private static final int[][] DIRS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 上下左右四个方向 private static final int N = 3; // 棋盘大小 private static final int MAX_STATE = 1000000; // 最大状态数 private static int[][] start = new int[N][N]; // 起始状态 private static int[][] dist = new int[MAX_STATE][N]; // 到达每个状态的步数 private static int[][] pre = new int[MAX_STATE][N]; // 记录每个状态的前驱状态 private static int[][] vis = new int[MAX_STATE][N]; // 标记每个状态是否已经访问过 private static int[] pos = new int[9]; // 记录每个数字所在的位置 private static int getH(int[][] a) { // 计算估价函数h int res = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (a[i][j] == 0) continue; res += Math.abs(i - (a[i][j] - 1) / N) + Math.abs(j - (a[i][j] - 1) % N); } } return res; } private static int getId(int[][] a) { // 将状态转化为整数 int res = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { res = res * 10 + a[i][j]; } } return res; } private static void printAns(int id) { // 输出解答 if (id == -1) return; printAns(pre[id][0]); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { System.out.print(start[i][j] + " "); } System.out.println(); } System.out.println(); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { start[i][j] = sc.nextInt(); pos[start[i][j]] = i * N + j; } } int startId = getId(start); int goalId = getId(GOAL); if ((getH(start) & 1) != (getH(GOAL) & 1)) { // 判断是否有解 System.out.println("No solution!"); return; } int hh = 0, tt = 0; int[] q = new int[MAX_STATE]; Arrays.fill(dist, -1); Arrays.fill(vis, 0); dist[startId][0] = 0; vis[startId][0] = 1; q[0] = startId; while (hh <= tt) { int[][] cur = new int[N][N]; int t = q[hh++]; for (int i = N - 1; i >= 0; i--) { for (int j = N - 1; j >= 0; j--) { cur[i][j] = t % 10; t /= 10; } } if (getId(cur) == goalId) { // 到达目标状态 System.out.println("Steps: " + dist[goalId][0]); printAns(goalId); return; } int x = pos[0] / N, y = pos[0] % N; for (int i = 0; i < 4; i++) { // 扩展状态 int nx = x + DIRS[i][0], ny = y + DIRS[i][1]; if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue; int[][] nxt = new int[N][N]; for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { nxt[j][k] = cur[j][k]; } } nxt[x][y] = nxt[nx][ny]; nxt[nx][ny] = 0; int nxtId = getId(nxt); if (vis[nxtId][0] == 0) { // 新状态 vis[nxtId][0] = 1; dist[nxtId][0] = dist[getId(cur)][0] + 1; pre[nxtId][0] = getId(cur); q[++tt] = nxtId; } } } System.out.println("No solution!"); // 无解 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值