静止背景下的多目标追踪(附matlab程序)

静止背景下的多目标追踪

随着计算机技术以及智能汽车行业的发展,多目标的检测与追踪的实用性与研究价值逐渐提高。在计算机视觉的三层结构中,目标跟踪属于中间层,是其他高层任务,例如动作识别以及行为分析等的基础。其主要应用可包括视频监控,检测异常行为人机交互,对复杂场景中目标交互的识别与处理,以及虚拟现实及医学图像。

目标跟踪又包括单目标跟踪和多目标跟踪。单目标跟踪可以通过目标的表观建模或者运动建模,以处理光照、形变、遮挡等问题,而多目标跟踪问题则更加复杂,除了单目标跟踪回遇到的问题外,还需要目标间的关联匹配。另外在多目标跟踪任务中经常会碰到 目标的频繁遮挡、轨迹开始终止时刻未知、目标太小、表观相似、目标间交互、低帧率等等问题。

静止背景下的多目标追踪可分为两步来实现,第一步是在视频文件的每帧中检测出移动的目标,第二步是将检测到的目标与跟踪轨迹实时匹配。在本次实验中,利用混合高斯模型进行背景减除,使用形态学操作消除噪声,通过卡尔曼滤波预测目标位置,最后利用匈牙利算法进行匹配,实现静止背景下的多目标追踪。

1 实验原理

1.1 混合高斯模型

单高斯模型是利用高维高斯分布概率来进行模式分类:

11()exp[(x )(x )]

2T x N C μσμ-=--- 其中μ用训练样本均值代替,σ用样本方差代替,X 为d 维的样本向量。通过高斯概率公式就可以得出类别C 属于正(负)样本的概率。

而混合高斯模型就是数据从多个高斯分布中产生,每个GMM 由k 个单高斯分布线性叠加而成。相当于对各个高斯分布进行加权,权系数越大,那么这个数据属于这个高斯分布的可能性越大。

(x)(k)*p(x |k)P p =∑

利用混合高斯模型(GMM)可以进行背景减除,将前后景分离,得到移动的目标。对每个像素点建立由k 个单高斯模型线性叠加而成的模型,在这些混合高斯背景模型中,认为像素之间的颜色信息互不相关,对各像素点的处理都是相互独立的。单个像素点在t 时刻服从混合高斯分布概率密度函数:

,,,1

(x )(x ,,)k

t i t t i t i t i p w ημτ==∑

其中k 为分布模式总数,

,,(x ,,)t i t i t ημτ为t 时刻第i 个高斯分布,,i t μ为其均值,,i t τ为其协方差矩阵。

在获得新一帧图像后更新混合高斯模型。用图像中的每个像素点与混合高斯模型匹配,如果成功则判定该点为背景点, 否则为前景点。当背景更新完成后,高

斯模型与背景相关程度越大,标准差就越小,权值越大。按照权值与标准差的比值从大到小进行排序,取前B 个模型作为背景。

1arg min b k k B w T =????=> ? ????

?∑

1.2 卡尔曼滤波

卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。其核心思想是,根据当前的测量值、上一时间的预测值以及误差,计算得到当前值,并可以持续预测下一时间的值。

试验中利用卡尔曼滤波计算并预测每个轨迹在下一帧中的位置,建立帧间轨迹的关系。卡尔曼滤波将跟踪分为5种状态:新目标出现、目标匹配、目标遮挡、目标分离以及目标消失。其状态方程如下所示:

(k 1)(k 1,)(k)(k)(k)[x(k),y(k),w(k),h(k),v(k)]

X A k X c X +=++= 其中x,y,w,h 分别表示目标外接矩形的横纵坐标以及长、宽,c(k),(k)v 为不相关的高斯白噪声。

定义其观测方程为(k)H(k)X(k)(k)Z v =+。

定义好了观测方程与状态方程之后就可以用卡尔曼滤波器实现运动目标的跟踪,步骤如下: 1)计算运动目标的特征信息(运动质心,以及外接矩形)。

2)用得到的特征信息初始化卡尔曼滤波器。

3)用卡尔曼滤波器对下一帧中对应的目标区域进行预测,当下一帧到来时,在预测区域内进行目标匹配。

4)如果匹配成功,则更新卡尔曼滤波器。

1.3 匈牙利匹配算法

匈牙利匹配算法是一种利用增广路径求取二分图最大匹配的算法。匈牙利树一般由宽度优先搜索(BFS )构成。从一个未匹配点出发运行 BFS ,且必须走交替路,直至不能再扩展为止。交替路指的是,从一个未匹配点出发,依次经过非匹配边、匹配边...循环往复,形成的路径称为交替路。

示意图如图1所示:

图1 匈牙利树匹配

匈牙利算法的要点如下:

1)从左边第一个顶点开始,挑选未匹配点进行搜索,寻找增广路。

2)如果经过一个未匹配点,则寻找成功。更新路径信息,匹配变数+1,停

止搜索。

3)如果一直没有找到增广路,则不再从这个点开始搜索。

4)找到增广路之后需要沿着路径更新匹配,通过prev 数组来记录路径上的

点。

在实验中,用匈牙利算法将新一帧图片中检测到的运动物体匹配到对应的轨

迹。匹配的过程是通过最小化卡尔曼预测得到的质心与检测到的质心之间的欧氏

距离之和实现的。

通过卡尔曼滤波计算并预测每个轨迹在下一帧中的位置,然后计算预测的轨

迹位置和每个新检测到的目标之间的欧几里得距离,将度量结果作为损失函数矩

阵。损失矩阵的大小为(M,N),其中M是轨迹数目,N是检测到的运动物体数

目。

2 实验内容

2.1 目标检测

要实现目标检测,首先利用混合高斯模型区分前景背景。通过调用函数

vision.ForegroundDetector设置检测子为混合高斯模型,其中参数分别为高斯

核数目、训练背景帧数以及背景阈值。函数的返回值为一个二进制掩码,其中1

的像素值对应前景,0的像素值对应背景。在实验中,选取前150帧图像作为背

景帧,并设置阈值为0.6,高斯核数目为3。

完成背景减除后,通过设置blob分析子来寻找连通域,函数设置的参数为最

小区域面积,返回值为目标面积、质心和边界框。实验中,设置最小区域面积为400,代码如下所示:

obj.detector = vision.ForegroundDetector('NumGaussians', 3, ...

'NumTrainingFrames', 150, 'MinimumBackgroundRatio', 0.6);

obj.blobAnalyser = vision.BlobAnalysis('BoundingBoxOutputPort', true,'AreaOutputPort', true, 'CentroidOutputPort', true,

'MinimumBlobArea', 400);

完成混合高斯混合模型以及blob分析子后,逐帧读取视频,为后续目标检

测以及追踪的过程做准备:

frame = obj.reader.step();

在检测目标的过程中,利用形态学运算中的开运算以及闭运算可以消除噪声,使目标检测更为准确。开运算是通过先腐蚀再膨胀,去除孤立的像素点、总的位置和结构不变。而闭运算是先膨胀再腐蚀,弥合小裂缝,而总的位置和形状不变,通过填充图像的凹角来滤波图像。其效果如图2所展示:

图2.1 原始像素点图2.2 开运算效果图

图2.3 闭运算效果图

图2 形态学运算效果图

实验中,首先使用检测子,即混合高斯模型得到前景图,对前景图使用8*8矩形进行开运算,切断临近物体间的联系。再使用15*15矩形进行闭运算,消除细小物体,最后填补物体中间的空洞。滤除噪声后,使用blob分析得到所有连通域的中心以及边界框的大小。代码如下所示:

