0%

strsplit 函数:   以指定的分隔符分割字符串

  C = strsplit(str);   切割后的结果是cell类型,分隔符可以是下面的任一种 {‘ ‘,’\f’,’\n’,’\r’,’\t’,’\v’}.

  C = strsplit(str,delimiter );   可以将字符串str 按指定的 分隔符进行分割.

input 函数:   请求用户输入

  x = input(prompt);   显示prompt中的文本值并等待 回车键;

  str = input(‘’,’s’);   返回输入的文本;

printf 函数: 将参数按照指定格式输出到屏幕; fprintf 函数: 可以将参数按照指定格式发送到指定文件;

  用法如下: printf(format, …); fprintf(fid, format, …)

  Octave 支持两种; matlab 仅支持 fprintf.

** matlab 数据类型及类型转换 **

1.整数型(int8, unit8, int16, uint16, int32, uint32, int64, uint64)

  可以通过intmax(class) 和 intmin(class) 返回类型的最大最小值

  范围大小: int8:-1*2^7 ~ 2^7-1; uint8: 0 ~ 2^8-1;   需要特别注意的是,当数据结果溢出后,matlab 采用饱和处理超出上下界时系统讲结果分别取为上下限; C语言出现整数溢出的时候,无符号数时会与范围进行求模,而符号数溢出时,是是未定的行为,不同的编译器可能出现不同的结果。

int32(double): 四舍五入的整形

fix() 向0取整; floor() 向下取整

round() 四舍五入取整; ceil() 向上取整

2.浮点型(single,dounle)

  分别表示单精度和双精度,使用 realmax(class) 和 realmin(class) 可以返回表示的最大值或和最小值。

3.逻辑型(logic)

4.字符型(char)

  当字符数组的字符串长度不等时,matlab 会自动填充空字符使长度相等

常见的的字符操作函数:

abs(s) 将字符串转化成ascii 码; char(num) 将ascii 码转化成字符串

blank(n) 返回n个空字符; deblank(s) 移除字符串尾部包含的空字符

(string) 将字符串作为命令执行; findstr(s1,s2) 搜索字符串

ischar(s) 判断是否为字符串; isletter(s) 判断是都为字母

lower(s) 转换为小写; upper(s) 转换为大写

strcmp(s1,s2) 比较字符串是否相同 strncmp(s1,s2,n) 比较字符串中的前n个字符串是否相同

strrep(s1,s2,s3) 将s1中的字符s2替换为s3

strfind(s1,s2) 字符串内查找字符串; 输出 s2 在 s1 中每次出现的起始索引。

5.日期和时间

6.结构

7.构建结构数组

8.元胞数组(cell)

  8.1 每个单元可以包含任意类型的数据结构;

  8.2 创建: 可以直接赋值,也可以先用cell初始化,然后再赋值;

  8.3 访问: cellVar(n) 访问的是第n个单元; cellVar{n} 访问的是第n个单元存储的内容;

  函数: cell2mat: 将cell转化成普通矩阵(cell 单元的内容类型必须相同); mat2cell: 将普通矩阵转化为cell


**说明:** 上述内容节选自以下链接,若有侵权,告知立删:

CSDN:fff2zrx matlab中cell数组用法

9.函数句柄

说明: 上述内容节选自以下链接,若有侵权,告知立删:

  iteye_13202:matlab数据类型和转换

Input 函数使用扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
clc; clear; close all;  # initialize
try
ii = 0; # count for number of input lines
while 1
ii = ii + 1;
inStr = input('','s'); # inStr: 1*m1 char
data{ii} = inStr; # data: 1*n cell,
basInfo = strsplit(data{1}); # 1*m2 cell
nStud = str2num(basInfo{1}); # 1*1 double
nOper = str2num(basInfo{2}); # 1*1 double

if ii == 2
score = str2num(inStr); # 1*m3 double
elseif ii > 2 # strOper: (n-2)*m4 cell
strOper(ii-2,:) = strsplit(data{ii});
end

while ii == nOper + 2
for jj = 1 : nOper
if strcmp(strOper(jj,1),'Q') # logic 1 or 0
indBe = str2num(cell2mat(strOper(jj,2))); # cell2char2double
indEn = str2num(cell2mat(strOper(jj,3))); # cell2char2double
maxScore = max(score(indBe:indEn)); # double
disp(maxScore);

elseif strcmp(strOper(jj,1),'U')
indPos = str2num(cell2mat(strOper(jj,2))); # cell2char2double
upgVal = str2num(cell2mat(strOper(jj,3))); # cell2char2double
score(indPos) = upgVal; # double
end
end
ii = inf; # break the inner while
end


end

catch
end

MOEAD 优化框架(契比雪夫分解方法求解最小值问题)

m: 多目标的个数

输入:

  1) N: 种群规模

  2)W: 均匀分布的权重向量,N*m

  3) T: 邻域的规模

初始化:

  1) 外部种群: EP = \varnothing

  2) 计算任意两个权重向量的欧式距离,为每个权重向量找到 T 个相邻向量 B(i); B = N*T;

  3) 产生初始种群pop 评估得到目标向量 FV

  4) 初始化参考点 Z* (最小化问题, Zi*=min(FVi))

