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);