function [centroids, bboxes, mask] = detectObjects(frame)

% Detect foreground.

mask = obj.detector.step(frame);

% Apply morphological operations to remove noise and fill in holes. mask = imopen(mask, strel('rectangle', [8,8]));

mask = imclose(mask, strel('rectangle', [15,15]));

mask = imfill(mask, 'holes');

% Perform blob analysis to find connected components.

[~, centroids, bboxes] = obj.blobAnalyser.step(mask);

end

视频中对移动目标的检测结果如图3.1,图3.2所示:

图3.1 移动目标检测结果1

图3.2 移动目标检测结果2

2.2 目标跟踪

要进行目标跟踪,首先需要进行轨迹初始化,通过函数initializeTracks()来进行初始化,每一个轨迹代表视频中一个移动的目标。轨迹的结构包含如下信息:

1)ID,轨迹编号;

2)Bbox,目标的边界框;

3)kalmanFilter,用于预测目标位置的卡尔曼滤波器;

4)Age,目标被检测到的总帧数;

5)totalVisibleCount,目标可被检测到的全部帧数;

6)consecutiveInvisibleCount:连续未检测到目标的帧数。

代码如下所示:

function tracks = initializeTracks()

% create an empty array of tracks

tracks = struct(...

'id', {}, ...

'bbox', {}, ...

'kalmanFilter', {}, ...

'age', {}, ...

'totalVisibleCount', {}, ...

'consecutiveInvisibleCount', {});

end

为消除噪声对目标追踪的影响,仅在totalVisibleCount超过阈值时才显示目标的轨迹。当连续几帧没有检测到与跟踪相关的信息时,则假设该对象已经离开了可视图画面。通过参数consecutiveinvisiblecount可判断这种情况,当其超过阈值时,删除跟踪轨迹。如果跟踪时间较短,并且在大多数帧中标记为不可见,那么轨迹也可能作为噪声被删除。

轨迹初始化完成后,通过卡尔曼滤波计算并预测每个轨迹在下一帧的位置,函数输出为边框预测中心。然后调整目标边界框的位置,使其中心到达预测位置,并将结果作为轨迹的跟踪矩形框,代码如下所示:

function predictNewLocationsOfTracks()

for i = 1:length(tracks)

bbox = tracks(i).bbox;

% Predict the current location of the track.

predictedCentroid = predict(tracks(i).kalmanFilter);

%根据以前的轨迹,预测当前位置

% Shift the bounding box so that its center is at

% the predicted location.

predictedCentroid = int32(predictedCentroid) - bbox(3:4) / 2; tracks(i).bbox = [predictedCentroid, bbox(3:4)];

end

end

完成位置预测后,创建损失函数矩阵,航代表轨迹,列代表检测到的目标。损失矩阵的大小为(M,N),其中M是轨迹数目,N是检测到的运动物体数目。对每个轨迹计算其卡尔曼滤波预测的轨迹位置和每个新检测到的目标之间的欧几里得距离,将度量结果作为损失函数矩阵。

function [assignments, unassignedTracks, unassignedDetections] = ... detectionToTrackAssignment()

nTracks = length(tracks);

nDetections = size(centroids, 1);

% Compute the cost of assigning each detection to each track.

cost = zeros(nTracks, nDetections);

for i = 1:nTracks

cost(i, :) = distance(tracks(i).kalmanFilter, centroids); end

通过函数assignDetectionsToTracks(cost, costOfNonAssignment)利用匈牙利匹配算法将新一帧图片中检测到的运动物体匹配到对应的轨迹。其中输入的参数为损失矩阵以及阈值,低于阈值时,取消匹配。返回值为匹配的结果以及未匹配成功的轨迹以及目标。

完成匹配后,对已分配的轨迹,将其更新至当前帧目标所在位置,对未分配的轨迹,增加其连续不可见帧数。设置两个阈值,invisibleForLong代表当连续不可见帧数大于它时,删除轨迹;ageThreshold代表当总出现帧数小于它时,当该参数与总可见帧数的比值小于0.6时,删除轨迹。

目标检测与轨迹跟踪的操作循环进行,直至视频结束,显示最终跟踪结果。

2.3 总结

实验程序可分解为11个部分,创建系统对象、初始化轨迹、读取视频帧、检测目标、预测已跟踪轨迹的新位置、分配新检测目标给轨迹、更新已分配的轨迹、更新未分配的轨迹、删除丢失的轨迹、创建新轨迹以及显示跟踪结果。

其中创建系统对象包含创建视频对象,设置检测子为高斯混合模型以及设置blob分析子。在预测已跟踪轨迹的新位置时,使用卡尔曼滤波器进行预测,并调整位置,显示预测结果矩形框。在更新已分配的轨迹部分中,根据轨迹对应的检测目标位置中心修正其卡尔曼滤波器,并修正轨迹存在帧数、目标检测到的总帧数以及连续未检测到目标的帧数。在删除丢失轨迹中,删除连续不可见帧数大于阈值或当轨迹存在帧数小于10时,根据总可见帧数与轨迹存在帧数的比值丢弃轨迹。

主函数代码如下:

obj = setupSystemObjects(); %创建系统对象

tracks = initializeTracks(); % 初始化轨迹

nextId = 1; % ID of the next track

% Detect moving objects, and track them across video frames.

while ~isDone(obj.reader)

frame = readFrame(); %读取一帧

[centroids, bboxes, mask] = detectObjects(frame);

predictNewLocationsOfTracks();

[assignments, unassignedTracks, unassignedDetections] = ...

detectionToTrackAssignment();

updateAssignedTracks();

updateUnassignedTracks();

deleteLostTracks();

createNewTracks();

displayTrackingResults();

end

可见完成创建系统对象以及初始化轨迹后,循环剩余9个步骤,直至处理完整个视频。

3 实验结果分析

在本次试验中,通过混合高斯模型背景减除,形态学操作消除噪声,利用卡尔曼滤波预测每个轨迹在下一帧中的位置,最后通过匈牙利匹配算法完成目标与轨迹之间的匹配。实现了在静止背景下的多目标检测与跟踪。

如图4所示可见,对于匀速移动的目标,检测效果较好,可以实现较好的目标检测与跟踪。

图4 匀速移动目标检测结果

但静止背景下,基于动态的多目标追踪,很容易受到环境的影响。当检测目标为行人时,风吹动树叶或是有车辆经过,甚至是光照导致的影子变化都会很大程度地影响跟踪效果。图5展示了明显的失败样例:

图5 目标追踪失败样例

在实验中使用的卡尔曼滤波预测目标下一帧所在位置的模型,只适用于匀速变化,而汽车存在加速运动。从右边的二值图像可以看出,汽车的车灯造成像素点大量变化,只使用帧间相减以及形态学操作来得到检测目标的本实验并不适用于此。造成了较大的误差,导致检测以及跟踪目标失败。要规避由前景中不同物体造成的实验误差,可使用其他方法在前景检测中对检测到的物体进行分类。

通过多次试验发现,程序参数的鲁棒性较差,在进行形态学计算时,不同的视频调整开运算以及闭运算的结构元素,目标检测的效果差异很大。

在后续的学习过程中可以继续对本次实验进行更新修正,得到更好的实验效果。

附录

function objectracking()

obj = setupSystemObjects(); %初始化

tracks = initializeTracks(); % 初始化轨迹