迭代:

  种群成员遍历:

    1) 根据当前成员的邻域内任意两个成员产生新得子代

    2)若子代超出边界则调整进边界内

    3) 更新参考点Z*(替换为任意子代更小目标值)

    4) 更新邻域内成员(如果子代的目标切比雪夫分解值小于父本的值,则子代替换父本)

    5)从EP中删除被子代目标值所支配的所有成员; 如果没有子代目标值不能被任一成员支配,则将子代添加进EP

满足终止条件输出EP。

2020.7.17

问:目前是否有适用于具有混合连续-离散型决策变量的多目标优化问题的测试集?

答:没有,测试集的编码就是单一的。混合编码并不会提升难度,没有太大意义。

2020.10.12

问: 多峰和多模有什么区别?

答: 英文表达都一样,没有区别。 只是多峰一般指局部解很差不能留,而多模都要留着。

  通过近一整天的debug发现,python 中的 numpy.sort() 函数与 matlab 中的 sort() 函数的默认排序方法不同,从而也导致了当待排序的数组中存在多个相同数值时最后的排序结果也不尽相同。

  当待排序的数组有多个可以排序的属性后,使用 matlab 中的 sort() 函数经过不同属性的多次排序后,可以得到想要的多个属性排序后排列数组(主要体现在数值相同的情况下); 而 python 中的 numpy.sort() 中快速排序、 归并排序和堆排序则达不到这个效果。

  sort()函数的三种排序方法都是不稳定排序,因此python 可以考虑使用稳定的 sorted() 函数。 如果要返回稳定排序后的下标,可以在sorted()函数内部使用enumerate()函数。

1
2
3
itemSorted = sorted(emuerate(item), key=lambda x:x[1])
index = [ii[0] for ii in itemSorted]
val = [jj[1] for jj in itemSorted]

部分内容节选自以下链接,侵权无意,告知立删:

sbj123456789: python中sorted排序后返回同时返回下标

安装过程

基本上参照以下两个链接可以完成安装,这里总结一下需要注意的几个地方:

第一: 设置密码后,登录名称是“root”,密码为你自己设置的密码;

第二: 修改内容的命令不是 “vim”, 而是 “vi”;

第三: 设备的名称不要改

第四: 修改具体内容,一般是进入目录后,按 “i键” 或者是 “insert”, 然后移动光标进行修改,修改完成后,保存退出,先按“Esc”,然后键入“:wq!”即可;

阅读全文 »

计算机基础

排序

排序算法的复杂度

The complexity of sorting algorithm

二叉树:

树:不包含回路的连通无向图

二叉树:特殊的树,不为空则有根节点,左子树与右子树组成

满二叉树: 每个分支节点都有左子树和右子树,所有叶子都在同一层上。

完全二叉树: 从右向左减少叶子节点的满二叉树。

堆排序:

堆:一种特殊的完全二叉树

大顶堆:所有父节点都大于等于子节点

小顶堆:所有父节点都小于等于子节点

推的存储: 从上到下,从左到右,父节点编号为k,左儿子编号为2k,右儿子编号为2k+1.

堆排序的基本思想:将序列构成大顶推,将根节点与末尾元素进行交换; 将剩余n-1个元素重新构造堆,反复执行,得到有序序列。

说明:内容节选自以下链接,若有侵权,告知立删

MaxineZhou:什么是堆以及堆排序原理

dreamcatcher-cx:图解排序算法(三)之堆排序

编程题

题1

来源:牛客网 链接:车站建造问题

有10^8个村庄排在一条公路上,依次编号为010^8-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0an-1,其中保证a0=0.
现在需要建设车站,有两个要求必须被满足:
1、每个有牛牛居住的村庄必须修建车站。
2、相邻车站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设车站的最小数量。

解题思路来源于牛客网用户_hzy1721: 车站数最少为n, 若相邻车站的距离不是1或者质数,则在中间插入一个或多个车站,使得距离为1或者质数;该题等同于把一个非素数分解为素数的个数,考核内容为哥德巴赫猜想

像素,分辨率,英寸(厘米)的区分

像素: 构成图片的小色点。

分辨率: dpi(Dots Per Inch),即是每英寸上像素的数量,也就是小色点的分布密度。

实际尺寸(英寸)= 像素/分辨率, 1英寸=2.54厘米。

说明: 内容节选自以下链接,无意侵权,告知立删。
改图宝:图片像素尺寸(厘米/英寸)换算器、在线转换

将数据从 matlab 导入到 origin

Matlab 准备: 属性->快捷方式->目标-> 后面填加 /Automation 和 /desktop,如:

1
"C:\Program Files\MATLAB\R2019a\bin\matlab.exe" /Automation /desktop

运行 matlab 程序,得到相关变量

打开Origin, Tools->Matlab Console-> gc 变量, 如:

1
gc data

说明: 上述内容整理自以下链接,侵权无意,告知立删。

leonSUST: 画图技巧 : 让Matlab将数据传送给Origin

Book 填入等差数据

先写入前三个数据,选中后, 按住 Alt 键后下拉

