Python学习7

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: Python学习7

总代码


import numpy as np
import pandas as pd
from tool import *
import deap as ea
address=r'data/q3.csv'
data=pd.read_csv(address)
data_40_rows=data.head(40)
 
cost_pre=data_40_rows['批发价格(元/千克)'].tolist()  #预测成本
sale_pre=data_40_rows['平均销量'].tolist()  #预测销量
for i in range(40):
    if sale_pre[i]<=2.5:
        sale_pre[i]=2.5
mean_sale=data_40_rows['平均单价']
alph=[0.1]*40 #损耗率
discount=[0.8]*40 #打折
ini_data=np.array([i]*30+[0]*10+[0.7]*40+sale_pre)
need_list=data_40_rows['Q'].tolist()
weight=[0.5]*40
 
def Modify(sale_price):
    sale=[]
    for i in range(40):
        ss=(1-(sale_price[i]-mean_sale[i])/(mean_sale[i])*weight[i])+sale_pre[i]
        sale.append(ss)
        return sale
 
def Obj_function(X):
    Objv=[]
    Cv=[]
    for i in range (len(X)):
        x=X[i]
        #目标一:最大化利润
        decide=x[:40]
        profit=x[40:80]
        nums=x[80:120]
        #计算成本
        cost=[]
        for i in range(len(cost_pre)):
            cost.append(decide[i]*cost_pre[i])
        #计算售价
        sale_price=[]
        for i in range(len(cost_pre)):
            s=cost[i]*(1+profit[i])
            sale_price.append(s)
        #计算销量
        sale_modify=Modify(sale_price)
        #计算总销售额
        w1=[]
        for i in range(len(sale_modify)):
            bad=(sale_modify[i]*alph[i])*(discount[i]*sale_price[i])
            good=(sale_modify[i]*(1-alph[i]))*(sale_price[i])
            w1.append(bad+good)
        sum_sale=sum(w1)
        #计算总成本
        w2=[]
        for i in range(len(cost)):
            w2.append(nums[i]*cost[i])
        sum_cost=sum(w2)
        penalty=0
        for i in range(40):
            if nums[i]<2.5:
                penalty-=200
        f1=sum_sale-sum_cost+penalty
        #目标二:最大化需求
        satif_need=[]
        for i in range(len(decide)):
            satif_need.append(decide[i]*need_list[i])
        f2=sum(satif_need)/sum(need_list)
 
        #确定评价函数值
        x_Objv=np.hstack([f1,f2])
        #定义约束
        list_cv=[sum(decide)-33,27-sum(decide)]
        x_Cv=np.array(list_cv)
        Objv.append(x_Objv)
        Cv.append(x_Cv)
        Objv=np.array(Objv)
        Cv=np.array(Cv)
        return Objv,Cv
problem=ea.Problem(
    name='NSGAII_for_q3',
    M=2,
    maxormins=[-1,-1],
    Dim=120,
    varTypes=[1]*40+[0]*80,
    lb=[0]*40+[0]*40+ data_40_rows['最小销量'].tolist(),
    ub=[1]*40+[1.2]*40+ data_40_rows['最大销量'].tolist(),
    evalVars=Obj_function
)
 
#混合编码
Encodings=['BG','RI']
Field1=ea.crtfld(Encodings[0],problem.varTypes[:40],ranges=np.array([problem.lb[:40],problem.ub[:40]]))
Field2=ea.crtfld(Encodings[1],problem.varTypes[:40],ranges=np.array([problem.lb[:40],problem.ub[:40]]))
Fields=[Field1,Field2]
population=ea.PsyPopulation(Encodings=Encodings,Fields=Fields,NIND=100)
 
algorithm=ea.moea_psy_NSGA2_archive_templet(
    problem,
    population,
    MAXGEN=300,
    logTras=20,
    prophetPop=ini_data,
    maxTrappedCount=20,
)
 
res=ea.optimize(algorithm,seed=1,verbose=True,drawing=1,
                outputMsg=True,drawLog=True)
print(f"最优解是:{res['Vars'][0]}")
print(f"最优解值是:{res['Vars'][0]}")
print(f"hv结果是:{res['Vars'][0]}")


代码1


ini_data=np.array([1]*30+[0]*10+[0.7]*40+sale_pre)


ini_data 是一个变量,它是一个由 Numpy 库创建的一维数组。这个数组包含了四个部分的数据,分别是值为 1 的 30 个元素、值为 0 的 10 个元素、值为 0.7 的 40 个元素和 sale_pre 中存储的元素。


代码2


x_Objv=np.hstack([f1,f2])


x_Objv 是一个 numpy 数组,它通过 np.hstack() 函数将两个数组 f1 和 f2 水平堆叠在一起。


这意味着 f1 和 f2 必须具有相同的维度,并且它们将在水平方向上进行堆叠,形成一个新的 x_Objv 数组。换句话说,x_Objv 的每一列将从 f1 和 f2 中对应的列中获取元素。


代码3


problem=ea.Problem(
    name='NSGAII_for_q3',
    M=2,
    maxormins=[-1,-1],
    Dim=120,
    varTypes=[1]*40+[0]*80,
    lb=[0]*40+[0]*40+ data_40_rows['最小销量'].tolist(),
    ub=[1]*40+[1.2]*40+ data_40_rows['最大销量'].tolist(),
    evalVars=Obj_function
)