nextId = 1; % ID of the next track

% Detect moving objects, and track them across video frames.

while ~isDone(obj.reader)

frame = readFrame(); %读取一帧

[centroids, bboxes, mask] = detectObjects(frame);

predictNewLocationsOfTracks();

[assignments, unassignedTracks, unassignedDetections] = ...

detectionToTrackAssignment();

updateAssignedTracks();

updateUnassignedTracks();

deleteLostTracks();

createNewTracks();

displayTrackingResults();

end

function obj = setupSystemObjects()

obj.reader = vision.VideoFileReader('test.mp4');

obj.maskPlayer = vision.VideoPlayer('Position', [740, 400, 700, 400]); obj.videoPlayer = vision.VideoPlayer('Position', [20, 400, 700, 400]);%创建视频播放对象

obj.detector = vision.ForegroundDetector('NumGaussians', 3, ...

'NumTrainingFrames', 150, 'MinimumBackgroundRatio', 0.6);

%GMM前景检测,高斯核数目3,前150帧为背景帧,阈值为0.6,返回值为背景

obj.blobAnalyser = vision.BlobAnalysis('BoundingBoxOutputPort',

true, ...

'AreaOutputPort', true, 'CentroidOutputPort', true, ...

'MinimumBlobArea', 400);%返回值为目标面积、质心和边界框

end

function tracks = initializeTracks()

% create an empty array of tracks

tracks = struct(...

'id', {}, ...

'bbox', {}, ...

'kalmanFilter', {}, ...

'age', {}, ...

'totalVisibleCount', {}, ...

'consecutiveInvisibleCount', {});

end

function frame = readFrame()

frame = obj.reader.step();

end

function [centroids, bboxes, mask] = detectObjects(frame)

% Detect foreground.

mask = obj.detector.step(frame);

% Apply morphological operations to remove noise and fill in holes. mask = imopen(mask, strel('rectangle', [8,8]));

mask = imclose(mask, strel('rectangle', [15,15]));

mask = imfill(mask, 'holes');

% Perform blob analysis to find connected components.

[~, centroids, bboxes] = obj.blobAnalyser.step(mask);

end

function predictNewLocationsOfTracks()

for i = 1:length(tracks)

bbox = tracks(i).bbox;

% Predict the current location of the track.

predictedCentroid = predict(tracks(i).kalmanFilter);

%根据以前的轨迹,预测当前位置

% Shift the bounding box so that its center is at

% the predicted location.

predictedCentroid = int32(predictedCentroid) - bbox(3:4) / 2;

tracks(i).bbox = [predictedCentroid, bbox(3:4)];

end

end

function [assignments, unassignedTracks, unassignedDetections] = ...

detectionToTrackAssignment()

nTracks = length(tracks);

nDetections = size(centroids, 1);

% Compute the cost of assigning each detection to each track.

cost = zeros(nTracks, nDetections);

for i = 1:nTracks

cost(i, :) = distance(tracks(i).kalmanFilter, centroids);

end

% Solve the assignment problem.

costOfNonAssignment = 20;

[assignments, unassignedTracks, unassignedDetections] = ...

assignDetectionsToTracks(cost, costOfNonAssignment);

end

function updateAssignedTracks()

numAssignedTracks = size(assignments, 1);

for i = 1:numAssignedTracks

trackIdx = assignments(i, 1);

detectionIdx = assignments(i, 2);

centroid = centroids(detectionIdx, :);

bbox = bboxes(detectionIdx, :);

correct(tracks(trackIdx).kalmanFilter, centroid);

tracks(trackIdx).bbox = bbox;

tracks(trackIdx).age = tracks(trackIdx).age + 1;

tracks(trackIdx).totalVisibleCount = ...

tracks(trackIdx).totalVisibleCount + 1;

tracks(trackIdx).consecutiveInvisibleCount = 0;

end

end

function updateUnassignedTracks()

for i = 1:length(unassignedTracks)

ind = unassignedTracks(i);

tracks(ind).age = tracks(ind).age + 1;

tracks(ind).consecutiveInvisibleCount = ...

tracks(ind).consecutiveInvisibleCount + 1;

end

end

%% Delete Lost Tracks

function deleteLostTracks()

if isempty(tracks)

return;

end

invisibleForTooLong = 20;

ageThreshold = 10;

ages = [tracks(:).age];

totalVisibleCounts = [tracks(:).totalVisibleCount];

visibility = totalVisibleCounts ./ ages;

lostInds = (ages < ageThreshold & visibility < 0.6) | ...

[tracks(:).consecutiveInvisibleCount] >= invisibleForTooLong; tracks = tracks(~lostInds);

end

function createNewTracks()

centroids = centroids(unassignedDetections, :);

bboxes = bboxes(unassignedDetections, :);

for i = 1:size(centroids, 1)

centroid = centroids(i,:);

bbox = bboxes(i, :);

kalmanFilter = configureKalmanFilter('ConstantVelocity', ... centroid, [200, 50], [100, 25], 100);

newTrack = struct(...

'id', nextId, ...

'bbox', bbox, ...

'kalmanFilter', kalmanFilter, ...

'age', 1, ...

'totalVisibleCount', 1, ...

'consecutiveInvisibleCount', 0);

tracks(end + 1) = newTrack;

nextId = nextId + 1;

end

end

function displayTrackingResults()

frame = im2uint8(frame);

mask = uint8(repmat(mask, [1, 1, 3])) .* 255;

minVisibleCount = 20;

if ~isempty(tracks)

reliableTrackInds = ...

[tracks(:).totalVisibleCount] > minVisibleCount;

reliableTracks = tracks(reliableTrackInds);

if ~isempty(reliableTracks)

bboxes = cat(1, reliableTracks.bbox);

ids = int32([reliableTracks(:).id]);

