www.gusucode.com > mbcview 工具箱matlab源码程序 > mbcview/@cgoptimnode/createSumOptimization.m

    function sumNd = createSumOptimization(nd,pOut)
%CREATESUMOPTIMIZATION Create a sum optimization from a point optimization
%
%   SUMOPTIMNODE = CREATESUMOPTIMIZATION(POINTOPTIMNODE) creates a new sum
%   optimization from a point optimization. If the point optimization
%   contains a point optimization output, then the initial values for the
%   sum optimization are taken from the output node. Any objectives are
%   converted to sum objectives.
%
%   See also CGOPTIM/CONVERTTOSUM

%   Copyright 2007-2015 The MathWorks, Inc.

% Perform checks
pPointOptim = getdata(nd);
Data = getinitialvaluedata(pPointOptim.info);
DataSize = cellfun(@(x) size(x,2), Data);
maxSize = max(DataSize);
if maxSize > 1
    % This method can only convert a point optimization
    error('mbc:cgoptimnode:InvalidState', ...
        'A sum optimization can only be created from an optimization containing scalar input variables only.');
end

pSum = address(duplicate(nd));
if strcmp(pPointOptim.getfunctionfile,'mbcOSmodalopt')
    iCreateModalSumOptim(pSum.info)
elseif strcmp(pPointOptim.getfunctionfile,'mbcOSmultistart')
    iConvertToFmincon(pSum.info)
elseif strcmp(pPointOptim.getfunctionfile,'mbcOSgamultiobj')
    pConvertGamultiobjPointToSum(nd, pSum.info, pOut)
end
ptName = getname(nd);
sumName = sprintf('Sum_%s', ptName);
sumNd = info(pSum);
sumNd = setname(sumNd, uniquename(project(nd),sumName));

% delete children
children(info(sumNd),@delete);
% update connections matrix
UpdateConnections( info(project(nd)), pSum);
% Get a valid point optimization output from the duplicated optimization
sumNd = info(pSum);
pointOutput = i_getOutput(sumNd,pOut);

% Convert the optimization to a sum
pSumOptim = getdata(sumNd);
pSumOptim.info = convertToSum(pSumOptim.info, pointOutput);


function iCreateModalSumOptim(nd)

pOpt= getdata(nd);
optim= info(pOpt);

pFree= getfreevalues(optim);

ModeVar = get(getParameters(optim),'ModeVariable');
% remove mode variable from optimization
if ModeVar>0 && ModeVar<=length(pFree) && ModeVar==fix(ModeVar)
    pFree(ModeVar)= [];
    optim = changeFreeVariables(optim,pFree);
end

for i=length(getObjectiveFunc(optim)):-1:2
    % delete other objectives
    optim = deleteObjectiveFunc(optim,i);
end

% change to use fmincon
optim = changeAlgorithm(optim,'mbcOSfmincon');
pOpt.info = optim;


function iConvertToFmincon(nd)

pOpt= getdata(nd);
optim= info(pOpt);
% change to use fmincon
optim = changeAlgorithm(optim,'mbcOSfmincon');
pOpt.info = optim;


function out = i_getOutput(nd,pAllOutNd)

% Find all the acceptable point optimization outputs
pSumOptim = getdata(nd);
idxPoint = pveceval(pAllOutNd, @i_isAcceptablePointOutput, pSumOptim);
idxPoint = [idxPoint{:}];

% Must return a point optimization output
if any(idxPoint)
    % Point optimization output nodes
    pPointOutNd = pAllOutNd(idxPoint);
    
    % From the list of point optimization outputs, return the one that is
    % non preserved or the last one in the list
    isFixed = pveceval(pPointOutNd, @isPreserved);
    isFixed = [isFixed{:}];
    idx = find(~isFixed);
    if isempty(idx)
        idx = length(pPointOutNd);
    end
    pOut = pPointOutNd(idx).getdata;
    out = pOut.info;
else
    out = [];
end

function stat = i_isAcceptablePointOutput(outNd, pSumOptim)

% An acceptable point optimization output is one which has at least one
% acceptable run and at least one quantity in common with the optimization
pOut = getdata(outNd);
stat = i_outputIsPoint(pOut.info) && ...
    ~isempty(i_acceptableRunsSols(pOut.info)) && ...
    ~isempty(i_findMatchedFactors(pSumOptim.info, pOut.info));


function [RunSel, SolInd] = i_acceptableRunsSols(pointOutput)

% Return the indices of the acceptable runs and solutions
objNames = getColumnNames(pointOutput, ...
    'OutputFormat', 'cell', 'OutputContents', 'Objectives');
nObj = length(objNames);
if nObj > 1 && hasSelectedSolution(pointOutput)
    SolInd = -1;
else
    SolInd = 1;
end
idxSel = isAcceptable(pointOutput, 1:getNumRuns(pointOutput), SolInd);
RunSel = find(idxSel);

function [pCommonFacs, matchedSumNames] = i_findMatchedFactors(optim, pointOutput)

% Return the common input factors between the new sum optimization and the
% specified point optimization output
[~, pInp] = getinitialvaluedata(optim);
sumInputNames = pveceval(pInp, @getname);
OutputNames = getColumnNames(pointOutput, 'OutputFormat', 'cell', ...
    'OutputContents', {'FreeVars', 'FixedVars', 'Objectives', 'Constraints'});
ism = ismember(sumInputNames, OutputNames);
pCommonFacs = pInp(ism);
matchedSumNames = sumInputNames(ism);

function stat = i_outputIsPoint(output)

nFreeOut = getNumFreeVariables(output);
nFixedOut = getNumFixedVariables(output);
stat = all([nFreeOut, nFixedOut] == 1);