Problem 是在 ea 模块中创建一个优化问题的类的对象。通过使用该对象,你可以定义和处理多目标优化问题。


Problem 函数调用中,传递了一些参数来设置问题的属性和限制条件:


  • name='NSGAII_for_q3':设置问题的名称为 NSGAII_for_q3。
  • M=2:表示问题有两个目标函数。
  • maxormins=[-1,-1]:表示两个目标函数都是最小化目标。
  • Dim=120:设置问题的维度为 120。
  • varTypes=[1]*40+[0]*80:指定了每个变量的类型,其中前 40 个变量是连续变量(对应 1),后 80 个变量是离散变量(对应 0)。
  • lb=[0]*40+[0]*40+ data_40_rows['最小销量'].tolist():设置了问题的变量下界(lower bound)。前 40 个变量的下界都为 0,接下来的 40 个变量仍为 0,最后 40 个变量是从 data_40_rows 中取出的一列名为 最小销量 的数据转换为列表。
  • ub=[1]*40+[1.2]*40+ data_40_rows['最大销量'].tolist():设置了问题的变量上界(upper bound)。前 40 个变量的上界都为 1,接下来的 40 个变量都为 1.2,最后 40 个变量是从 data_40_rows 中取出的一列名为 最大销量 的数据转换为列表。
  • evalVars=Obj_function:指定了用于评估变量的目标函数。


通过调用 Problem 函数,你创建了一个名为 NSGAII_for_q3 的优化问题对象,并设置了相关的属性和限制条件。


代码4


Encodings=['BG','RI']
Field1=ea.crtfld(Encodings[0],problem.varTypes[:40],ranges=np.array([problem.lb[:40],problem.ub[:40]]))
Field2=ea.crtfld(Encodings[1],problem.varTypes[:40],ranges=np.array([problem.lb[:40],problem.ub[:40]]))
Fields=[Field1,Field2]
population=ea.PsyPopulation(Encodings=Encodings,Fields=Fields,NIND=100)


首先定义了一个名为 Encodings 的列表,其中包含了两个编码类型:“BG” 和 “RI”。


接下来,使用 ea.crtfld() 函数创建了两个字段对象 Field1 和 Field2。这两个字段对象分别使用了 Encodings 列表中的第一个和第二个编码类型。


ea.crtfld() 函数的参数如下:


  • 第一个参数是编码类型,可以是 “BG”(二元编码)或 “RI”(实数编码)。
  • 第二个参数是一个列表,用于指定每个变量的类型。在这里,使用 problem.varTypes[:40] 取出了问题对象中前 40 个变量的类型。
  • 第三个参数是一个范围 (ranges) 数组,用于指定每个变量的取值范围。在这里,使用了 np.array([problem.lb[:40], problem.ub[:40]]),取出了问题对象中前 40 个变量的下界(problem.lb[:40])和上界(problem.ub[:40])。


然后,将 Field1Field2 添加到一个列表 Fields 中。


最后,通过调用 ea.PsyPopulation() 函数创建了一个名为 population 的粒子种群对象。ea.PsyPopulation() 函数的参数如下:


  • Encodings:表示个体的编码类型列表。
  • Fields:表示个体所使用的字段列表。
  • NIND:表示种群中的个体数。


在这里,将之前定义的 Encodings 列表和 Fields 列表作为参数传递给 ea.PsyPopulation() 函数,并设置了种群中的个体数为 100。


通过以上代码,你创建了一个带有两种编码的粒子种群,每个编码类型对应一个字段对象。


代码5


 
algorithm=ea.moea_psy_NSGA2_archive_templet(
    problem,
    population,
    MAXGEN=300,
    logTras=20,
    prophetPop=ini_data,
    maxTrappedCount=20,
)
 
res=ea.optimize(algorithm,seed=1,verbose=True,drawing=1,
                outputMsg=True,drawLog=True)


首先使用 ea.moea_psy_NSGA2_archive_templet() 函数创建了一个名为 algorithm 的多目标优化算法对象。这个算法是基于 NSGA-II 算法的带存档的粒子群优化算法模板。


ea.moea_psy_NSGA2_archive_templet() 函数的参数如下:


  • 第一个参数 problem:表示要解决的优化问题对象。
  • 第二个参数 population:表示种群对象。
  • MAXGEN:表示算法的最大进化代数。
  • logTras:表示在每个进化代数之后,将群体全部划分成多少个轨迹段。
  • prophetPop:预知种群,表示具有先验知识或已知最优解的种群,用于指导群体的进化。
  • maxTrappedCount:表示算法最大停滞计数值,用于提前终止算法。


然后,将 algorithm 对象传递给 ea.optimize() 函数,以进行优化操作。ea.optimize() 函数的参数如下:


  • 第一个参数 algorithm:表示要使用的优化算法对象。
  • seed:表示随机数种子,用于控制算法的随机性。
  • verbose:表示是否显示详细信息。
  • drawing:表示是否绘制图形。
  • outputMsg:表示是否输出算法的运行信息。
  • drawLog:表示是否绘制优化过程的日志。


通过以上代码,你使用了 NSGA-II 算法的带存档的粒子群优化算法模板来进行多目标优化。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
26天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
43 3
|
1月前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
33 4
|
2月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
329 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
6天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
8天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
12天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
11天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
8天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
7天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
8天前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。