labels = cellstr(int2str(ids'));

predictedTrackInds = ...

[reliableTracks(:).consecutiveInvisibleCount] > 0;

isPredicted = cell(size(labels));

isPredicted(predictedTrackInds) = {' predicted'};

labels = strcat(labels, isPredicted);

frame = insertObjectAnnotation(frame, 'rectangle', ...

bboxes, labels);

mask = insertObjectAnnotation(mask, 'rectangle', ...

bboxes, labels);

end

end

obj.maskPlayer.step(mask);

obj.videoPlayer.step(frame);

end

end

Matlab程序命令

Matlab程序命令(四)数据处理及空间自回归模型参数估计 一、教材实例 Matlab操作过程(注意:在进行空间计量模型参数估计时,要把空间计量软件包jplv7和fanzuan、lYhbzh函数添加到Matlab程序文件夹中,否则,所有与Matlab相关的程序、函数等都能够被Matlab识别并使用) %空间自回归模型设立 %移项、矩阵变换 %估计结果 (一)构造变量矩阵 y=[42;37;30;26;30;37;42] %7行1列矩阵 x=[10,30;20,20;30,10;50,0;30,10;20,20;10,30] %7行2列矩阵 (二)构建已经行标准化的空间权重矩阵 W=zeros(7) %建立7×7零矩阵 W(1,2)=1 %赋W第1行第2列为1的值 W(2,1)=0.5 %赋W第2行第1列为0.5的值 W(2,3) =0.5 %赋W第2行第3列为0.5的值 W(3,2) =0.5 %赋W第3行第2列为0.5的值 W(3,4) =0.5 %赋W第3行第4列为0.5的值 W(4,3) =0.5 %赋W第4行第3列为0.5的值 W(4,5) =0.5 %赋W第4行第5列为0.5的值 W(5,4) =0.5 %赋W第5行第4列为0.5的值 W(5,6) =0.5 %赋W第5行第6列为0.5的值 W(6,5) =0.5 %赋W第6行第5列为0.5的值 W(6,7) =0.5 %赋W第6行第7列为0.5的值 W(7,6) =1 %赋W第7行第6列为1的值 (三)估计空间自回归模型Matlab程序命令 results = sar(y,x,W) %估计估计空间自回归模型参数 prt(results) %格式化 二、教材实例(续) (一)引进函数lyhbzh的Matlab程序命令

matlab运算函数与命令

Matlab符号运算介绍 Matlab符号运算是通过符号数学工具箱(Symbolic Math Toolbox)来实现的. Matlab符号运算(二) 符号对象的建立:sym 和syms 例: >> syms x y z >> x=sym('x'); >> y=sym('y'); >> z=sym('z'); 符号对象建立时可以附加属性: real,positive 和unreal >> k=sym('k','positive') >> x=sym('x','real') >> x=sym('x','unreal') 表明x 是实的 Matlab符号运算(二) 表明k 是正的 去掉x 的附加属性 符号表达式的建立 >> f2=sym('sin(x)+cos(x)') >> syms x >> f1=sin(x)+cos(x) >> f3='sin(x)+cos(x)' 用这种方法创建的符号表达式对空格很敏感,不要在字符间随意添加空格! Matlab符号运算(二) 推荐! 符号变量与符号常量 >> a=sym('a'); >> b=sym('5'); >> c=sym(5); b,c有区别吗 hint:help sym 相关函数 findsym: 查找符号表达式中的符号变量 findsym(f) 按字母顺序列出符号表达式 f 中的所有自由变量findsym(f,N) 列出f 中距离x 最近的N 个自由变量(i,j 除外) 默认自变量=findsym(f,1) Matlab符号运算(二) >> a=sym('a');x=sym('x');k=sym('3'); >> f=k*x+a; >> findsym(f) 例: ans=a,x

多目标线性规划的若干解法及MATLAB实现

多目标线性规划的若干解法及MATLAB 实现 一.多目标线性规划模型 多目标线性规划有着两个和两个以上的目标函数,且目标函数和约束条件全是线性函 数,其数学模型表示为: 11111221221122221122max n n n n r r r rn n z c x c x c x z c x c x c x z c x c x c x =+++??=+++?? ??=+++? (1) 约束条件为: 1111221121122222112212,,,0 n n n n m m mn n m n a x a x a x b a x a x a x b a x a x a x b x x x +++≤??+++≤?? ??+++≤?≥?? (2) 若(1)式中只有一个1122i i i in n z c x c x c x =+++ ,则该问题为典型的单目标线性规划。我们记:()ij m n A a ?=,()ij r n C c ?=,12(,,,)T m b b b b = ,12(,,,)T n x x x x = , 12(,,,)T r Z Z Z Z = . 则上述多目标线性规划可用矩阵形式表示为: max Z Cx = 约束条件:0 Ax b x ≤?? ≥? (3) 二.MATLAB 优化工具箱常用函数[3] 在MA TLAB 软件中,有几个专门求解最优化问题的函数,如求线性规划问题的linprog 、求有约束非线性函数的fmincon 、求最大最小化问题的fminimax 、求多目标达到问题的fgoalattain 等,它们的调用形式分别为: ①.[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub) f 为目标函数系数,A,b 为不等式约束的系数, Aeq,beq 为等式约束系数, lb,ub 为x 的下 限和上限, fval 求解的x 所对应的值。 算法原理:单纯形法的改进方法投影法 ②.[x,fval ]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub ) fun 为目标函数的M 函数, x0为初值,A,b 为不等式约束的系数, Aeq,beq 为等式约束

用MATLAB求解规划问题

§15. 利用Matlab求解线性规划问题 线性规划是一种优化方法,Matlab优化工具箱中有现成函数linprog对如下式描述的LP问题求解: % min f'x % s.t .(约束条件):Ax<=b % (等式约束条件):Aeqx=beq % lb<=x<=ub linprog函数的调用格式如下: x=linprog(f,A,b) x=linprog(f,A,b,Aeq,beq) x=linprog(f,A,b,Aeq,beq,lb,ub) x=linprog(f,A,b,Aeq,beq,lb,ub,x0) x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options) [x,fval]=linprog(…) [x, fval, exitflag]=linprog(…) [x, fval, exitflag, output]=linprog(…) [x, fval, exitflag, output, lambda]=linprog(…) 其中: x=linprog(f,A,b)返回值x为最优解向量。 x=linprog(f,A,b,Aeq,beq) 作有等式约束的问题。若没有不等式约束,则令 111

A=[ ]、b=[ ] 。 x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options) 中lb ,ub为变量x的下界和上界,x0为初值点,options为指定优化参数进行最小化。 Options的参数描述: Display显示水平。选择’off’ 不显示输出;选择’I ter’显示每一步迭代过程的输出;选择’final’ 显示最终结果。 MaxFunEvals 函数评价的最大允许次数 Maxiter 最大允许迭代次数 TolX x处的终止容限 [x,fval]=linprog(…) 左端fval 返回解x处的目标函数值。 [x,fval,exitflag,output,lambda]=linprog(f,A,b, Aeq,beq,lb,ub,x0) 的输出部分: exitflag描述函数计算的退出条件:若为正值,表示目标函数收敛于解x 处;若为负值,表示目标函数不收敛;若为零值,表示已经达到函数评价或迭代的最大次数。 output 返回优化信息:output.iterations表示迭代次数;output.algorithm表示所采用的算法;outprt.funcCount表示函数评价次数。 lambda返回x处的拉格朗日乘子。它有以下属性: lambda.lower-lambda的下界; lambda.upper-lambda的上界; lambda.ineqlin-lambda的线性不等式; lambda.eqlin-lambda的线性等式。 112

多目标规划_matlab程序-XX的小论文

优化与决策 ——多目标线性规划的若干解法及MATLAB实现 指导老师: XX教授 学生姓名: XX 多目标线性规划的若干解法及MATLAB实现 丁宏飞 (西南交通大学数学学院四川成都 610031)

摘要:求解多目标线性规划的基本思想大都是将多目标问题转化为单目标规划,本文介绍了理想点法、线性加权和法、最大最小法、目标规划法[1],然后给出多目标线性规划的模糊数学解法[2],最后对每种解法给出例子,并用Matlab 软件加以实现。 关键词:多目标线性规划 Matlab 模糊数学 Some solutions of Multi-objective linear programming and realized by Matlab Ding Hongfei School of Mathematics, Southwest Jiaotong University ,Chengdu, 610031 Abstract: The basic ideas to solve Multi-objective linear programming are transforming the multi-objective problem into single-objective planning, This paper introduces the ideal point method, linear weighted and law, max-min method, the goal programming method, then given multi-objective linear programming Fuzzy mathematics method, finally give examples of each method and used Matlab software to achieve. Key words: Multi-objective Linear Programming Matlab fuzzy mathematics 一.引言 多目标线性规划是多目标最优化理论的重要组成部分,由于多个目标之间的矛盾性和不可公度性,要求使所有目标均达到最优解是不可能的,因此多目标规划问题往往只是求其有效解(非劣解)。目前求解多目标线性规划问题有效解的方法,有理想点法、线性加权和法、最大最小法、目标规划法,然而这些方法对多目标偏好信息的确定、处理等方面的研究工作较少,本文也给出多目标线性规划的模糊数学解法。 二.多目标线性规划模型 多目标线性规划有着两个和两个以上的目标函数,且目标函数和约束条件全是线性函 数,其数学模型表示为: 11111221221122221122m ax n n n n r r r rn n z c x c x c x z c x c x c x z c x c x c x =+++?? =+++?? ? ?=+++? (1)

