遗传算法【Genetic Algorithm(GA)】求解函数最大值(MATLAB and Python实现)
一、遗传算法基础知识
来自B站视频的笔记: 【超容易理解】手把手逐句带你解读并实现遗传算法的MATLAB编程(结合理论基础)_哔哩哔哩_bilibili
1、遗传算法
使用“适者生存”的原则,在遗传算法的每一代中,根据个体在问题域的适应度值和从生物学借鉴来的再造方法(复制、变异、交叉)进行个体选择,产生比原个体更适应环境的近似解。
2、模式定理
二值字符集(0,1},由此产生通常的 0,1字符串。增加一个通配符“*”,既可以做 1,也可以做 0。二值字符集{0,1}可以扩展为三值字符集{0,1,*},由此可以产生 0010,001*,*11*01*这类的字符串。
3、遗传算法的本质
是对模式所进行的一系列运算。通过选择操作将当前群体中的优良群体遗传到下一代群体中,通过交叉操作进行模式的重组,通过变异操作进行模式的突变通过这些遗传运算,一些较差的模式逐步被淘汰,而一些较好的模型逐渐被遗传和进化最终就可以达到问题的最优解。
多个字符串隐藏着多个不同的模式,长度为L的字符串,隐藏着个不同的模式,不同的模式所匹配的字符串个数不同,引入模式阶。
4、模式阶
模式 001*0*的阶数为 4,而 0*****的阶数为 1,说明一个模式阶数高,说明确定性越高,样本个数越少。
5、定义距
在模式 H中第一个确定位置和最后一个确定位置之间的距离,称之为模式距。
在遗传算法的选择、交叉、变异算子的作用下,具有低阶,短定义距,并且平均适应度高于群体平均适应度的模式在子代将呈指数级增长,最终趋向全局的最优点。
遗传算法使用群体搜索技术,通过对当前种群施加选择、交叉、变异等一系列遗传操作产生新一代种群,并逐步使种群进化到包含近似最优解的状态。
6、二进制编码精度
For Example 求取实数区间[0,4]上函数的最大值,传统的方法是不断调成自变量本身,直到获取函数的最大值,而遗传算法不对参数本身做调整,首先先编码,形成位串在对位串进行进化操作。【0,64】←我们可以由长度为 6的位串表示变量 x,从“000000”到“111111”并将中间的取值映射到实数区间[0,4],每个相邻的值之间的阶跃值为 4/63=0.0635。也就是编码精度。精度高,解的质量高,计算量大,耗时长。
【注】个人感觉2~6讲的是把问题的解编码成01串的理论过程。感兴趣问问AI或者搜其他文献。
7、适应度
生物种群个体适应生存环境的能力,用于评价个体优劣的数学函数。GA 算法在进化搜索中基本不需要外部信息,仅仅依靠适应度。
8、构造适应度函数的方法
1)目标函数映射成适应度函数(常用);
2)基于序的目标函数等。
9、遗传操作
优选强势个体的“选择”(选择算子),个体间交换基因产生新个体的“交叉(交叉算子),个体基因突变而产生新个体的“变异”(变异算子)。
9.1 选择算子:
根据个体适应度,按照一定规则,从第t代群体P(t)中选择优良个体遗传到下一代 P(t+1)中。
轮盘赌选择法:

它是基于比例的选择,利用个体适应度所占比例的大小来决定子代保留的可能性。若每
个个体i的适应度为 fi,种群大小为 NP,则他被选取的概率为:
个体适应度越大,被选择的机会越大,为了选择交叉个体,需要进行多轮选择,每一轮产生一个[0,1]均匀随机数,将该随机数作为选择指针来确定被选择个体。
9.2 交叉算子
将群体 P(t)中选中的各个个体随机搭配,对每一对个体以交叉概率 Pc 交换他们的染色体,通过交叉,遗传算法的搜索能力得以飞跃提高。
9.3 交叉算子步骤
从交配池中随机取出要交配的一对个体,然后,根据串长度L,对要交配的一对个体,对要交配的一对个体,随机选取[1,L-1]中的一个或者多个整数K作为交叉位置,最后,根据交叉概率实施交叉操作,配对个体在交叉位置处,相互交换各自的部分基因,从而形成新的一对个体。
9.4 变异算子
对群体中的每个个体,以变异概率Pm,将某一个或某一些基因座上的基因值17.改变为其他的等位基因值,0-1,1-0 根据个体编码方式的不同,变异方式有:实值变异(对相应的基因值用取值范围内的其他随机值取代),二进制变异(对应的基因取反)。
9.5 变异算子步骤
首先,对种群中所有个体按事先设定的变异概率判断是否进行变异,然后,对进行变异的个体随机选择变异位进行变异。
10、标准遗传算法
优化变量由二进制算法进行描述,多个优化变量的二进制变化串接在一起组成染色体。在创建初始群体的过程中,代表个体的二进制串是在一定字长的限制下随机产生的,交叉算子作用在交叉概率选中的两个染色体上,随机选中交叉位置,将两个染色体上对应于这两个位置上的二进制数值进行交换,生成新的个体,而变异算子的作用在变异概率随机选中的个体上,一般是随机选定变异位,将该位的二进制值取反,生成一个新的个体。
二、遗传算法的流程
初始化
设置进化代数计数器 g=0,最大迭代数G,随机生成 NP个个体作为初始群体P(0);个体评价:计算群体P(t)中各个个体的适应度;
选择操作
将选择算子应用于群体,根据个体适应度满招一定的原则将优良个体传递给下-代群体。
交叉运算
将交叉算子应用于群体,对选中的个体以某一概率交换他们之间部分的染色体产生新的个体;
变异运算
将变异算子应用于群体,对选中的个体,以某一种概率改变某一个基因值为他的等位基因。
循环操作
群体 P(t)经过选择、交叉、变异运算后得到下一代种群P(t+1),计算适应度值根据适应度进行排序,准备进行下一次变异操作。终止判断条件:如果 g<G,则 g=g+1,转到个体评价步骤,如果 g>G,则次进化过程中所得到的具有最大适应度的个体作为最优解输出,终止计算。

三、关键参数说明
种群规模 NP:影响着种群的最终结果以及遗传算法的执行效率,NP 一般取 10~200;
交叉概率 Pc:交叉操作的使用频率,一般取 0.25~1
变异概率 Pm:辅助性搜索操作,一般取 0.001~0.1
终止进化代数:一般取 100~1000 之间。
四、实例分析
函数图像


