Matlab中TCP通信-实现外部程序提供优化目标函数解

版权声明:若无来源注明, Techie亮博客文章均为原创。 转载请以连接形式标明本文标题和地址:
本文标题:Matlab中TCP通信-实现外部程序提供优化目标函数解     本文地址: http://techieliang.com/2017/12/551/

1. 介绍

TCP如此经常使用的通信功能,matlab天然也是支持的。而在用途方面也有不少,好比matlab优化问题中目标函数能够是其余程序的运算结果,此时须要动态的每次优化调用其余程序,这时可使用tcp实现两程序之间的数据交互,由matlab的优化工具箱提供每次优化的设计变量值,有某程序提供基于设计变量得出的运算结果值做为目标函数的解。linux

2. TCP使用方法

Matlab 对TCP的封装很好,只有在创建和关闭tcp须要专用的函数,其余操做均与文件操做彻底一致。算法

下面先给出一个用于优化的范例:windows

主脚本:数组

  1. clc;clear;
  2. %开启tcp
  3. global mtcpip %用全局变量方便优化函数中使用tcp
  4. global circle_number
  5. circle_number=0;
  6. mtcpip=tcpip('127.0.0.1', 8000);
  7. fopen(mtcpip);
  8. fwrite(mtcpip,['Matlab Connect in',char(13), char(10)])
  9. %优化算法--
  10. current_value = [123123 123123 123123 123321 123123 123123 13 123123 123123];
  11. lb=[];
  12. ub=[];
  13. new_error = fmincon(@matlab_function,current_value,[],[],[],[],lb,ub);%优化
  14. % 优化技术-关闭tcp
  15. fwrite(mtcpip,['Matlab Disconnect',char(13), char(10)])
  16. fclose(mtcpip);
  17. delete(mtcpip);

优化函数:app

  1. function [ f ] = matlab_function( x )
  2. global mtcpip
  3. global circle_number
  4. circle_number=circle_number+1;
  5. x_size = size(x);
  6. send_text=['matlabvalue--'];
  7. for i=1:1:x_size(2)
  8. if i==x_size(2)
  9. send_text=[send_text,num2str(x(i),'%.4f'),char(13), char(10)];
  10. else
  11. send_text=[send_text,num2str(x(i),'%.4f'),';'];
  12. end
  13. end
  14. fwrite(mtcpip,send_text);
  15. while 1
  16. A = fread(mtcpip, 20);
  17. text = char(A);
  18. text_size = size(text);
  19. if text_size(1)<2
  20. continue;
  21. end
  22. if text(1) == 'm' && text(2) == 'r'
  23. text=text';
  24. text = strrep(text,'@','');//符号替换
  25. text = strrep(text,'mr','');
  26. text = strrep(text,'#','');//删除末尾多余的占位符,我用#做为占位符了
  27. f = str2double(text);
  28. ['circle one begin',num2str(circle_number,'%.4f')]
  29. break;
  30. end
  31. end
  32. end

此范例的优化函数中利用一个while 1实现了阻塞,会不断的循环等待其余程序算出结果后成功接收到结果才完成单步优化计算。我设定告终果的固定表示格式tcp

“mrXXXXXX###########@”消息总长度为20,末尾为@做为结束符,mr做为开头,XXXX为消息实际内容,#为占位符,以此方式保证每次发送消息均为20长度,同时能够经过数据头的mr肯定收到的内容是否是传给matlab的结果文件(若多个tcp通信须要作此判断防止发送错误,致使后续结果计算错误),只有当结果均计算正确,才目标函数返回值赋值为接收到的结果,并break进入下一次优化迭代函数

2.1. 建立tcp

tcpip()函数建立一个tcp对象,能够在matlab中用help tcpip查到帮助,上述范例为开启客户端。对于目标主机ip能够用’localhost’代替127工具

注意此函数第三项参数用来配置为服务端仍是客户端,若不写默认为客户端post

注意开启完成后的返回值必定要保存,后续开启、收发和关闭均须要使用,此处由于须要跨多个m文件使用此tcp因此设置为了全局变量优化

2.2. 开启tcp

fopen便可,参数传入tcp对象

2.3. 关闭tcp

fclose? 就能够关闭一个已经开启的tcp了,参数传入tcp对象

建议用delete释放tcp对象的内容

2.4. 收发

启动tcp之后,matlab支持直接用文件读写的方式进行tcp消息收发,直接使用fwrite、fread便可,第一个参数要传入开启tcp对象

3. 其余

3.1. matlab发送回车,换行符的方法

matlab不支持在字符串中用\n实现换行,可是能够直接发送对应ASCII码,能够经过char(13), char(10)实现换行的发送,注意这两个对应的是\r\n,windows中是用\r\n实现换行,若linux直接发送\n的10便可。

3.2. matlab字符串链接

很简单[send_text,num2str(x(i),’%.4f’),char(13), char(10)],直接用行向量数组便可,自己matlab就是用char数组表示字符串的

3.3. 接收数据为列向量,转行向量方法

直接text=text’;便可,和矩阵操做同样

别用string()去强制字符串,matlab中自己就是用char数组表示字符串,没有单独的字符串概念,转换完也没区别

3.4. 字符串处理-替换

text = strrep(text,’@’,”);实现了吧text中的全部@删除,上述范例是由于发送来的数据是固定的格式,对格式作预处理

因为matlab接收tcp消息是按照固定长度,因此发送端若发送的内容不够长,能够在后面加占位符,matlab接收到之后删除占位符便可

3.5. 接收长度限制

A = fread(mtcpip, 20);

此函数指定了接收的长度,若消息发送的长度不够,会一直阻塞,直到超时之后才会接收已有的为知足长度要求的数据,为了保证当即接收,建议发送数据末尾用占位符,接收到之后再替换掉。

转载请以连接形式标明本文标题和地址: Techie亮博客 » Matlab中TCP通信-实现外部程序提供优化目标函数解
相关文章
相关标签/搜索