第1章 MATLAB

第1章MATLAB 7.x概述 MATLAB是目前世界上最流行的、应用最广泛的工程计算和仿真软件。MATLAB是Matrix Laboratory的缩写,它的产生是与数学计算紧密联系在一起的。MATLAB是一个交互式开发系统,其基本数据要素是矩阵。 本门课程以MATLAB 7.3和simulink 6.5版为平台进行全面地介绍。 1.1 MATLAB 7.3 简介 1.1.1 MATLAB的系统结构 MATLAB系统由MATLAB开发环境、MATLAB语言、MATLAB数学函数库、MATLAB图形处理系统和MATLAB应用程序接口(API)五大部分组成。 (1)MATLAB开发环境是一个集成的工作环境。 (2)MATLAB语言具有程序流程控制、函数、数据结构、输入输出和面向对象的编程特点,是基于矩阵/数组的语言。 (3)MATLAB的数学函数库包含了大量的计算算法。 (4)MATLAB的图形处理系统能够将二维和三维数组的数据用图形表示出来。 (5)MATLAB应用程序接口使MATLAB语言能与C或FORTRAN等其他编程语言进行交互。 1.1.2 MATLAB的特点 1. 运算功能强大 2. 编程效率高 3. 强大而智能化的作图功能 4. 可扩展性强 5. Simulink动态仿真功能 1.1.3 MATLAB工具箱 MATLAB的工具箱(Toolbox)是一个专业家族产品,工具箱实际上是MATLAB 的M文件和高级MATLAB语言的集合,用于解决某一方面的专门问题或实现某一类的新算法。 包括应用数学类、控制类、信号处理类等工具箱。 1.2 MATLAB 7.3的开发环境 1.2.1 MATLAB 7.3的环境设置 1.2.3 菜单和工具栏 1. 菜单 MATLAB 7.3还会根据不同的窗口,增加一些浮动菜单。 (1)File菜单 (2)Edit菜单 (3)Debug菜单 (4)Desktop菜单 (5)Windows菜单 (6)Help菜单 (7)开始菜单 在MATLAB操作界面的左下角有一个按钮,是MATLAB的快捷菜单。

Matlab程序设计(2016大作业)

Matlab程序设计 课程大作业 题目名称:_________________________________ 班级:_________________________________ 姓名:_________________________________ 学号:_________________________________ 课程教师:温海骏 学期:2015-2016学年第2学期 完成时间: MATLAB优化应用 §1 线性规划模型 一、线性规划问题: 问题1:生产计划问题 假设某厂计划生产甲、乙两种产品,现库存主要材料有A类3600公斤,B类2000公斤,C类3000公斤。每件甲产品需用材料A类9公斤,B类4公斤,C类3公斤。每件乙产品,需用材料A类4公斤,B类5公斤,C类10公斤。甲单位产品的利润70元,乙单位产品的利润120元。问如何安排生产,才能使该厂所获的利润最大。 问题2:投资问题 某公司有一批资金用于4个工程项目的投资,其投资各项目时所得的净收益(投入资金百分比)如下表:工程项目收益表 工程项目 A B C D 收益(%) 15 10

12 由于某种原因,决定用于项目A的投资不大于其他各项投资之和而用于项目B和C的投资要大于项目D的投资。试确定该公司收益最大的投资分配方案。 问题3:运输问题 有A、B、C三个食品加工厂,负责供给甲、乙、丙、丁四个市场。三个厂每天生产食品箱数上限如下表: 工厂 A B C 生产数 60 40 50 四个市场每天的需求量如下表: 市场 甲 乙 丙 丁 需求量 20 35 33 34 从各厂运到各市场的运输费(元/每箱)由下表给出: 收点 发点 市场 甲 乙 丙 丁 工 厂 A 2 1 3 2 B

matlab实验报告

Matlab实验报告 ——定积分的近似计算 学生姓名: 学号: 专业:数学与应用数学专业

数学实验报告 实验序号:1001114030 日期:2012年10月20日 班级应一姓名陈璐学号1001114030 实验名称:定积分的近似运算 问题背景描述: 利用牛顿—莱布尼茨公式虽然可以精确地计算定积分的值,但它仅适合于被积分函数的原函数能用初等函数表达出来的情形。如果这点办不到或不容易办到, 这就有必要考虑近似计算的方法。在定积分的很多应用问题中,被积函数甚至没 有解析表达式,可能只是一条实验记录曲线,或者是一组离散的采样值,这时只 能应用近似方法去计算相应的定积分。 实验目的: 本实验将主要研究定积分的三种近似计算算法:矩形法、梯形法、抛物线发。对于定积分的近似数值计算,Matlab有专门函数可用。 实验原理与数学模型: 1.sum(a):求数组a的和。 2.format long:长格式,即屏幕显示15位有效数字。 3.double():若输入的是字符则转化为相应的ASCII码;若输入的是整型数之则转化为 相应的实型数值。 4.quad():抛物线法求数值积分。格式:quad(fun,a,b)。此处的fun是函数,并且

为数值形式,所以使用*、/、^等运算时要在其前加上小数点。 5.trapz():梯形法求数值积分。格式:trapz(x,y)。其中x为带有步长的积分区间;y为数 值形式的运算。 6.fprintf(文件地址,格式,写入的变量):把数据写入指定文件。 7.syms 变量1变量2……:定义变量为符号。 8.sym('表达式'):将表达式定义为符号。 9.int(f,v,a,b):求f关于v积分,积分区间由a到b。 10.subs(f,'x',a):将a的值赋给符号表达式f中的x,并计算出值。若简单地使用subs (f),则将f的所有符号变量用可能的数值代入,并计算出值。 实验所用软件及版本:Matlab 7.0.1

多目标非线性规划程序Matlab完整版

多目标非线性规划程序 M a t l a b Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

f u n c t i o n[e r r m s g,Z,X,t,c,f a i l]= BNB18(fun,x0,xstat,xl,xu,A,B,Aeq,Beq,nonlcon,setts,options1,options2,maxSQPit,varargin ); %·Dêy1£Díóa·§¨μü′ú·¨£úDê1ó£DèOptimization toolbox §3 % Minimize F(x) %subject to: xlb <= x <=xub % A*x <= B % Aeq*x=Beq % C(x)<=0 % Ceq(x)=0 % % x(i)éaáD±á£êy£ò1ì¨μ % ê1óê %[errmsg,Z,X]=BNB18('fun',x0,xstat,xl,xu,A,B,Aeq,Beq,'nonlcon',setts) %fun£o Mt£±íê×Dˉ±êoˉêyf=fun(x) %x0: áDòᣱíê±á3μ %xstat£o áDòá£xstat(i)=0±íêx(i)aáD±á£1±íêêy£2±íê1ì¨μ %xl£o áDòᣱíê±á %xu: áDòᣱíê±áé %A: ó, ±íêD2μèêêμêy %B: áDòá, ±íêD2μèêêé %Aeq: ó, ±íêDμèêêμêy %Beg: áDòá, ±íêD2μèêêóòμ %nonlcon: Mt£±íê·Dêoˉêy[C,Ceq]=nonlin(x),DC(x)a2μèêê, % Ceq(x)aμèêê %setts: ·¨éè %errmsq: ·μ′íóìáê %Z: ·μ±êoˉêy×Dμ %X: ·μ×óa % %àyìa % max x1*x2*x3 % -x1+2*x2+2*x3>=0 % x1+2*x2+2*x3<=72 % 10<=x2<=20 % x1-x2=10 % èD′ Moˉêy % function f=discfun(x) % f=-x(1)*x(2)*x(3); %óa % clear;x0=[25,15,10]';xstat=[1 1 1]'; % xl=[20 10 -10]';xu=[30 20 20]'; % A=[1 -2 -2;1 2 2];B=[0 72]';Aeq=[1 -1 0];Beq=10; % [err,Z,X]=BNB18('discfun',x0,xstat,xl,xu,A,B,Aeq,Beq); % XMAX=X',ZMAX=-Z %

