今天写代码的时候想偷个懒ctrl cv一下别人的代码,找半天都在介绍什么是非支配解,真是气煞我也!
所以我也来介绍一下:😛
假设有解S1和S2,对所有目标而言,S1均优于S2,则我们称S1 支配S2,若S1没有被其他解所支配,则S1 称为非支配解(不受支配解),也称Pareto解。
关于代码:
函数输入:下面代码是对三目标的解求非支配解,将所有的解按照这三个目标拆分分别存储到a,b,c列表中就是本函数的输入。(a[i],b[i],c[i])表示第i个解
函数输出:函数的输出就是这些解里面的非支配解,和输入的格式相同
ps:不是三目标就自己改改参数个数
好像有看到别人介绍庄家法,就借用了一下这个说法,可能思路不一样(我懒得看,别被我误导,拜拜)
import copy
# 求支配解集
def no_domin_set(a1,b1,c1):
a = copy.deepcopy(a1)
b = copy.deepcopy(b1)
c = copy.deepcopy(c1)
# print("开始对决")
left=0
# print(a)
# print(b)
# print(c)
while len(a)>1:
if left==len(a):
# print("不好意思没有没参加过比赛的庄家了")
break
# print("============")
# print("当前庄主是{}-[{},{},{}]".format(left,a[left],b[left],c[left]))
right=left+1
while right<len(a):
# print("被pk的解是[{},{},{}]".format(a[right],b[right],c[right]))
if(a[left]<=a[right] and b[left]<=b[right] and c[left]<=c[right]):
# print("庄主胜利,该对手出局,换对手")
a.pop(right)
b.pop(right)
c.pop(right)
# print(a)
# print(b)
# print(c)
elif(a[left]>=a[right] and b[left]>=b[right] and c[left]>=c[right]):
# print("庄主输了,庄主出局")
a.pop(left)
b.pop(left)
c.pop(left)
right = right-1 # 保证删除一个元素后right还指向原对手
# print(a)
# print(b)
# print(c)
break
else:
# print("平局,换对手")
right = right+1
if right==len(a):
# print("没对手了,换庄家")
left = left + 1
# print(a)
# print(b)
# print(c)
# print("对决结束====")
return a,b,c
# print(a)
# print(b)
# print(c)
# a = [359.0, 293.0, 281.0, 269.0, 269.0, 264.0, 264.0, 268.0, 268.0, 267.0, 267.0, 267.0, 265.0, 265.0, 265.0, 257.0]
# b = [16, 15, 15, 14, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 13]
# c = [79.05, 20.17, 16.22, 14.63, 14.63, 18.46, 18.91, 11.57, 10.15, 12.12, 12.78, 12.83, 13.46, 13.46, 13.46, 19.88]
#
# a2,b2,c2 = no_domin_set(a, b, c)
#
# print(a2)
# print(b2)
# print(c2)