python遗传算法解决分段线性约束问题

article/2025/10/2 0:04:53

问题描述

  • 模型
    在这里插入图片描述

  • 分析

  • 带有分段约束和max最值,导致使用一般的线性规划pulp问题进行求解会比较麻烦
  • 如果将分段约束转化为0/1整数规划,其余变量 u i u_i ui未必还是整数,就涉及混整问题相对麻烦,所以考虑使用遗传算法进行求解

Python代码

import numpy as np
import matplotlib.pyplot as plt
from pylab import *mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False####################初始化参数#####################
NP = 50  # 种群数量
L = 2  # 对应x,y
Pc = 0.4  # 交叉率
Pm = 0.1  # 变异率
G = 100  # 最大遗传代数########################这里定义一些参数,分别是计算适应度函数和计算约束惩罚项函数############def calc_f(X, ri, qi,k):"""计算群体粒子的目标函数值, size * N(,size表示种群数,N表示决策变量个数) """if k==1:return sum((ri - qi) * X)elif k==2:lamda =0.5return lamda * sum(ri * X) - (1 - lamda) * sum(qi * qi * X * X)def calc_e(X, qi, pi, ki, Mi):"""计算群体粒子的目惩罚项,X 的维度是 size * N(,size表示种群数,N表示N表示决策变量个数为11) """sumcost = []C_X = []for i in range(X.shape[0]):C_X = []ee = 0"""计算第一个约束的惩罚项"""e1 = max(qi * X[i]) - 250ee += max(0, e1)"""计算第二个约束的惩罚项"""for j in range(X.shape[1]):if X[i, j] > Mi[j]:CX = ki[j] + pi[j] * X[i, j]C_X.append(CX)else:CX = ki[j] + pi[j] * Mi[j]C_X.append(CX)e2 = sum(X[i] + C_X) - 50000ee += max(0, e2)sumcost.append(ee)return sumcost##############遗传操作方法#########def select(X, fitness):"""根据轮盘赌法选择优秀个体"""fitness = 1 / fitness  # fitness越小表示越优秀,被选中的概率越大,做 1/fitness 处理fitness = fitness / fitness.sum()  # 归一化idx = np.array(list(range(X.shape[0])))X2_idx = np.random.choice(idx, size=X.shape[0], p=fitness)  # 根据概率选择X2 = X[X2_idx, :]return X2def crossover(X, c):"""按顺序选择2个个体以概率c进行交叉操作"""for i in range(0, X.shape[0], 2):parent1 = X[i].copy()  # 父亲parent2 = X[i + 1].copy()  # 母亲# 产生0-1区间的均匀分布随机数,判断是否需要进行交叉替换if np.random.rand() <= c:child1 = (1 - c) * parent1 + c * parent2  # 交叉子代child2 = c * parent1 + (1 - c) * parent2  # 交叉子代X[i, :] = child1X[i + 1, :] = child2return Xdef mutation(X, m):"""变异操作"""for i in range(X.shape[0]):  # 遍历每一个个体# 产生0-1区间的均匀分布随机数,判断是否需要进行变异parent = X[i].copy()  # 父辈if np.random.rand() <= m:child = np.random.uniform(0, 25, (1, 11))  # 用随机赋值的方式进行变异子代X[i] = childreturn X# 子代和父辈之间的选择操作
def update_best(parent, parent_fitness, parent_e, child, child_fitness, child_e):"""判:param parent: 父辈个体:param parent_fitness:父辈适应度值:param parent_e    :父辈惩罚项:param child:  子代个体:param child_fitness 子代适应度值:param child_e  :子代惩罚项:return: 父辈 和子代中较优者、适应度、惩罚项"""# 规则1,如果 parent 和 child 都没有违反约束,则取适应度小的if parent_e <= 0.0000001 and child_e <= 0.0000001:if parent_fitness <= child_fitness:return parent, parent_fitness, parent_eelse:return child, child_fitness, child_e# 规则2,如果child违反约束而parent没有违反约束,则取parentif parent_e < 0.0000001 and child_e >= 0.0000001:return parent, parent_fitness, parent_e# 规则3,如果parent违反约束而child没有违反约束,则取childif parent_e >= 0.0000001 and child_e < 0.0000001:return child, child_fitness, child_e# 规则4,如果两个都违反约束,则取适应度值小的if parent_fitness <= child_fitness:return parent, parent_fitness, parent_eelse:return child, child_fitness, child_edef ga_answer1(ri, qi, pi, ki, Mi,k):"""遗传算法主函数"""best_fitness = []  # 记录每次迭代的效果best_U = []  # 存放最优Uf = np.random.uniform(0, 25, (NP, 11))  # 初始化种群for i in range(G):  # 遍历每一次迭代fitness = np.zeros((NP, 1))  # 存放适应度值ee = np.zeros((NP, 1))  # 存放惩罚项值parentfit = calc_f(f, ri, qi,k)  # 计算父辈目标函数值parentee = calc_e(f, qi, pi, ki, Mi)  # 计算父辈惩罚项parentfitness = parentfit + parentee  # 计算父辈适应度值   适应度值=目标函数值+惩罚项X2 = select(f, parentfitness)  # 选择X3 = crossover(X2, Pc)  # 交叉X4 = mutation(X3, Pm)  # 变异childfit = calc_f(X4, ri, qi,k)  # 子代目标函数值childee = calc_e(X4, qi, pi, ki, Mi)  # 子代惩罚项childfitness = childfit + childee  # 子代适应度值# 更新群体for j in range(NP):  # 遍历每一个个体X4[j], fitness[j], ee[j] = update_best(f[j], parentfitness[j], parentee[j], X4[j], childfitness[j],childee[j])best_fitness.append(fitness.min())U = X4[fitness.argmin()]best_U.append(U)f = X4# 多次迭代后的最终效果portfolio_optimal_value = -min(best_fitness)portfolio_optimal_solution = best_U[best_fitness.index(min(best_fitness))]print("最优值是:", -min(best_fitness))  # best_fitness记录最优值print("最优解是:", best_U[best_fitness.index(min(best_fitness))])  # best_U记录最优解集return portfolio_optimal_solution# 第一问答案
ri = np.array([3.5, 5.4, 4.5, 6.7, 7.7, 8.8, 8, 6.5, 7.3, 9.1, 2.3]);
qi = np.array([11, 12, 25, 25, 19, 33, 32, 31, 33, 34, 0]);
pi = np.array([0.12, 0.15, 0.15, 0.2, 0.11, 0.13, 0.18, 0.2, 0.25, 0.2, 0]);
ki = np.array([0.1, 0.2, 0.1, 0.2, 0.1, 0.2, 0.1, 0.2, 0.3, 0.2, 0]);
Mi = np.array([50, 50, 100, 50, 100, 50, 100, 50, 100, 100, 0]);
k=1
ga_answer1(ri, qi, pi, ki, Mi,k)
  • 结果
    在这里插入图片描述

