多目标优化问题在适应度计算中的支配矩阵
function checkDomination(PopObj) {const N = PopObj.length;const M = PopObj[0].length;// 初始化支配矩阵,N*N 所有元素初始化为false// 这里from的第一个参数是一个类数组对象const dominate = Array.from({ length: N }, () => Array(N).fill(false));// 遍历所有两两不同的解对(i,j)i < jfor (let i = 0; i < N; i++) {for (let j = i + 1; j < N; j++) {let hasBetter = false;let hasWorse = false;// 遍历所有目标,判断i和j的优势for (let t = 0; t < M; t++) {const objI = PopObj[i][t];const objJ = PopObj[j][t];// 如果i在k上更优,标记hasBetter为trueif (objI < objJ) {hasBetter = true;}// 如果j在k上更优,标记hasWorse为trueelse if (objI > objJ) {hasWorse = true;}// 如果两个都为true,可提前退出循环,说明谁也不支配谁,两者有好有差if (hasBetter && hasWorse) {break;}const k = (hasBetter) ? 1 : 0 - (hasWorse ? 1 : 0);if (k === 1) {// i支配j:i至少有一个目标优于j,且无任何目标劣于j,即hasBetter为true,hasWorse为falsedominate[i][j] = true;}else if (k === -1) {// j支配i:j至少有一个目标优于i,且无任何目标劣于i,即hasBetter为false,hasWorse为truedominate[j][i] = true;}}}}return dominate;
}let PopObj = [[1,2,3],[4,5,6],[3,5,6],
];const dominate = checkDomination(PopObj);
console.log(dominate);
代码执行结果,即最后的支配矩阵
[[ false, true, true ],[ false, false, false ],[ false, true, false ]
]