(第2章)MATLAB软件包使用精要

第2章MATLAB软件包使用精要 2.1 MATLAB通用命令介绍 2.1.1 管理命令与函数 一、指定搜索路径 path( ),addpath( ),rmpath( ):指定、增加、删除搜索路径。语法格式为: p=path:将搜索路径字符串值返回给字符串变量p path(‘newdir’):将搜索路径改变为字符串’newdir’指定的路径 rmpath(‘directory’):删除’directory’路径 addpath(‘directory’):增加’directory’路径 addpath(‘dir1’, ‘dir1’, ‘dir1’,…) addpath(…,‘-flag’):flag值为0或begin表示将目录加在原搜索路径之前;1或end表示将目录加在原搜索路径之后 二、doc命令:读入超文本文件 三、help命令:MATLAB函数和M文件的在线式帮助。语法格式为: helpl topic:topic为要取得帮助的主题,可省略topic。 四、type命令:在命令窗口显示文件内容。语法格式为: type filename:filename为文件名,缺省扩展名为“.m”。 五.what命令:列出给定目录下的所有M文件、MAT文件、MEX文件。语法格式为:what dirname:列出给定目录dirname下的上述文件,其中dirname可不用全部路径名称,可用最后一层或两层路径代替。 2.1.2 变量和工作空间管理命令与函数 一、工作空间的概念及操作 1.概念:当MATLAB启动后,系统自动在内存中开辟一块存储区域用于存储用户在MATLAB 命令窗口中定义的变量、运算结果和有关数据。此内存空间称为MATLAB的工作空间。 工作空间在MATLAB刚启动时为空,此后,用户所定义的变量、运算结果和有关数据均存储在该空间。但一旦退出系统,工作空间的内存将不再保留。为了能够将工作空间的内容长期保留下来,MATLAB为用户提供了将工作空间以MAT文件保存到磁盘的功能,具体步骤如下: (1)保存工作空间:单击MATLAB命令窗口菜单栏的文件(【File】)菜单, 选择【Save Worspace as】菜单选项。 (2)装载工作空间:单击MATLAB命令窗口菜单栏的文件(【File】)菜单, 选择【Save Worspace as】菜单选项,系统打开工作空间装载设置对话框。 在该对话框中选定已保存的工作空间的文件名,单击【打开】按钮,即可 将已保存的工作空间的内容装载到当前工作空间。 二、管理命令与函数 1.clear命令:清除内存中的对象。语法格式为: clear:清除工作空间中的全部变量

MATLAB编程0-1规划问题

MATLAB 语言应用————最优化 MATLAB 编程线性规划问题 第二章0-1规划 MATLAB 的0-1规划函数bintprog 是针对下述0-1规划: 12min *.**[,,],01,1,2,n i z f x s t A x b aeq x beq x x x x x or i n L L ()解0-1规划()的0-1规划函数bintprog 表述为 [x, fv, exitflag, output]= bintprog(f,A,b,aeq, beq) ()输入部分: f 为目标函数,实为目标函数的系数。 A 为()中的不等式约束矩阵 b 为()中的不等式约束向量 aeq 为()中的等式约束矩阵 beq ()中的等式约束向量 输出部分: x 为最优解fval 为最优值 exitflag 为输出标志 exitflag=1,有最优解exitflag=0,迭代次数超过设定次数exitflag==-2,约束区域不可行 exitflag=-3,问题无解 output ,表明算法和迭代情况如果我们不需要了解迭代情况和存储情况,可将 0-1规划函数bintprog 写成[x, fv, ex]= linprog(f,A,b,aeq, beq) () 在函数bintprog 中,输入或输出元素的符号可以变更,如()中 ex 仍为输出标志,但元素的符号位置不能变更。在输出部分,如有缺者,可用 []号代替。函数bintprog 的使用要点与函数linprog 的使用要点相同。 函数是为求目标函数的最小值而设置的, 如要求函数的最大值,可先求出()f 的最小值fv ,则fv 必为f 的最大值。 例一用函数bintprog 求解下列0-1规划用MA TLAB 语言编程如下:

matlab程序设计与应用实验指导书

附件2 《matlab程序设计与应用》实验指导书 山东建筑大学信息与电气工程学院

前言 一、实验目的 本课程是电气工程及其自动化、自动化、电力工程与管理专业本科生的 学科基础选修课,它在线性代数、信号分析和处理、控制系统设计和仿真等 方面有着广泛的应用。主要是学习MATLAB的语法规则、基本命令和使用环境,使学生掌握MATLAB的基本命令和基本程序设计方法,提高使用该语言 的应用能力,具有使用MATLAB语言编程和调试的能力,以便为后续多门课 程使用该语言奠定必要的基础。 通过上机实验,使学生掌握MATLAB在线帮助功能的使用、熟悉MATLAB运行环境和MATLAB语言的主要特点,掌握MA TLAB语言的基本 语法规则及基本操作命令的使用,学会M文件的建立和使用方法以及应用MATLAB实现二维和三维图形的绘制方法,具有使用MATLAB语言编程和 调试的能力。 二、实验前预习 每次实验前,学生须仔细阅读本实验指导书的相关内容,明确实验目的、要求;明确实验步骤、测试数据及需观察的现象;复习与实验内容有关的理论知识;预习仪器设备的使用方法、操作规程及注意事项;做好预习要求中提出的其它事项。 三、实验注意事项 1.实验开始前,应先检查本组电脑设备是否工作正常,matlab软件工作是否正常。 2.实验时每位同学应独立完成实验任务,避免抄袭。 3.实验后应及时将实验数据进行记录与存盘,避免因电脑故障或其它原因造成实验数据的丢失。 4.实验中严格遵循电脑操作规程,如电脑发生异常现象,应立即切断电源,

报告指导教师检查处理。 5.测量数据或观察现象要认真细致,实事求是。 6.未经许可,不得对电脑进行软件及硬件的更改操作。 7.实验结束后,实验记录交指导教师查看并认为无误后,方可关掉电脑离开。 8.爱护公物,发生仪器设备等损坏事故时,应及时报告指导教师,按有关实验管理规定处理。 9.自觉遵守学校和实验室管理的其它有关规定。 四、实验总结 每次实验后,应对实验进行总结,即实验数据进行整理,绘制波形和图表,分析实验现象,撰写实验报告。实验报告除写明实验名称、日期、实验者姓名、同组实验者姓名外,还包括: 1.实验目的; 2.实验内容 3.实验流程图; 4.程序命令清单; 5.运行结果; 6.实验的收获与体会; 7.回答每项实验的有关问答题。