优缺点

  • 优点:可以解决带分段约束的线性规划问题,当然也可以将非线性的分段约束规划转化为0/1规划,然后再利用 u i u_i ui w 1 w_1 w1 w 2 w_2 w2 w 3 w_3 w3关系,将其余 u i u_i ui都用 w 1 w_1 w1 w 2 w_2 w2 w 3 w_3 w3表示,没有试过,不过可以尝试一下
  • 缺点:遗传算法不是唯一解,变异率、变异率等参数可以调整一下,交叉和变异处可以更改交叉和变异规则,会得到不一样的效果

参考文献

遗传算法求解带约束优化问题(源码实现)


http://chatgpt.dhexx.cn/article/t729mlfm.shtml

相关文章

Python 遗传算法路径规划

了却一个心愿 文章目录 目录 文章目录 前言 二、主要内容 三、使用步骤 1.将压缩包下载解压 2.读入数据 3.最终结果 前言 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律…

遗传算法的python实现(手撕python遗传算法)

遗传算法简介 假设有无约束优化问题&#xff1a; z f ( x , y ) zf(x,y) zf(x,y) 如何通过遗传算法求解&#xff1f; 在这里需要将该优化问题与遗传算法中的概念进行对比。 f f f 对应遗传算法的适应度函数。自变量 x , y x,y x,y 对应遗传算法的个体&#xff0c;注意&#…