什么是python

Python是“一种解释型的,面向对象的,带有动态语义的高级程序设计语言”。

定义一个3*3的矩阵

1
2
import numpy as np
X= np.array([[1,2,3],[4,5,6],[7,8,9]])

spyder 注释

注释/反注释:

1
Ctrl + 1

块注释/块反注释

1
Ctrl + 4/5

Pyhon 安装完成后,命令提示符” ‘python’ 不是内部或外部命令,也不是可运行的程序”:

原因: python的安装路径没有填加到环境变量。

命令提示符不能进入到指定的路径:

首先

1
cd ..

退回到 C:盘符,然后进入目标盘符,再然后进入到目标路径。

测试函数模块 optproblems的安装

1
pip install optproblems

统计运行时长

1
2
3
4
5
import time
start = time.time()
main_function()
end = time.time()
print str(end-start)

使用plot 画图

1
2
3
import random
import matplotlib.pyplot as plt
data = random.uniform()

读取 .pf 文件

1
2
3
4
5
6
7
8
9
import numpy as np
source = open("ZDT1.pf", "r",encoding='utf-8')
values = source.readlines()

data = np.zeros(shape=(len(values),2))
for index, value in enumerate(values):
dataTmp= value.split()
data[index,0] = float(dataTmp[0])
data[index,1] = float(dataTmp[1])

对数组先平方再求和

1
2



python学习第一讲:使用pycharm 运行第一个python程序

准备工作:为pycharm 设置 python 解释器

1). 什么是python 解释器:
python解释器是“帮助我们将python代码交给机器可以执行的工具”。

2). Python 解释器的作用:
通俗来讲,解释器是将源码转化成字节码(机器不能执行),再由python中的虚拟机来执行这些字节码(字节码不依赖操作系统,因此可以由虚拟机来实现跨平台运行)。

具体介绍可参见下面链接:
田阅川:Python解释器详解

补充: 解释型语言与编译型语言辨析

共同目标:将我们认识的语句(循环、判断等)转化成二进制代码,然后交给计算机执行。

区别: 编译型语言在程序写完以后,把代码完全翻译成二进制文件,通过执行二进制文件来执行程序;生成的二进制文件可以直接执行。 解释型语言没有转化为二进制代码的过程,需要的时候再编译;因此解释型语言需要随时带着解释器。

知乎玖玖:python解释器到底是什么?


3). pycharm 设置python解释器步骤:

  File-> Setting-> Project: pythonProject (Python interpreter) -> 点击右面的设置,点击Add -> 在Existing enviroment下定位到Python安装路径,找到python3.7.exe,勾选适用于所有项目, 点击 Apply 就可以了。

python 文件读写

写文件

1
2
3
4
f = open("temp.txt","a")
f.write("Hello, world!\n")
f.write("Today is a sunny day!\n")
f.close()

读文件

1
2
3
4
f = open("temp.txt")
lines = f.readlines()
print(lines[0])
f.close()

  1. “.cpp” 文件是”C++”语言的文件,国际一般读作”C Plus Plus”,因此后缀为”.cpp”.

  2. python 调用C/C++的方法有: boost.python, swig, ctypes, pybind11 等方法。

  3. pybind11 是一个只包含头文件的库,语法与目标非常像Boost.Python; Boost.Python 兼容所有的C++编译器,Pybind11 只支持Python2.7以上和C++ 11以上的编译器。

  4. 使用Pybind11, 需要支持C++11标准的编译器(VS2015以上),还需要下载CMake.

  5. CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装;可以输出各种各样的makefile或者project文件,只是它的组态档取名为 CMakeLists.txt。

  6. CMake 在windows 上编译C++的简单使用
    1)CMake安装好以后,编写一个简单.cpp程序;
    2)在cpp文件相同目录下建立一个CMakeLists.txt文件,例如:

    1
    2
    3
    cmake_minimum_required (VERSION 2.6)
    project (HelloWorld)
    add_executable (HelloWorld HelloWorld.cpp)

    3)到CMakeLists.txt文件的目录,运行CMake:

    1
    cmake .

    4) 生成.sln, .vcxproj文件,可以使用VS打开.sln文件来编译,运行,调试程序。
    5)构建程序

    1
    msbuild Helloworld.sln

    就可以在Debug目录下找到HelloWorld.exe 程序。

  7. Pybind11 是header-only,因此不需要编译动态链接库,直接使用include 就可以。
    1) VS2017新建 C++ 空白工程

    项目属性页->常规->调整输出类型为dll, 调整输出文件名为pyd;
    
    项目属性页->VC++目录->包含目录->(Anaconda3\include,Pybind11\include),库目录(Anaconda3\libs);
    
    项目属性页->链接器->输入->附加依赖项->手动输入(python36.lib,python3.lib)

    2)添加源文件,添加头文件,编译,运行,生成.pyd文件

    3)复制.pyd文件到要引用相同目录下,直接import就可以使用

说明: 以上内容整理自以下链接,侵权无意,告知立删。

fitzzhang:python调用C++之pybind11入门

boonya:使用cmake在Windows上编译c++

kupe87826:Pybind11实现python调用c++