Matlab课后习题

Matlab变量名是以字母开头,后接字母、数字或下划线的字符序列,最多63个字符.在MATLAB中,变量名区分字母的大小写. 赋值语句: 变量=表达式或表达式 其中表达式是用运算符将有关运算量连接起来的式子,其结果是一个矩阵. clear命令用于删除MATLAB工作空间中的变量.who和whos这两个命令用于显示在MATLAB工作空间中已经驻留的变量名清单.who命令只显示出驻留变量的名称,whos在给出变量名的同时,还给出它们的大小、所占字节数及数据类型等信息. 利用MAT文件可以把当前MATLAB工作空间中的一些有用变量长久地保留下来,扩展名是.mat.MAT文件的生成和装入由save和load 命令来完成.常用格式为: save 文件名 [变量名表] [-append][-ascii] load 文件名 [变量名表] [-ascii] 其中,文件名可以带路径,但不需带扩展名.mat,命令隐含一定对.mat文件进行操作.变量名表中的变量个数不限,只要内存或文件中存在即可,变量名之间以空格分隔.当变量名表省略时,保存或装入全部变量.-ascii选项使文件以ASCII格式处理,省略该选项时文件将以二进制格式处理.save命令中的-append选项控制将变量追加到MAT文件中. (1) 向量的创建 用步长生成法: 数组=初值:步长(增量):终值 >> a=1:0.5:3 a = 1.0000 1.5000 2.0000 2.5000 3.0000 用linspace生成: 数组=linspace(初值,终值,等分点数目) >> b=linspace(1,3,5) b = 1.0000 1.5000 2.0000 2.5000 3.0000 列向量用分号(;)作为分行标记: >> c=[1;2;3;4;] c = 1 2 3 4 若不想输出结果,在每一条语句后用分号作为结束符,若留空或用逗号结束,则在执行该语句后会把结果输出来. >> a+b; >> a+b ans = 2 3 4 5 6 (2) 矩阵的创建 直接输入——最简单的建立矩阵的方法是从键盘直接输入矩阵的元素.具体方法如下:将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔. >> A=[1 2 3;4 5 6;2 3 5] A = 1 2 3 4 5 6 2 3 5 利用矩阵函数创建: >> B=magic(3)%魔方阵 B = 8 1 6 3 5 7 4 9 2 >> C=hilb(3)%3阶Hilbert矩阵 C = 1.0000 0.5000 0.3333 0.5000 0.3333 0.2500 0.3333 0.2500 0.2000 Matlab中用%引导注释 其它创建矩阵函数还有: eye(m,n):生成m行n列单位矩阵. zeros(m,n):生成m行n列全零矩阵. ones(m,n):生成全1矩阵. rand(m,n):生成随机矩阵. rand:生成一个随机数. diag(A):取A的对角线元素. tril(A):取A的下三角元素. triu(A):取A的上三角元素. hilb(n):生成n维Hilbert矩阵. randn(n):产生均值为0,方差为1的标准正态分布随机矩阵. vander(V):生成以向量V为基础向量的范得蒙矩阵. invhilb(n): 求n阶的希尔伯特矩阵的逆矩阵. toeplitz(x,y): 生成一个以x为第一列,y为第一行的托普利兹矩阵 compan(p): 生成伴随矩阵, p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后. pascal(n): 生成一个n阶帕斯卡矩阵. compan: 生成伴随矩阵 (3) 矩阵运算 MATLAB的基本算术运算有:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方). 加法:>> A+B ans = 9 3 9 7 10 13 6 12 7 减法:>> B-A ans = 7 -1 3 -1 0 1 2 6 -3 乘法:>> A*B ans = 26 38 26 71 83 71 45 62 43

多目标非线性规划程序(Matlab)

function [errmsg,Z,X,t,c,fail] = BNB18(fun,x0,xstat,xl,xu,A,B,Aeq,Beq,nonlcon,setts,options1,options2,ma xSQPit,varargin); %·???D???êy1????£Dí?ó?a·??§?¨??μü′ú??·¨?£?úMATLAB5.3?Dê1ó?£?DèOptimizat ion toolbox 2.0?§3?? % Minimize F(x) %subject to: xlb <= x <=xub % A*x <= B % Aeq*x=Beq % C(x)<=0 % Ceq(x)=0 % % x(i)?é?aá?D?±?á?£???êy£??ò1ì?¨?μ % ê1ó???ê? %[errmsg,Z,X]=BNB18('fun',x0,xstat,xl,xu,A,B,Aeq,Beq,'nonlcon',setts) %fun£o M???t??£?±íê?×?D??ˉ??±êoˉêyf=fun(x) %x0: áD?òá?£?±íê?±?á?3??μ %xstat£o áD?òá?£?xstat(i)=0±íê?x(i)?aá?D?±?á?£?1±íê???êy£?2±íê?1ì?¨?μ %xl£o áD?òá?£?±íê?±?á????? %xu: áD?òá?£?±íê?±?á?é??? %A: ???ó, ±íê???D?2?μèê???ê??μêy %B: áD?òá?, ±íê???D?2?μèê???ê?é??? %Aeq: ???ó, ±íê???D?μèê???ê??μêy %Beg: áD?òá?, ±íê???D?2?μèê???ê?óò???μ %nonlcon: M???t??£?±íê?·???D???ê?oˉêy[C,Ceq]=nonlin(x),???DC(x)?a2?μèê???ê?, % Ceq(x)?aμèê???ê? %setts: ??·¨éè?? %errmsq: ·μ??′í?óìáê? %Z: ·μ????±êoˉêy×?D??μ %X: ·μ??×?ó??a % %àyìa % max x1*x2*x3 % -x1+2*x2+2*x3>=0 % x1+2*x2+2*x3<=72 % 10<=x2<=20 % x1-x2=10 % ?èD′ Moˉêydiscfun.m % function f=discfun(x) % f=-x(1)*x(2)*x(3); %?ó?a % clear;x0=[25,15,10]';xstat=[1 1 1]'; % xl=[20 10 -10]';xu=[30 20 20]'; % A=[1 -2 -2;1 2 2];B=[0 72]';Aeq=[1 -1 0];Beq=10; % [err,Z,X]=BNB18('discfun',x0,xstat,xl,xu,A,B,Aeq,Beq); % XMAX=X',ZMAX=-Z % % BNB18 Finds the constrained minimum of a function of several possibly integer variables. % Usage: [errmsg,Z,X,t,c,fail] = % BNB18(fun,x0,xstatus,xlb,xub,A,B,Aeq,Beq,nonlcon,settings,options1,opti ons2,maxSQPiter,P1,P2,...) % % BNB solves problems of the form: % Minimize F(x) subject to: xlb <= x0 <=xub

MATLAB编程0-1规划问题