MATLAB代码
%{
使用遗传算法求函数y = x+10*sin(5*x)+7*cos(4*x) 最大值
%}
clear ;
close all;
clc;%% 函数图像显示
x1 = 0:0.01:10;
plot(x1,func1(x1))
xlabel("x")
ylabel("f(x)")
title("f(x)= x+10*sin(5*x)+7*cos(4*x)")%% 参数设置
NP = 50; %种群数量,即每一代中包含的个体数量
L = 20; %二进制数串长度,用于对个体进行编码
Pc=0.8; %交叉率,控制交叉操作的概率
Pm=0.1; %变异率
G=100; %最大遗传代数,即算法的迭代次数
Xs=10; %变量x上限
Xx=0; %变量x下限
f=randi([0,1],NP,L) ;%随机获得初始种群规模(NP*L的0-1矩阵):f= randi([区间下限,区向上限],种群规模(行数),编码长度(列数)%预分配内存,提升运行速度(可有可无)
trace1=zeros(1,G); %历代最优适应度
trace2=zeros(1,G); %平均适应度
trace3=zeros(1,G); %最小适应度
x= zeros(1,NP); %解矩阵
Fit=zeros(1,NP); %适应度矩阵
nf=zeros(NP,L); %n次迭代种群%% 遗传算法循环
for k=1:G %% 将二进制解码为定义域范围内十进制for i=1:NP U=f(i,:); %第一条染色体m=0;for j=1:Lm=U(j)*2^(j-1)+m; %将每个样本由二进制转变为十进制endx(i)=Xx+m*(Xs-Xx)/(2^L-1); %将染色体解码到定义城Fit(i) = func1(x(i)); %计算每个样本的适应度end maxFit=max(Fit); %最大值minFit=min(Fit); %最小值rr=find(Fit==maxFit); %最大值在Fit数组中的位置,返回一个数组.fBest=f(rr(1,1),:); %历代最优个体xBest=x(rr(1,1)); %最优适应度对应的染色体Fit=(Fit-minFit)/(maxFit-minFit);%归化适应度值%% 复制操作 (基于轮盘赌)sum_Fit=sum(Fit); %计算种群中所有群近应值的和fitvalue=Fit./sum_Fit; %计算每个种群的选择概率fitvalue=sum(fitvalue); %计算每个种群的累计概率ms= sort(rand(NP,1)); %随机生成_(0,1)的有序概率密度NP大小向量,对生成的随机数进行升序排序fiti=1;newi=1;while newi<=NP %这是一种随机的复制方式,但总趋势是将适应度比较大的遗传下去if ms(newi)<fitvalue(fiti) %随机新种群概率 < 种群选择概率nf(newi,:)= f(fiti,:); %新种群的第newi行=此次选择的种群newi= newi+1;elsefiti=fiti+1;endend%% 交叉操作 (基于概率)for i=1:NP-1p=rand ; %随机生成一个[0,1]的概率pif p<Pc %控制交叉的染色体总数q=randi([0,1],1,L); %随机生成要交叉的基因位置for j=1:Lif q(j)== 1 %f 此点f中值为1temp=nf(i+1,j); %记录此时选择过程中的新种群第i+1行。k列的值nf(i+1,j)=nf(i,j); %新种群第i+1行。k列的值=新种群第i行。k列的值nf(i,j)=temp; %新种群第i行,k列的值=上面记录的值,即两条相邻染色体在指定位置进行交叉endendendend%% 变异操作(基于概率)i=1;while i<=round(NP*Pm) %控制变异染色体总数h=randi([1,NP],1,1); %随机选取一个需要变异的染色体for j= 1:round(L*Pm) %控制变异染色体总数g=randi([1,L],1,1); %随机需要变异的某因数nf(h,g)=~nf(h,g);endi=i+1;endf=nf; %新一代种群f(1,:)=fBest; %保留最优个体在新种群中trace1(k)=maxFit; %历代最优适应度trace2(k)=mean(Fit); %平均适度值trace3(k)=minFit; %最小值end%% 迭代过程图形化展示
xBest;
figure
hold on
plot(1:k,trace1(1:k),'r') %历代最优适应度
% plot(1:k,trace2(1:k),'b') %平均适度值
% plot(1:k,trace3(1:k),'g') %最小值
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);
ylabel('适应度','fontsize',12);
legend('最大值','平均适应值','最小值')%% 保存为GIF
frame= getframe(gcf);
imind= frame2im(frame);
[imind,cm]=rgb2ind(imind,256);
if i==1imwrite(imind,cm,'Z1.gif','gif','Loopcount',inf,'DelayTime',0);
elseimwrite(imind,cm,'Z1.gif','gif','WriteMode','overwrite','DelayTime',0);
end%% 结果打印
fprintf('最优个体编码:\n')
disp(fBest)
% 每次迭代最优值
fprintf('每次迭代最优值:\n')
disp(trace1)
% 每次迭代的平均适应度值
fprintf('每次迭代的平均适应度值:\n')
disp(trace2)
% 每次迭代的最差值
fprintf('每次迭代最差值:\n')
disp(trace3)function y = func1(x)
%% 多极值函数
% x= 7.86 f(x)max=24.8534
y = x+10*sin(5*x)+7*cos(4*x);
end
【使用AI工具DeepSeek一键转换为Python代码】
Python代码
import numpy as np
import matplotlib.pyplot as plt
from PIL import Imagedef func1(x):return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)# 显示函数图像
x1 = np.arange(0, 10, 0.01)
y1 = func1(x1)
plt.plot(x1, y1)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('f(x)=x+10*sin(5x)+7*cos(4x)')
plt.show()# 参数设置
NP = 50 # 种群数量
L = 20 # 二进制串长度
Pc = 0.8 # 交叉率
Pm = 0.1 # 变异率
G = 100 # 遗传代数
Xs = 10 # x上限
Xx = 0 # x下限
f = np.random.randint(0, 2, (NP, L)) # 初始种群trace1 = np.zeros(G) # 历代最优适应度
trace2 = np.zeros(G) # 平均适应度
trace3 = np.zeros(G) # 最差适应度# 遗传算法主循环
for k in range(G):# 解码并计算适应度x = np.zeros(NP)Fit = np.zeros(NP)for i in range(NP):U = f[i, :]m = sum(U[j] * (2 ** j) for j in range(L)) # 二进制转十进制x[i] = Xx + m * (Xs - Xx) / (2 ** L - 1)Fit[i] = func1(x[i])maxFit = np.max(Fit)minFit = np.min(Fit)rr = np.where(Fit == maxFit)[0]fBest = f[rr[0], :]xBest = x[rr[0]]# 归一化适应度if maxFit == minFit:Fit_normalized = np.ones(NP)else:Fit_normalized = (Fit - minFit) / (maxFit - minFit)# 轮盘赌选择sum_Fit = np.sum(Fit_normalized)if sum_Fit == 0:fitvalue = np.ones(NP) / NPelse:fitvalue = Fit_normalized / sum_Fitcum_prob = np.cumsum(fitvalue)# 生成新种群nf = np.zeros_like(f)ms = np.sort(np.random.rand(NP))newi, fiti = 0, 0while newi < NP and fiti < NP:if ms[newi] < cum_prob[fiti]:nf[newi] = f[fiti]newi += 1else:fiti += 1# 交叉操作for i in range(NP - 1):if np.random.rand() < Pc:q = np.random.randint(0, 2, L)mask = q.astype(bool)# 交换相邻个体的基因temp = nf[i, mask].copy()nf[i, mask] = nf[i+1, mask]nf[i+1, mask] = temp# 变异操作num_mutants = int(round(NP * Pm))for _ in range(num_mutants):h = np.random.randint(0, NP)num_genes = int(round(L * Pm))genes = np.random.choice(L, num_genes, replace=False)nf[h, genes] = 1 - nf[h, genes]# 保留最优个体nf[0] = fBestf = nf.copy()# 记录数据trace1[k] = maxFittrace2[k] = np.mean(Fit)trace3[k] = minFit# 绘制适应度变化曲线
plt.plot(trace1, 'r', label='Max Fitness')
#plt.plot(trace2, 'b', label='Average Fitness')
#plt.plot(trace3, 'g', label='Min Fitness')
plt.xlabel('Generation')
plt.ylabel('Fitness')
plt.title('Fitness Evolution')
plt.legend()
plt.show()# 输出结果
print("Optimal solution x:", xBest)
print("Maximum fitness:", maxFit)
相关文章:
遗传算法【Genetic Algorithm(GA)】求解函数最大值(MATLAB and Python实现)
一、遗传算法基础知识 来自B站视频的笔记: 【超容易理解】手把手逐句带你解读并实现遗传算法的MATLAB编程(结合理论基础)_哔哩哔哩_bilibili 1、遗传算法 使用“适者生存”的原则,在遗传算法的每一代中,…...
MySQL 存储函数:数据库的自定义函数
在数据库开发中,存储函数(Stored Function)是一种非常有用的工具。它允许我们创建自定义的函数,这些函数可以在 SQL 查询中像内置函数一样使用,用于实现特定的逻辑和计算。本文将深入探讨 MySQL 存储函数的概念、与存储…...
【Rust自学】15.6. RefCell与内部可变性:“摆脱”安全性限制
题外话,这篇文章一共4050字,是截止到目前为止最长的文章,如果你能坚持读完并理解,那真的很强! 喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以…...
Luzmo 专为SaaS公司设计的嵌入式数据分析平台
Luzmo 是一款嵌入式数据分析平台,专为 SaaS 公司设计,旨在通过直观的可视化和快速开发流程简化数据驱动决策。以下是关于 Luzmo 的详细介绍: 1. 背景与定位 Luzmo 前身为 Cumul.io ,专注于为 SaaS 公司提供嵌入式分析解决方案。…...
数组at()方法:负索引的救赎与JavaScript标准化之路
数组at()方法:负索引的救赎与JavaScript标准化之路 从一次代码评审说起 在某次团队代码评审中,小白注意到有同事写下了这样的代码: const lastItem arr[arr.length - 1];这让我回想起自己早期开发时被负索引问题困扰的经历。今天…...
HTML<label>标签
例子 三个带标签的单选按钮: <form action"/action_page.php"> <input type"radio" id"html" name"fav_language" value"HTML"> <label for"html">HTML</label><br&…...
约瑟夫问题(信息学奥赛一本通-2037)
【题目描述】 N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M 的人出圈;…输出依次出圈的人的编号。 【输入】 输入N和M。 【输出】 输出一行,依次出圈的人的编号。 【输入样…...
二分查找题目:寻找两个正序数组的中位数
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:寻找两个正序数组的中位数 出处:4. 寻找两个正序数组的中位数 难度 8 级 题目描述 要求 给定两个大…...
【技术洞察】2024科技绘卷:浪潮、突破、未来
涌动与突破 2024年,科技的浪潮汹涌澎湃,人工智能、量子计算、脑机接口等前沿技术如同璀璨星辰,方便了大家的日常生活,也照亮了人类未来的道路。这一年,科技的突破与创新不断刷新着人们对未来的想象。那么回顾2024年的科…...
【Linux】gdb——Linux调试器
gdb使用背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 gdb使用方法 首先进入gdb gdb test_glist显示代码 断点 b 行…...
fpga系列 HDL:XILINX Vivado Vitis 高层次综合(HLS) 实现 EBAZ板LED控制(上)
目录 创建工程创建源文件并编写C代码C仿真综合仿真导出RTL CG导出RTL错误处理: 创建工程 创建源文件并编写C代码 创建源文件(Souces下的hlsv.h和hlsv.cpp,Test Bench下的test_hlsv1.cpp): hlsv1.h #ifndef HLSV1 #define HLSV1 #include &l…...
卡特兰数学习
1,概念 卡特兰数(英语:Catalan number),又称卡塔兰数,明安图数。是组合数学中一种常出现于各种计数问题中的数列。它在不同的计数问题中频繁出现。 2,公式 卡特兰数的递推公式为:f(…...
度小满Java开发面试题及参考答案 (上)
String 是基本类型吗?String、StringBuffer、StringBuilder 的区别是什么?拼接字符串有哪些做法? String 不是基本类型,它是 Java 中的一个类,属于引用类型。 下面来看看 String、StringBuffer、StringBuilder 的区别: 类型可变性线程安全性性能适用场景String不可变线程…...
Python-基于PyQt5,json和playsound的通用闹钟
前言:刚刚结束2024年秋季学期的学习,接下来我们继续来学习PyQt5。由于之前我们已经学习了PyQt5以及PyUIC,Pyrcc和QtDesigner的安装,配置。所以接下来我们一起深入PyQt5,学习如何利用PyQt5进行实际开发-基于PyQt5,json和…...
关于数字地DGND和模拟地AGND隔离
文章目录 前言一、1、为什么要进行数字地和模拟地隔离二、隔离元件1.①0Ω电阻:2.②磁珠:3.电容:4.④电感: 三、隔离方法①单点接地②数字地与模拟地分开布线,最后再PCB板上一点接到电源。③电源隔离④、其他隔离方法 …...
小识Java死锁是否会造成CPU100%?
死锁或者大量的死锁不一定会直接导致CPU占用率达到100%。以下是详细分析: 一、死锁对CPU的影响 资源占用:死锁是指两个或多个线程(或进程)在相互等待对方释放资源,导致所有涉及的线程都无法继续执行。在死锁状态下&a…...
DeepSeek R1学习
0.回顾: https://blog.csdn.net/Together_CZ/article/details/144431432?ops_request_misc%257B%2522request%255Fid%2522%253A%25226574a586f0850d0329fbb720e5b8d5a9%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id…...
激光线扫相机无2D图像的标定方案
方案一:基于运动控制平台的标定 适用场景:若激光线扫相机安装在可控运动平台(如机械臂、平移台、旋转台)上,且平台的运动精度已知(例如通过编码器或高精度步进电机控制)。 步骤: 标…...
12 款开源OCR发 PDF 识别框架
2024 年 12 款开源文档解析框架的选型对比评测:PDF解析、OCR识别功能解读、应用场景分析及优缺点比较 这是该系列的第二篇文章,聚焦于智能文档处理(特别是 PDF 解析)。无论是在模型预训练的数据收集阶段,还是基于 RAG…...
【反悔堆】【hard】力扣871. 最低加油次数
汽车从起点出发驶向目的地,该目的地位于出发位置东面 target 英里处。 沿途有加油站,用数组 stations 表示。其中 stations[i] [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处,并且有 fueli 升汽油。 假设汽车油…...
为什么应用程序是特定于操作系统的?[计算机原理]
你把WINDOWS程序复制到MAC上使用,会发现无法运行。你可能会说,MAC是arm处理器,而WINDWOS是X86 处理器。但是在2019年,那时候MAC电脑还全是Intel处理器,在同样的X86芯片上,运行MAC和WINDOWS 程序还是无法互相…...
多项日常使用测试,带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude
多项日常使用测试,带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude 注:因为考虑到绝大部分人的使用,我这里所用的模型均为免费模型。官方可访问的。ChatGPT这里用的是4o Ai对话,编程一直以来都是人们所讨论的话题。Ai的出现…...
什么是循环神经网络?
一、概念 循环神经网络(Recurrent Neural Network, RNN)是一类用于处理序列数据的神经网络。与传统的前馈神经网络不同,RNN具有循环连接,可以利用序列数据的时间依赖性。正因如此,RNN在自然语言处理、时间序列预测、语…...
Flink运行时架构
一、系统架构 1)作业管理器(JobManager) JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的JobManager所控制执行。 JobManger又包含3个不同的组件。 &am…...
网络工程师 (6)操作系统概述
一、操作系统的定义 (一)基本定义 操作系统(Operating System,简称OS)是计算机系统中至关重要的基础性系统软件。它是计算机硬件与上层软件之间的桥梁,负责管理和控制整个计算机系统的硬件和软件资源&…...
【2025年数学建模美赛C题】第1-5问F奖解题思路+高级绘图+可运行代码
基于多模型分析的奥运会奖牌预测与影响因素研究 解题思路一、问题重述二、问题分析三、模型假设与符号说明四、数据预处理五、奖牌榜预测5.1 基于LSTM长短期记忆循环神经网络的预测模型的建立5.2 模型预测结果 六、首枚奖牌预测6.1 BP神经网络的建立6.2 模型预测结果 七、各国奖…...
StarRocks 安装部署
StarRocks 安装部署 StarRocks端口: 官方《配置检查》有服务端口详细描述: https://docs.starrocks.io/zh/docs/deployment/environment_configurations/ StarRocks架构:https://docs.starrocks.io/zh/docs/introduction/Architecture/ Sta…...
RoboMaster- RDK X5能量机关实现案例(一)识别
作者:SkyXZ CSDN:https://blog.csdn.net/xiongqi123123 博客园:https://www.cnblogs.com/SkyXZ 在RoboMaster的25赛季,我主要负责了能量机关的视觉方案开发,目前整体算法已经搭建完成,实际方案上我使用的上…...
llama.cpp LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK2
llama.cpp LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK2 1. LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK22. LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK23. struct ggml_cgraph * build_deepseek() and struct ggml_cgraph * build_deepseek2()References 不宜吹捧中国大语言模型的同…...
检测到联想鼠标自动调出运行窗口,鼠标自己作为键盘操作
联想鼠标会自动时不时的调用“运行”窗口 然后鼠标自己作为键盘输入 然后打开这个网页 (不是点击了什么鼠标外加按键,这个鼠标除了左右和中间滚轮,没有其他按键了)...
