上小节(在PlatEMO v2.9中增加多模态多目标算法(1))中,我已经在PlatEMO v2.9
的框架中增加了属性和方法,在该小节我们需要改调用计算指标那部分代码,以保证PlatEMO v2.9
中增加多模态多目标算法后,不会影响其他算法的运行。
在GUI
文件夹中Modules
的module_test
中cb_metricList()
方法传入的参数是PopObj
和PF
,对应的代码分别是obj.data(current).result{end,2}
和obj.data(current).Global.PF
%% Calculate the metric value of the final population function cb_metricList(obj,hObject,eventdata) current = obj.control.resultList.index; if current > 0 && ~isempty(obj.data(current).result) metric = obj.control.metricList.string; if ~isfield(obj.data(current).metric,metric) obj.data(current).metric.(metric) = obj.Metric(str2func(metric),obj.data(current).result{end,2},obj.data(current).Global.PF); end obj.control.metricLabel.handle.String = sprintf('%.4e',obj.data(current).metric.(metric)); else obj.control.metricLabel.handle.String = ''; end end
在GUI
文件夹中Modules
的module_test
中cb_metricList()
方法中我们需要传入PopObj
、PF
、PopDec
、PS
、fname
和repoint
,增加的代码如下:
%% Calculate the metric value of the final population function cb_metricList(obj,hObject,eventdata) current = obj.control.resultList.index; if current > 0 && ~isempty(obj.data(current).result) metric = obj.control.metricList.string; if ~isfield(obj.data(current).metric,metric) obj.data(current).metric.(metric) = obj.Metric(str2func(metric),{obj.data(current).result{end,2},obj.data(current).Global.PF,obj.data(current).result{end,3},obj.data(current).Global.PS,obj.data(current).Global.fname,obj.data(current).Global.repoint}); end obj.control.metricLabel.handle.String = sprintf('%.4e',obj.data(current).metric.(metric)); else obj.control.metricLabel.handle.String = ''; end end
由于module_test
中cb_metricList()
方法会跳到module
类的Metric()
方法中,我们需要对Metric()
中的内容进行更改,更改情况如下:
%% Calculate the specified metric value of a population function value = Metric(obj,metric,Parameter) [PopObj,PF,PopDec,PS,fname,repoint] = deal(Parameter{:}); if isa(PopObj,'INDIVIDUAL') PopObj = PopObj(all(PopObj.cons<=0,2)).objs; end NonDominated = NDSort(PopObj,1) == 1; try value = metric({PopObj(NonDominated,:),PF,PopDec(NonDominated,:),PS,fname,repoint}); catch value = NaN; end end end
下一个小节我会展示更改后PlatEMO v2.9
的计算指标的代码,以保证与这节修改代码的接口相同。