python 从多目标解中筛选非支配解集

文章介绍了非支配解的概念,即在多目标优化问题中不受其他解支配的解。提供了一个Python函数`no_domin_set`,用于找出给定多目标解中的非支配解。函数通过遍历并比较所有解,采用类似淘汰赛的方式找出非支配解集。
摘要由CSDN通过智能技术生成

今天写代码的时候想偷个懒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)
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值