Python 遗传算法 Genetic Algorithm

粒子群算法常常用于在连续解空间内搜索&#xff0c;而在不连续、离散的空间内常常会出现搜索越界的问题 例如旅行商问题&#xff0c;寻找可以遍历 15 个地点的最短路径&#xff08;当然可以用二进制状态压缩 动态规划解决&#xff09;&#xff0c;以 {0, 1, ..., 14} 表示这些…

python遗传算法之geatpy学习

&#x1f63b;今天我们来学习python中的遗传算法的使用&#xff0c;我们这里使用的是geatpy的包进行学习&#xff0c;本博客主要从geatpy中的各种数据结构一步一步进行学习&#xff0c;请大家耐心看完。 &#x1f424;其实以前也学习过遗传算法&#xff0c;但是主要使用matlab…

遗传算法详解 附python代码实现

遗传算法 遗传算法是用于解决最优化问题的一种搜索算法。从名字来看&#xff0c;遗传算法借用了生物学里达尔文的进化理论&#xff1a;”适者生存&#xff0c;不适者淘汰“&#xff0c;将该理论以算法的形式表现出来就是遗传算法的过程。 问题引入 上面提到遗传算法是用来解…

遗传算法【Python】

遗传算法概念 基本思想&#xff1a; 遗传算法(GA)是一种全局寻优搜索算法&#xff0c;它依据的是大自然生物进化过程中“适者生存”的规律。它首先对问题的可行解进行编码&#xff0c;组成染色体&#xff0c;然后通过模拟自然界的进化过程&#xff0c;对初始种群中的染色体进…

遗传算法python实现

遗传算法python实现 一、问题引入二、遗传算法的步骤1.初始化2.个体评价3.选择运算4.交叉运算5.变异运算6.终止条件判断 三、实现思路1.编码的设计2.适应度函数3.选择函数4.交叉函数5.变异函数6.迭代 四、具体实现1.编码解码函数2.适应度函数3.选择函数4.交叉函数5.变异函数6.选…

遗传算法(Python)

一、遗传算法 1、遗传算法的定义 遗传算法是一种现代优化算法。根据自然界适者生存的法则&#xff0c;种群中优秀个体的基因进行遗传。每个个体的染色体通过选择、交叉和变异等过程产生新的适应度更大的染色体&#xff0c;其中适应度越大的个体越优秀&#xff0c;种群得到优化…

python遗传算法(详解)

学习代码来源于&#xff1a;遗传算法python 一.主要思想 遗传算法是根据达尔文的“适者生存&#xff0c;优胜劣汰”的思想来找到最优解的额&#xff0c;其特点是所找到的解是全局最优解&#xff0c;相对于蚁群算法可能出现的局部最优解还是有优势的。 二.主要名词 个体&…

DH算法、DHE算法、ECDHE算法演进

ECDHE 算法解决了 RSA 算法不具备前向安全的性质 和 DH 算法效率低下的问题。 ECDHE 算法具有前向安全。所以被广泛使用。 由什么演变而来 DH 算法 -- > DHE 算法 -- > ECDHE 算法 DH 算法是非对称加密算法&#xff0c;该算法的核心数学思想是离散对数。 核心数学思…

DH 算法思想 SSH解决内容篡改问题