MATLAB编程线性规划问题 第二章0-1规划 MATLAB的0-1规划函数bintprog是针对下述0-1规划: min z = f * x s.t A* x _ b (2.1)aeq* x = beq x 二[冷X2, |l(X n],人=0or1,i =12l()n 解0-1规划(2.1 )的0-1规划函数bintprog表述为 [x, fv, exitflag, output]= bin tprog(f,A,b,aeq, beq)(2.2)输入部分: f为目标函数,实为目标函数的系数。 A为(2.1)中的不等式约束矩阵 b为(2.1)中的不等式约束向量 aeq为(2.1)中的等式约束矩阵 beq(2.1)中的等式约束向量 输出部分: x为最优解fval为最优值 exitflag为输出标志exitflag=1,有最优解exitflag=0,迭代次数超过设定次数 exitflag==-2,约束区域不可行exitflag=-3,问题无解 output,表明算法和迭代情况 如果我们不需要了解迭代情况和存储情况,可将0-1规划函数bintprog写成 [x, fv, ex]= lin prog(f,A,b,aeq, beq)(2.3)在函数bintprog中,输入或输出元素的符号可以变更,如( 2.3)中ex仍为输出标志,但元素的符号 位置不能变更。在输出部分,如有缺者,可用[]号代替。 函数bintprog的使用要点与函数linprog的使用要点相同。 函数是为求目标函数的最小值而设置的,如要求函数的最大值,可先求出(- f)的最小值fv ,则- fv 必为f的最大值。

matlab5二次规划问题

二次规划的标准形式为: min (1/2)X’HX+f’X 约束条件:Ax≤b Aeqx=beq,lb≤x≤ub,其中:f、b、beq、lb、ub、x是矢量,H、 A、Aeq为矩阵。 在MATLAB中可以使用quadprog函数来求最小值。 调用格式: x=quadprog (H,f,A,b) x=quadprog (H,f,A,b,Aeq,beq) x=quadprog (H,f,A,b,Aeq,beq,lb,ub) x=quadprog (H,f,A,b,Aeq,beq,lb,ub,x0) x=quadprog (H,f,A,b,Aeq,beq,lb,ub,x0,options) x=quadprog (H,f,A,b,Aeq,beq,lb,ub,x0,options,P1,P2,…) [x,fval]= quadprog (…) [x,fval,exitflag]= quadprog (…) [x,fval,exitflag,output]= quadprog (…) [x,fval,exitflag,output,lambda]= quadprog (…) fval为目标函数的最优值;其中:H,f,A,b为标准形中的参数,x为目标函数的最小值;x0为初值;Aeq,beq 满足等式约束Aeq.x=beq;lb,ub满足lb lambda是Lagrange乘数,它体现有效约束的个数;output输出优化信息;exitflag为终止迭代的条件:若

exitflag>0,表示函数收敛于解x;若exitflag=0,表示超过函数估值或迭代的最大次数;exitflag<0表示函数不收敛于解x;output为优化信息:若参数output=iterations表示迭代次数, output=funccount表示函数赋值次数, output=algorithm表示所使用的算法。 例0-6 计算下面二次规划问题 minf(x)= (1/2)x1^2+x2^2- x1x2-2x1-6x2 约束条件: x1+x2≤2 -x1+x2≤2, 2x1+x2≤3; x1≤0; x2≤0 解:把二次规划问题写成标准形式:(1/2)XTHX+fTX 这里: H= 1 -1 f= -2 X= x1 -1 2 -6 x2

(整理)matlab命令.

将excel数据导入 直接将下面三句话导入 [filename, pathname]= uigetfile('*.xls'); %寻找源文件 file=[pathname filename]; %赋名 x=xlsread(file); %格式转换为矩阵 之后就用x来代表导入的这个矩阵。 如excel 里输入了 1 2 3 4 5 6 如下命令 x(1,:) ans = 1 2 3 Matlab提供了从磁盘文件或剪贴簿转载数据至工作区(数据导入)和将工作区变量存入磁盘文件(数据导出)的多种途径。 最简单的办法是使用界面导入向导,打开文件菜单中的导入数据而后按提示操作。Matlab 支持的主要数据文件类型和对应函数如下: 导入文本文件 文本文件需要具备统一的行列模式,使用分隔符作为数据项间隔,这些分隔符包括空格、逗号、tab、分号或其它。数据文件可能附带标题行和行列头标签。 数值数据 对于数值数据可以直接使用load函数装载,例如my_data.txt中数据如下: 1 2 3 4 5 6 7 8 9 10 命令A = load('my_data.txt')装载该文本文件数据。 如果数值数据使用其它分隔符,可以使用dlmread读入,假设my_data.txt中数据如下:7.2;8.5;6.2;6.6

5.4;9.2;8.1;7.2 命令A = dlmread('my_data.txt', ';')读入该数据。 包含行列标签的数值数据 例如: Grade1 Grade2 Grade3 78.8 55.9 45.9 99.5 66.8 78.0 89.5 77.0 56.7 fid = fopen('grades.dat', 'r'); grades = textscan(fid, '%f %f %f', 3, 'headerlines', 1); fclose(fid); 包含字符和数值的混合数据 使用textread函数读入。 导出文本文件 save函数 A = [ 1 2 3 4 ; 5 6 7 8 ]; save my_data.out A –ASCII dlmwrite函数 dlmwrite('my_data.out',A, ';') MS-Excel电子表格文件 xlsinfo获得文件信息 使用命令[type, sheets] = xlsfinfo(filename)返回文件类型type和工作表信息。如:[type, sheets] = xlsfinfo('tempdata.xls') Xlswrite导出数据 d = {'Time', 'Temp'; 12 98; 13 99; 14 97} 命令xlswrite('tempdata.xls', d, 'Temperatures', 'E1')将单元格数组d的数据写出至tempdata.xls 文件,新建工作表'Temperatures',从该工作表的E1单元格开始写入。 Xlsread读入数据 ndata = xlsread('tempdata.xls', 'Temperatures') [ndata, headertext] = xlsread('tempdata.xls', 'Temperatures' )

Matlab学习系列27.-多目标规划

27. 多目标规划 一、线性规划的局限性 1. 线性规划要求所求解问题必须满足全部的约束,而实际问题中并非所有约束都需要严格的满足; 2. 线性规划只能处理单目标的优化问题,从而对一些次目标只能转化为约束处理,而实际问题中,目标和约束是可以相互转化的,处理时不一定要严格区分; 3. 线性规划在处理问题时,将各个约束(也可看成目标)的地位看成同等重要,实际问题中,各个目标的重要性有层次上的差别,在同一层次也可能有不同权重; 4. 线性规划寻找最优解,而许多实际问题只要找到满意解就可以了。 例1 (线性规划——生产安排问题) 某企业生产甲、乙两种产品,需要用到A,B,C三种设备,每天产品盈利与设备使用工时及限制如下表: 问:该企业应如何安排生产,能使总利润最大?

解:设甲乙产品的产量分别为x 1, x 2,建立线性规划模型: 12121212max 200300 s. t. 2212 416 515 ,0 z x x x x x x x x =++≤≤≤≥ 用Lingo 可求得最优解:x 1=3, x 2=3, z *=1500. 但实际上,企业的经营目标不仅仅是利润,还需要考虑多个方面,比如:增加下列因素(目标) (1) 力求使利润不低于1500元; (2) 考虑市场需求,甲乙两种产品的产量比应尽量保持1:2; (3) 设备A 位贵重设备,严格禁止超时使用; (4)设备C 可以适当加班,但要控制,设备B 既要求充分利用,又尽可能不加班,在重要性上,设备B 是设备C 的3倍。 这就需要用目标规划。 二、目标规划的基本概念 1. 设置偏差变量 偏差变量——表示实际值与目标值之间的差异; d +——表示超出目标的差值,称为正偏差变量;当实际值超过目标值时,有d - = 0,d + > 0; d -——表示未达到目标的差值,称为负偏差变量;当实际值未达到目标值时,有d + = 0,d - > 0. 注:若实际值与目标值一致,有d - = d + = 0.

相关文档
最新文档