vb与matlab混合编程
‘壹’ vb.net2010与matlab联合编程的问题。
这个混合编程有多种方式,关键是怎么来连接。
目前常用的方法有:
1)dll动态链接库
2)VB 利用shell () 函数调用MATLAB 应用程序
3)动态数据交换(DDE)
4)ActiveX自动化服务技术
其中,
1)可以脱离matlab系统,但是需要注册该dll文件。运行速度较快。
2)中程序的运行脱离不了MA TLAB 环境, 无法开发出独立的可执行程序,难以用于商业目的。
3)其实是把matlab当做vb的一个客户端,进行数据交换,这明显不能脱离matlab系统。
4)中所编制的程序并没有脱离MA TLAB 环境, 需要在机器上安装好MA TLAB 系统。
‘贰’ matlab 和VB如何结合的
一、借助 ActiveX部件
没什么好说的
二、借助DDE技术
DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼
此间的通信。类似于C/S模型
三、通过M文件
Matlab产生的M文件不能直接在VB中调用,可利用mcc将M文件直接编译成.EXE文件,
然后在VB中声明传说中的三个API函数,最后使用Shell命令即可实现VB与Matlab的无缝集
成。
四、引入MatrixVB
MatrixVB是MathWorks针对VB提供的一个Matlab库,为VB提供了强大的功能扩展。在VB中使用该数学工具包可避免重复性劳动,从而减少开发人员实现算法和界面设计的困难。
具体的怎么实现,不是一两句话讲得明白的,最关键的是你一分都不给啊!^_^
(其实,按我上面说的关键字,网上搜一下一大堆!)
‘叁’ 怎样在VB6.0调用MATLAB
大概有四种方法可以实现:1.借助ActiveX组件。需要先从MATLAB客户端创建ActiveX控件。可以使用图形用户界面或之间使用命令actxcontrol函数。2.借助DDE技术。以MATLAB作为服务器端。3.通过M文件。先用mcc将M文件直接编译成exe文件,然后在VB中声明几个API函数。4.引入matrix。即针对VB的MATLAB库。
‘肆’ 用VB或者MATLAB在一个矩形内生成一个固定点和几个随机点,再求出从固定点经过所有随机点回来后的最短路径
这个并非一般的最短路径问题,而是旅行商问题(Traveling Saleman Problem,TSP)。旅行商问题属于NP完全问题,如果问题规模比较大,至今没有太有效的算法。
这里提供一个蚁群算法的程序,参考:
http://..com/question/175608123.html
根据你的问题做了少量改动,具体代码如下:
functionTSP
%TSP旅行商问题
%设置初始参数如下:
m=10;Alpha=1;Beta=5;Rho=0.1;NC_max=200;Q=100;
%生成随机点,第一个点视为固定点
C=[0.50.5];
C(2:10,:)=rand(9,2);
%调用蚁群算法求解
[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q);
function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%=========================================================================
%%ACATSP.m
%%
%%ChengAihua,,ZhengZhou,China
%%Email:[email protected]
%%Allrightsreserved
%%-------------------------------------------------------------------------
%%主要符号说明
%%Cn个城市的坐标,n×2的矩阵
%%NC_max最大迭代次数
%%m蚂蚁个数
%%Alpha表征信息素重要程度的参数
%%Beta表征启发式因子重要程度的参数
%%Rho信息素蒸发系数
%%Q信息素增加强度系数
%%R_best各代最佳路线
%%L_best各代最佳路线的长度
%%=========================================================================
%%第一步:变量初始化
n=size(C,1);%n表示问题的规模(城市个数)
D=zeros(n,n);%D表示完全图的赋权邻接矩阵
fori=1:n
forj=1:n
ifi~=j
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
else
D(i,j)=eps;
end
D(j,i)=D(i,j);
end
end
Eta=1./D;%Eta为启发因子,这里设为距离的倒数
Tau=ones(n,n);%Tau为信息素矩阵
Tabu=zeros(m,n);%存储并记录路径的生成
NC=1;%迭代计数器
R_best=zeros(NC_max,n);%各代最佳路线
L_best=inf.*ones(NC_max,1);%各代最佳路线的长度
L_ave=zeros(NC_max,1);%各代路线的平均长度
whileNC<=NC_max%停止条件之一:达到最大迭代次数
%%第二步:将m只蚂蚁放到n个城市上
Randpos=[];
fori=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游
forj=2:n
fori=1:m
visited=Tabu(i,1:(j-1));%已访问的城市
J=zeros(1,(n-j+1));%待访问的城市
P=J;%待访问城市的选择概率分布
Jc=1;
fork=1:n
iflength(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面计算待选城市的概率分布
fork=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原则选取下一个城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
ifNC>=2
Tabu(1,:)=R_best(NC-1,:);
end
%%第四步:记录本次迭代最佳路线
L=zeros(m,1);
fori=1:m
R=Tabu(i,:);
forj=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=Tabu(pos(1),:);
L_ave(NC)=mean(L);
NC=NC+1
%%第五步:更新信息素
Delta_Tau=zeros(n,n);
fori=1:m
forj=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
%%第六步:禁忌表清零
Tabu=zeros(m,n);
end
%%第七步:输出结果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:)
Shortest_Length=L_best(Pos(1))
%绘图显示结果
clf
subplot(1,2,1)
DrawRoute(C,Shortest_Route)
subplot(1,2,2)
plot(L_best)
holdon
plot(L_ave)
functionDrawRoute(C,R)
%%=========================================================================
%%DrawRoute.m
%%画路线图的子函数
%%-------------------------------------------------------------------------
%%CCoordinate节点坐标,由一个N×2的矩阵存储
%%RRoute路线
%%=========================================================================
%原来的绘图语句太繁琐,改用这一句就可以了
plot(C([RR(1)],1),C([RR(1)],2),'o-')
%标明固定点
holdon
plot(C(1,1),C(1,2),'ro')
由于点是随机生成的,每次运行的结果都不同,下面是某次运行的结果(红点为固定点)。
‘伍’ vb.net调用matlab
Matlab产生的M文件不能直接在VB中调用,可利用mcc将M文件直接编译成.EXE文件,然后在VB中声明下面三个API函数,最后使用Shell命令即可实现VB与Matlab的无缝集成。
1. 用mcc生成独立的外部应用程序。可使用如下两种命令:
mcc -p file.m 或 mcc -m file.m
2. 在VB中声明调用的三个API函数:
● Declare Function WaitForSingleObject Lib “kernel32”(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
● Declare Function CloseHandle Lib “kernel32”(ByVal hObject As Long) As Long
● Declare Function OpenProcess Lib “kernel32”(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long
3. 示例代码:
Dim lTask As Long, lret As Long, lHandle As Long
’执行file.exe文件
lTask = Shell(“file.exe”, vbNormalFocus)
lHandle = OpenProcess(SYNCHRONIZE, False, lTask)
’等待进程执行完毕
lret = WaitForSingleObject(lHandle, INFINITE)
lret = CloseHandle(lHandle)
’ file.exe文件执行完毕后,继续执行应用程序
……
通过以上编码,应用程序可以在执行过程中调用.EXE完成特定的计算或图形功能后,再继续其执行过程,从而实现与Matlab的集成。