DH算法用于交换密钥 交换密钥的目的是生成仅双方共享的密钥 交换密钥的基本过程&#xff1a; 双方确定公开的内容用各自的私钥分别对公共内容加密&#xff08;加密本质就是数学运算&#xff09;并发送给对方这时双方使用自己的密钥对收到的内容加密&#xff08;要设计运算保证…

ECDH算法详解

ECDH算法详解 ECDH算法详解DH密钥交换原理结合ECC椭圆曲线算法ECDSA签名算法 参考资料 ECDH算法详解 DH密钥交换原理 进一步解释&#xff1a; 两端&#xff08;Alice 和 Bob&#xff09;想要安全的交换信息并且第三方不能获取到该信息。当然这也是TLS协议中的目的之一&#xf…

DH算法(密钥交换算法)

一 对称加密缺点 密钥传递过程复杂&#xff0c;这是对称加密带来的困扰。 二 DH密钥交换算法特点 构建本地密钥 双方密钥一致 三 DH相关参数 四 DH算法实现过程 1、初始化发送方的密钥&#xff08;KeyPairGenerator、KeyPair、PublicKey&#xff09; 2、初始化接受方的密钥&…

SSL/TLS中的DH算法、DHE算法、 ECDHE算法介绍

❤️SSL/TLS专栏导航页❤️ 文章目录 1. DH算法简介2. DH算法协商流程3. DH算法证明4. SSL/TLS中的DH算法 1. DH算法简介 Diffie-Hellman密钥交换算法是在1976年由这两个人发明的算法。它可以在不安全的网络中&#xff0c;通过交换一些公开的信息协商出共享密钥&#xff0c;使…

一文读懂DH密钥交换算法

DH 算法是 Diffie和Hellman于1976年提出了一种的密钥交换协议。这种加密算法主要用于密钥的交换&#xff0c;可以在非安全信道下为双方创建通信密钥&#xff0c;通讯双方可以使用这个密钥进行消息的加密、解密&#xff0c;并且能够保证通讯的安全。 换而言之&#xff0c;算法希…

密钥协商算法的演变 —— RSA算法 - DH算法 - DHE算法 - ECDHE算法

文章目录 1. RSA算法RSA握手过程RSA秘钥协商算法最大的缺陷 2. DH算法3. DHE算法4. ECDHE算法ECDHE秘钥协商算法的TSL握手&#xff1a; 1. RSA算法 传统的 TLS 握⼿基本都是使⽤ RSA 算法来实现密钥交换的。在 RSA 密钥协商算法中&#xff0c;客户端会⽣成随机密钥&#xff0c…

openswan中DH算法说明

Author :Email : vip_13031075266163.comDate : 2021.01.11Copyright : 未经同意不得转载&#xff01;&#xff01;&#xff01;Version &#xff1a; openswan-2.6.51.5Reference&#xff1a;https://download.openswan.org/openswan/ 目录 1. ope…

DH法理解

旋转关节机器人 四个参数&#xff1a;a&#xff0c;α&#xff0c;d&#xff0c;θ 四个参数实际上是两组&#xff0c;先有a&#xff0c;α&#xff0c;再有d&#xff0c;θ。 a是两个转轴之间的距离&#xff08;Z轴&#xff09;&#xff0c;异面直线公垂线的长度&#xff0c;也…

DH算法及源码解读

【主流的密钥交换方式】 敏感数据信息安全传输需要对敏感信息加密&#xff0c;加密的密钥涉及到传输两端的密钥协商和交换&#xff0c;目前主要两种密钥交换的机制有&#xff1a; 1. 基于非对称密钥的实现&#xff1a;请求方用接收方的公钥加密自己的密钥&#xff0c;接收方用…

DH 加密算法的使用

DH 算法的介绍 上面介绍的 DES,3DES,AES 算法都是对称密码算法&#xff0c;所谓对称&#xff0c;在上面也解释了&#xff0c;就是加密和解密的过程中使用相同的密钥 。而现在将要介绍的是 DH 算法&#xff0c;属于非对称密码算法&#xff0c;根据对称密码的概念&#xff0c;很…