Android bindService流程

article/2025/10/1 8:17:12

一. 前言

        我们可以通过startService来启动一个服务, 当然也可以通过bindService绑定一个服务,本篇文章我们来讲一讲绑定服务的完整流程, 阅读此文之前,建议先阅读一下笔者的这三篇文章 Android 进程间通信机制(三) 系统进程与应用进程通信

 Android 进程间通信机制(四) 应用进程启动过程

Android 进程间通信机制(五) startService流程 

整个流程我们从 应用进程到AMS的的调用过程  和  Sevice的绑定过程 来梳理一下

二. 流程分析

        绑定服务,一般流程在客户端调用bindService()方法, 待绑定服务端的service成功后,  再回调客户端的ServiceConnection中的onServiceConnected()方法.  好了,接下来就一起看看代码

预先准备:自己写了一个客户端MyClient.apk    一个服务端MyService.apk

2.1  App ---> AMS

比如客户端MyClient.apk 调用代码如下:

        Intent intent = new Intent();ComponentName componentName = new ComponentName("com.example.mysevicejava","com.example.mysevicejava.MyService");intent.setComponent(componentName);this.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);

第一个参数传入Intent,第二个参数传入创建的ServiceConnection, ServiceConnection本身是一个接口. 其中包括两个回调方法, bindService()是在ContextWrapper.java类中实现的。

@Overridepublic boolean bindService(Intent service, ServiceConnection conn,int flags) {return mBase.bindService(service, conn, flags);}

mBase是ContextImpl类型对象,调用ContextImpl的bindService()方法。

 @Overridepublic boolean bindService(Intent service, int flags, Executor executor, ServiceConnection conn) {warnIfCallingFromSystemProcess();return bindServiceCommon(service, conn, flags, null, null, executor, getUser());}

继续调用ContextImpl.java中的 bindServiceCommon 方法

private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags,String instanceName, Handler handler, Executor executor, UserHandle user) {....// Keep this in sync with DevicePolicyManager.bindDeviceAdminServiceAsUser.// 先提前说一下, IServiceConnection 也是一个接口,继承android.os.IInterface 说明是一个Binder,用于跨进程通信用的, 后文有用到它的地方IServiceConnection sd;if (mPackageInfo != null) {//注释1if (executor != null) {sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), executor, flags);} else {sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), handler, flags);}} else {throw new RuntimeException("Not supported in system context");}//检查service intent的有效性, 在高于L版本之后, 启动servie必须是显示的intent//要带上包名和类名validateServiceIntent(service);//注释2int res = ActivityManager.getService().bindIsolatedService(mMainThread.getApplicationThread(), getActivityToken(), service,service.resolveTypeIfNeeded(getContentResolver()),sd, flags, instanceName, getOpPackageName(), user.getIdentifier());
}

注释1处创建sd对象

注释2处调用bindIsolatedService()方法与系统进程中的AMS交互

 在注释1处调用了 LoadedApk类型的对象 mPackagelnfo 的getServiceDispatcher方法.

 接着又调用 getServiceDispatcherCommon这个方法

 private IServiceConnection getServiceDispatcherCommon(ServiceConnection c,Context context, Handler handler, Executor executor, int flags) {.....LoadedApk.ServiceDispatcher sd = null;ArrayMap<ServiceConnection, LoadedApk.ServiceDispatcher> map = mServices.get(context);//第一次绑定sd为null  executor为nullif (sd == null) {if (executor != null) {sd = new ServiceDispatcher(c, context, executor, flags);} else {//走这里的代码,创建一个ServiceDispatcher实例。sd = new ServiceDispatcher(c, context, handler, flags);}//创建好后, 用map存起来  key为 ServiceConnection对象(客户端传递过来的ServiceConnection), value为ServiceDispatcher对象map.put(c, sd);//返回一个InnerConnection对象。return sd.getIServiceConnection();
}

在来看看 ServiceDispatcher这个类, 首先它属于LoadedApk.java中的一个静态类

/frameworks/base/core/java/android/app/LoadedApk.java

