Solution sol = new Solution(problemSet);
//用于将整个大种群划分为分配给不同任务的子种群
void departpopulation() {
// resPopulation 是一个Solution的集合数组
resPopulation = new SolutionSet[problemSet_.size()];
for (int i = 0; i < problemSet_.size(); i++)
resPopulation[i] = new SolutionSet();
for (int i = 0; i < population.size(); i++) {
// 因为优化后后的种群中每个个体有一个Skill_factors,必须要将每个个体按照其skill_factor分类
Solution sol = population.get(i);
int pid = sol.getSkillFactor();
//start 和 end 时目标函数在Problemset中的索引
int start = problemSet_.get(pid).getStartObjPos();
int end = problemSet_.get(pid).getEndObjPos();
Solution newSolution = new Solution(end - start + 1);
for (int k = start; k <= end; k++) {
//复制个体目标值
newSolution.setObjective(k - start, sol.getObjective(k));
//别忘了复制个体决策变量函数值
newSolution.setDecisionVariables(sol.getDecisionVariables());
}
resPopulation[pid].add(newSolution);
}
}
特别注意其中new solution 时候的方式Solution newSolution = new Solution(end - start + 1);
,以及对目标进行赋值时的方式,只根据特定任务赋值, newSolution.setObjective(k - start, sol.getObjective(k))
,因此此时其目标函数是end-start+1,而不是统一空间的4.
下图是此解决方案用于三目标问题时的调试结果
证明提出的方法可以解决这个问题!
void getIGD(SolutionSet pop) {
SolutionSet resPopulation = new SolutionSet();
for (int i = 0; i < pop.size(); i++) {
Solution sol = pop.get(i);
int pid = sol.getSkillFactor();
//start 和 end 时目标函数在Problemset中的索引
int start = problemSet.get(pid).getStartObjPos();
int end = problemSet.get(pid).getEndObjPos();
//最关键的是这里,需要对目标值修改为当前任务目标个数
//否则会出bug,因为统一空间的目标个数是一定的
Solution newSolution = new Solution(end - start + 1);//
for (int k = start; k <= end; k++) {
//复制个体目标值
newSolution.setObjective(k - start, sol.getObjective(k));
//别忘了复制个体决策变量函数值
newSolution.setDecisionVariables(sol.getDecisionVariables());
}
resPopulation.add(newSolution);
}
String pf1 = "PF/" + problemSet.get(1).getHType() + ".pf";
QualityIndicator indicator1 = new QualityIndicator(problemSet.get(1), pf1);
double igd1 = indicator1.getIGD(resPopulation);
System.out.println("IGD" + form.format(igd1));
}