static final class ServiceDispatcher {private final ServiceDispatcher.InnerConnection mIServiceConnection;
.....private static class ConnectionInfo {IBinder binder;IBinder.DeathRecipient deathMonitor;}//注释1 内部类 InnerConnection是一个Binder//看见这块比较熟悉的代码,在跨进程通信来看, 这里就属于服务端的代码, 那谁是客户端呢?//答案是 AMS private static class InnerConnection extends IServiceConnection.Stub {@UnsupportedAppUsagefinal WeakReference<LoadedApk.ServiceDispatcher> mDispatcher;InnerConnection(LoadedApk.ServiceDispatcher sd) {mDispatcher = new WeakReference<LoadedApk.ServiceDispatcher>(sd);}public void connected(ComponentName name, IBinder service, boolean dead)throws RemoteException {LoadedApk.ServiceDispatcher sd = mDispatcher.get();if (sd != null) {sd.connected(name, service, dead);}}}//ServiceDispatcher构造方法@UnsupportedAppUsageServiceDispatcher(ServiceConnection conn,Context context, Handler activityThread, int flags) {//创建一个InnerConnection对象,是一个IBindermIServiceConnection = new InnerConnection(this);//将客户端conn赋值给mConnectionmConnection = conn;mContext = context;mActivityThread = activityThread;mActivityExecutor = null;mLocation = new ServiceConnectionLeaked(null);mLocation.fillInStackTrace();mFlags = flags;}IServiceConnection getIServiceConnection() {return mIServiceConnection;}.....
}

在看看IServiceConnection.aidl 文件,  用关键字oneway修饰,说明在远程调用时(是异步调用,即客户端AMS不会被阻塞), 它只是发送事务数据并立即返回, oneway修饰了的方法不可以有返回值.

/** @hide */
oneway interface IServiceConnection {@UnsupportedAppUsagevoid connected(in ComponentName name, IBinder service, boolean dead);
}

上面这段代码IServiceConnection  跨进程通信模型如下: 

 IServiceConnection 用于在  AMS 在bindService成功后通知app(此时AMS作为客户端, app进程作为服务端),  然后回调app的 ServiceConnection的 onServiceConnected方法. 

好了把注释1 和 注释2 分析完后, 先总结一下时序图:

2.2 Sevice绑定过程

接下来就进入到 AMS 中

调用到ActivityManagerService的bindIsolatedService方法

public int bindIsolatedService(IApplicationThread caller, IBinder token, Intent service,String resolvedType, IServiceConnection connection, int flags, String instanceName,String callingPackage, int userId) throws TransactionTooLargeException {....synchronized(this) {return mServices.bindServiceLocked(caller, token, service,resolvedType, connection, flags, instanceName, callingPackage, userId);}
....}

接下来调用 frameworks/base/services/core/java/com/android/server/am/ActiveServices.java

中的 bindServiceLocked 方法:

int bindServiceLocked(IApplicationThread caller, IBinder token, Intent service,String resolvedType, final IServiceConnection connection, int flags,String instanceName, String callingPackage, final int userId)throws TransactionTooLargeException {.....	ServiceRecord s = res.record;boolean permissionsReviewRequired = false;.....//注释1记录需要bind的serviceAppBindRecord b = s.retrieveAppBindingLocked(service, callerApp);ConnectionRecord c = new ConnectionRecord(b, activity,connection, flags, clientLabel, clientIntent,callerApp.uid, callerApp.processName, callingPackage);//注释2 这个就是 bindservice()方法的第三个参数  Context.BIND_AUTO_CREATEif ((flags&Context.BIND_AUTO_CREATE) != 0) {s.lastActivity = SystemClock.uptimeMillis();//会调用到service服务端进程进行onCreate onBindif (bringUpServiceLocked(s, service.getFlags(), callerFg, false,permissionsReviewRequired) != null) {return 0;}}.....// 注释3   s为ServiceRecord  s.app为ProcessRecord  第一次绑定是s.app为null // b.intent.received 为false 所以走else分支.if (s.app != null && b.intent.received) {// Service is already running, so we can immediately// publish the connection.//直接翻译英文注释: 服务已经正在运行, 所以我们立马能回调 connection//即回调 IServiceConnection 接口中的 connected(3个参数)方法了try {c.conn.connected(s.name, b.intent.binder, false);} catch (Exception e) {Slog.w(TAG, "Failure sending service " + s.shortInstanceName+ " to connection " + c.conn.asBinder()+ " (in " + c.binding.client.processName + ")", e);}// If this is the first app connected back to this binding,// and the service had previously asked to be told when// rebound, then do so.// 注释4 应用进程与服务进行绑定,并且服务已经调用过onUnbind方法if (b.intent.apps.size() == 1 && b.intent.doRebind) {requestServiceBindingLocked(s, b.intent, callerFg, true);}} else if (!b.intent.requested) {//注释5 如果应用进程没有发送过绑定service的请求, 第一次绑定会走这里requestServiceBindingLocked(s, b.intent, callerFg, false);}.....
}

先看注释1的调用代码

 public AppBindRecord retrieveAppBindingLocked(Intent intent,ProcessRecord app) {Intent.FilterComparison filter = new Intent.FilterComparison(intent);IntentBindRecord i = bindings.get(filter);if (i == null) {i = new IntentBindRecord(this, filter);bindings.put(filter, i);}AppBindRecord a = i.apps.get(app);if (a != null) {return a;}a = new AppBindRecord(this, i, app);i.apps.put(app, a);return a;}

讲到这 有必要先介绍几个与 Service 关的对象类型 ,这样有助于对源码进行理解,
如下所示

 ServiceRecord :用于描述一个 Service
 ProcessRecord :  一个进程的信息。
ConnectionRecord :用于描述应用进程和 Service 建立的一次通信。
AppBindRecord :应用进程通过 Intent 绑定 Service 时,会通过 AppBindRecord 
来维护 Service 与应用程序进程之间的关联
。其内部存储了谁绑定的 Service
( ProcessRecord 、被绑定的 Service ( AppBindRecord )、绑定 Service Intent
( IntentBindRecord )和所有绑定通信记 的信息( ArraySet<Connect onRecord )。
IntentBindRecord :用于描述绑定 Service Intent

注释2处部分

在注释2处调用 bringUpServiceLocked 方法,在 bringUpServiceLocked 方法中又调用
realStartServiceLocked 方法,最终由 ActivityThread 来调用 Service onCreate 方法启动
Service ,这也说明了 bindService 方法内部会启动 Service 

关于startService的启动流程 请查阅笔者的 Android 进程间通信机制(五) startService流程

注释3处部分:

s为ServiceRecord  s.app为ProcessRecord  第一次绑定是s.app为null     b.intent.received 为false 所以走else分支(走注释5处代码)

b.intent.received只有在服务端MyService执行 onBind()并且publishService()之后才为true

s.app是在realStartServiceLocked()的时候被赋值.

注释4处表示:应用进程与服务进行绑定,并且服务已经调用过onUnbind方法

继续分析 注释5 部分

注释5处表示:  如果应用进程没有发送过绑定service的请求,第一次绑定就会走这个分支

 private final boolean requestServiceBindingLocked(ServiceRecord r, IntentBindRecord i,boolean execInFg, boolean rebind) throws TransactionTooLargeException {if ((!i.requested || rebind) && i.apps.size() > 0) {try {bumpServiceExecutingLocked(r, execInFg, "bind");r.app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_SERVICE);//这里就通过IApplicationThread进行跨进程通信, 跳转到app进程的 ActivityThread.java的scheduleBindService方法了r.app.thread.scheduleBindService(r, i.intent.getIntent(), rebind,r.app.getReportedProcState());if (!rebind) {i.requested = true;}i.hasBound = true;i.doRebind = false;
}

 继续跳转到

frameworks/base/core/ java/and oid/app/ ActivityTh read . java 的scheduleBindService方法
 public final void scheduleBindService(IBinder token, Intent intent,boolean rebind, int processState) {updateProcessState(processState, false);BindServiceData s = new BindServiceData();s.token = token;s.intent = intent;s.rebind = rebind;if (DEBUG_SERVICE)Slog.v(TAG, "scheduleBindService token=" + token + " intent=" + intent + " uid="+ Binder.getCallingUid() + " pid=" + Binder.getCallingPid());//发送BIND_SERVICE消息sendMessage(H.BIND_SERVICE, s);}//处理消息的代码:case BIND_SERVICE:Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");handleBindService((BindServiceData)msg.obj);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);break;
....

继续调用frameworks/base/core/java/android/app/ActivityThread java的handleBindService方法

private void handleBindService(BindServiceData data) {Service s = mServices.get(data.token); //1if (s != null) {try {data.intent.setExtrasClassLoader(s.getClassLoader());data.intent.prepareToEnterProcess();try {if (!data.rebind) { //2IBinder binder = s.onBind(data.intent); //3ActivityManager.getService().publishService(data.token, data.intent, binder); //4} else {s.onRebind(data.intent); ActivityManager.getService().serviceDoneExecuting(data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0);}} catch (RemoteException ex) {throw ex.rethrowFromSystemServer();}} catch (Exception e) {if (!mInstrumentation.onException(s, e)) {throw new RuntimeException("Unable to bind to service " + s+ " with " + data.intent + ": " + e.toString(), e);}}
....}

在1 处获取要绑定的 Service

在2处BindServiceData成员变量rebind值为false

在3处,就执行来调用 Service中的 onBind方法, 比如我自己写MyService.java

  @Overridepublic IBinder onBind(Intent intent) {Log.e("test", "==服务端==onBind========");// TODO: Return the communication channel to the service.return new MyBinder();}

如果 rebind 的值为 true 则调用 5处的 Service onRebind 方法

在4会调用
ActivityManager.getService()的publishService方法,调用ActivityManagerService的publishService()方法。

 public void publishService(IBinder token, Intent intent, IBinder service) {// Refuse possible leaked file descriptorsif (intent != null && intent.hasFileDescriptors() == true) {throw new IllegalArgumentException("File descriptors passed in Intent");}synchronized(this) {if (!(token instanceof ServiceRecord)) {throw new IllegalArgumentException("Invalid service token");}mServices.publishServiceLocked((ServiceRecord)token, intent, service);}}

接着又会调用  mServices.publishServiceLocked((ServiceRecord)token, intent, service);

void publishServiceLocked(ServiceRecord r, Intent intent, IBinder service) {final long origId = Binder.clearCallingIdentity();try {if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "PUBLISHING " + r+ " " + intent + ": " + service);if (r != null) {Intent.FilterComparison filter= new Intent.FilterComparison(intent);IntentBindRecord b = r.bindings.get(filter);if (b != null && !b.received) {b.binder = service;b.requested = true;b.received = true;ArrayMap<IBinder, ArrayList<ConnectionRecord>> connections = r.getConnections();for (int conni = connections.size() - 1; conni >= 0; conni--) {ArrayList<ConnectionRecord> clist = connections.valueAt(conni);for (int i=0; i<clist.size(); i++) {ConnectionRecord c = clist.get(i);if (!filter.equals(c.binding.intent.intent)) {if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Not publishing to: " + c);if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bound intent: " + c.binding.intent.intent);if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Published intent: " + intent);continue;}if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Publishing to: " + c);try {//最重要的方法c.conn.connected(r.name, service, false);} catch (Exception e) {Slog.w(TAG, "Failure sending service " + r.shortInstanceName+ " to connection " + c.conn.asBinder()+ " (in " + c.binding.client.processName + ")", e);}

重点关注  c.conn.connected(r.name, service, false);

可以再回过头看下2.1 小结中的  IServiceConnection 通信的示意图(见2.1小结的分析图)

调用 c.conn.connected方法,其中 c.conn指的是 IServiceConnection , 它的实现为ServiceDispatcher.InnerConnection ,实现代码在 /frameworks/base/core/java/android/app/LoadedApk.java 中

其中ServiceDispatcher 是LoadedApk 的内部类, 而InnerConnection又是ServiceDispatcher的内部类.

c.conn.connected(xxx) 就调用的如下的代码

private static class InnerConnection extends IServiceConnection.Stub {@UnsupportedAppUsagefinal WeakReference<LoadedApk.ServiceDispatcher> mDispatcher;InnerConnection(LoadedApk.ServiceDispatcher sd) {mDispatcher = new WeakReference<LoadedApk.ServiceDispatcher>(sd);}//会调用这里的方法public void connected(ComponentName name, IBinder service, boolean dead)throws RemoteException {LoadedApk.ServiceDispatcher sd = mDispatcher.get();if (sd != null) {sd.connected(name, service, dead);}}}

继续调用 sd.connected(name, service, dead)方法:

public void connected(ComponentName name, IBinder service, boolean dead) {if (mActivityExecutor != null) {mActivityExecutor.execute(new RunConnection(name, service, 0, dead));} else if (mActivityThread != null) {//注释1mActivityThread.post(new RunConnection(name, service, 0, dead));} else {doConnected(name, service, dead);}}

注释1处调用 Handler 类型的对象 mActivityThread post 方法, mActivityThread
际上指向的是H 。通过调用H 的post方法将 RunConnection 对象的内容运行在主线
程中。 下面再看看RunConnection 里面的run方法

/frameworks/base/core/java/android/app/LoadedApk.java

private final class RunConnection implements Runnable {RunConnection(ComponentName name, IBinder service, int command, boolean dead) {mName = name;mService = service;mCommand = command;mDead = dead;}public void run() {//上面传递进来的第三个参数 mCommand 为 0,所以走这里的代码if (mCommand == 0) {doConnected(mName, mService, mDead);} else if (mCommand == 1) {doDeath(mName, mService);}}final ComponentName mName;final IBinder mService;final int mCommand;final boolean mDead;}

继续调用doConnected(mName, mService, mDead)方法

public void doConnected(ComponentName name, IBinder service, boolean dead) {
.....// If there was an old service, it is now disconnected.if (old != null) {mConnection.onServiceDisconnected(name);}if (dead) {mConnection.onBindingDied(name);}// If there is a new viable service, it is now connected.//这里就回调到了 客户端的  onServiceConnected 方法了if (service != null) {mConnection.onServiceConnected(name, service);} else {// The binding machinery worked, but the remote returned null from onBind().mConnection.onNullBinding(name);}
.....
}


这样在客户端实现了 ServiceConnection 接口类的 onServiceConnected方法就会被执
行。至此,Service 的绑定过程就分析完成。

三. 整体流程图

 在自己写的demo(客户端 MyClient.apk  服务端MyService.apk)中加入log,也和上面分析的流程图是一致的

03-21 21:50:57.942  4221  9156 E test    : =ActiveServices===创建==scheduleCreateService==
03-21 21:50:57.943  4221  9156 E test    : ===ActiveServices  scheduleBindService===
03-21 21:50:57.945 29708 29708 E test    : =服务端MyService==onCreate=====
03-21 21:50:57.946 29708 29708 E test    : ==服务端MyService==onBind========
03-21 21:50:57.964 29831 29831 E test    :  客户端MyClient 回调方法 onServiceConnected 


http://chatgpt.dhexx.cn/article/ETCCHOtO.shtml

相关文章

bind服务程序

一、介绍 1、bind服务是全球范围内使用最广泛、最安全可靠且高效的域名解析服务程序。 2、为了有效地限制bind服务程序仅能对自身的配置文件进行操作&#xff0c;以确保整个服务器的安全&#xff0c;在安装部署bind服务程序时加上chroot&#xff08;俗称牢笼机制&#xff09;…

startService bindService 区别

Android执行Service有两种方法&#xff0c;一种是startService&#xff0c;一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。 1、生命周期上的区别 执行startService时&#xff0c;Service会经历onCreate->onStartCommand。当执行stopService时&…

Android中Service使用bindService

前面已经对Service的startServer方式启动一个服务了解过了&#xff0c;现在来看一下Service的另一种启动方式→bindServer bindServer使用场景 1、在同个app之间调用&#xff08;即是同一个进程中&#xff09; 2、在不同app之间调用&#xff08;即是跨进程间通信&#xff09…

Android——bindService()方法启动服务

通过绑定服务来启动的话需要注意创建一个类来实现ServiceConnection接口&#xff0c;重写onServiceConnected&#xff08;&#xff09;和onServiceDisconnected&#xff08;&#xff09;方法。这个类用于服务的连接。成功绑定服务时&#xff0c;会调用onServiceConnected&#…

Android Service 服务(三)—— bindService与remoteService

一、bindService简介 bindService是绑定Service服务&#xff0c;执行service服务中的逻辑流程。 service通过Context.startService()方法开始&#xff0c;通过Context.stopService()方法停止&#xff1b;也可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停…

SO_BINDTODEVICE 使用

就绑定到了接口"lmi40"上,所有数据报的收发都只经过这个网卡. 对于SOL_BINDTODEVICE的总结如下: &#xff08;1&#xff09; 对于TCP套接口、UDP套接口、RAW套接口&#xff0c;可以通过SO_BINDTODEVICE套接口选项将套接口绑定到指定的网络接口上。绑定之后&…

startService与bindService的区别

Android执行Service有两种方法&#xff0c;一种是startService&#xff0c;一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。 1、生命周期上的区别 执行startService时&#xff0c;Service会经历onCreate->onStartCommand。当执行stopService时&…

startService和bindService的区别

首先看下其生命周期的区别&#xff1a; 生命周期&#xff1a; onCreate → startCommand → onDestroy onCreate → onBind→onUnBind→ onDestroy 静态绑定对应着startService&#xff1b;动态绑定对应着bindService&#xff0c;静态有自己独立的生命周期&#xff0c;动态会…

bindService的使用

bindService与starService之间的区别&#xff1a; 在程序通过startService&#xff08;&#xff09;方法启动的服务&#xff0c;会长期在后台运行&#xff0c;并且启动服务的组件与服务之间没有关系&#xff0c;即使启动服务的组件被销毁&#xff0c;服务还是会运行。 但是当一…

Service学习以及BindService的使用

Service 什么是Service Service是一个可以在后台执行长时间操作而不使用用户界面的应用组件。 如何使用Service 我们首先需要实现一个Service的子类。主要实现Service的onCreat&#xff08;&#xff09;&#xff0c;onStartCommand&#xff08;&#xff09;&#xff0c;onB…

Android中bindService的使用及Service生命周期

Android中有两种主要方式使用Service&#xff0c;通过调用Context的startService方法或调用Context的bindService方法&#xff0c;本文只探讨纯bindService的使用&#xff0c;不涉及任何startService方法调用的情况。如果想了解startService相关的使用&#xff0c;请参见《Andr…

粒子群算法笔记

实质&#xff1a;在定义域随机放置多个变量&#xff0c;不断跳跃&#xff0c;同步寻找最优解。寻找方向受单个粒子与全部粒子的最优位置共同影响。单个粒子按照公式不断迭代寻找当新位置。多个变量聚集在某一点时&#xff0c;该点即是最优解。 控制其搜索速度&#xff08;步长…

粒子群算法及C++实现

参考博客 https://www.cnblogs.com/alan666/p/8311804.html https://blog.csdn.net/weixin_39059031/article/details/103723843 https://blog.csdn.net/weixin_40679412/article/details/80571854 https://blog.csdn.net/daaikuaichuan/article/details/81382794 https://blo…

粒子群算法详解

一.产生背景 ❃粒子群算法(particleswarm optimization&#xff0c;PSO)由Kennedy和Eberhart在1995年提出&#xff0c;该算法对于Hepper的模拟鸟群(鱼群)的模型进行修正&#xff0c;以使粒子能够飞向解空间&#xff0c;并在最好解处降落&#xff0c;从而得到了粒子群优化算法。…

高铁列车粒子群算法及改进粒子群算法多目标单目标运行优化设计

问题介绍 根据表1、2、3 所列数据&#xff0c;以能耗、运行时间、舒适性为目标分别设计列车运行速度—距离曲线&#xff1b;完成单目标以及多目标优化下的列车运行对比&#xff1b;选择其中一种方案&#xff0c;设计列车速度跟踪控制算法并进行性能分析。 1 列车参数设置表优化…

智能优化算法之粒子群算法

1、粒子群优化算法概述 粒子群优化算法(PSO&#xff1a;Particle swarm optimization) 是一种进化计算技术&#xff08;evolutionary computation&#xff09;。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想&#xff1a;是通过群体中个体之间的协作和信息共享来寻找最优…

基于群智能的三维路径规划算法 2 —— 粒子群算法

目录 1 PSO算法的基本理论2 PSO算法程序设计流程3 MATLAB编程实现4 算法举例5 函数1 unifrnd函数 1 PSO算法的基本理论 将三个散点看做一个粒子 惯性分量就是 v i − 1 d v^d_{i-1} vi−1d​ 粒子群&#xff08;PSO&#xff09;算法是依托群鸟觅食的模型寻找最优解。群体特征…

粒子群算法(2)

上一期&#xff1a;粒子群算法&#xff08;1&#xff09; 线性递减惯性权重 惯性权重w体现的是粒子继承先前的速度的能力&#xff0c;Shi,Y最先将惯性权重w引入到粒子群算法中&#xff0c;并分析指出一个较大的惯性权值有利于全局搜索&#xff0c;而一个较小的权值则更利于局部…

粒子群算法简介

粒子群算法简介 前言 本文内容借鉴于 刘衍民的博士论文:“粒子群算法的研究及应用”. 现有的大多数群智能算法,如:乌鸦算法、鸽子算法、蚁群算法、萤火虫算法和灰狼优化算法等&#xff0c;都可以归类为粒子群算法.(个人觉得,这些算法就是整个稀奇古怪的名字,颇有舞文弄墨,强…

粒子群算法(1)

粒子群算法 1.入门 粒子群算法&#xff0c;其全称为粒子群优化算法(Particle Swarm Optimization,PsO)。它是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的搜索算法。 2.什么是启发式算法&#xff1f; 启发式算法百度百科上的定义:一个基于直观或经验构造的算法,在可…