m0_55343311 2024-09-29 10:43 采纳率: 42.9%
浏览 4

请问用遗传算法解线性规划,用了很多scipy的算法了,都说无可行解,但matlab的fgoalattain能解出

请问用遗传算法解线性规划,用了很多scipy的算法了,都说无可行解,但matlab的fgoalattain能解出来,帮忙看看

import geatpy as ea
import numpy as np
import pandas as pd
# 构建问题
@ea.Problem.single
def evalVars(Vars):  # 定义目标函数(含约束)
    ObjV = np.sum(Vars)   # 计算目标函数值
    #x1 = Vars[0]
    #x2 = Vars[1]
    df = pd.read_csv("bf.dat", sep=" ", header=None)
    df = df.dropna(axis=1, how='all')  # 删除全是Nan的列
    df = df.T
    A = (df / (365 * 86400) )* 1000
    A = A.values
    b = np.array([2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])
    CV = np.dot(A, Vars)-b
    return ObjV, CV


problem = ea.Problem(name='soea quick start demo',
                        M=1,  # 目标维数
                        maxormins=[1],  # 目标最小最大化标记列表,1:最小化该目标;-1:最大化该目标
                        Dim=8,  # 决策变量维数
                        varTypes=[0,0,0,0,0,0,0,0],  # 决策变量的类型列表,0:实数;1:整数
                        lb=[0, 0, 0,0,0,0,0,0],  # 决策变量下界
                        ub=[np.inf, np.inf, np.inf,np.inf,np.inf, np.inf, np.inf,np.inf],  # 决策变量上界
                        evalVars=evalVars)
# 构建算法
algorithm = ea.soea_SEGA_templet(problem,
                                    ea.Population(Encoding='RI', NIND=1),
                                    MAXGEN=50,  # 最大进化代数。
                                    logTras=1,  # 表示每隔多少代记录一次日志信息,0表示不记录。
                                    trappedValue=1e-6,  # 单目标优化陷入停滞的判断阈值。
                                    maxTrappedCount=10)  # 进化停滞计数器最大上限值。
# 求解
res = ea.optimize(algorithm, seed=1, verbose=True, drawing=1, outputMsg=True, drawLog=True, saveFlag=True, dirName='result')

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-29 10:44
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码和描述,您正在尝试使用遗传算法解决线性规划问题。您提到在Python中使用Scipy的算法得到无解的结果,而Matlab的fgoalattain函数可以求解该问题。这里有几个可能的原因和解决方案:

    1. 问题定义与约束处理: 在您的代码中,线性约束是通过矩阵乘法np.dot(A, Vars)-b来定义的。请确保矩阵A和向量b正确反映了问题的约束条件。可能存在数值精度问题或者约束条件的表达有误。检查与Matlab实现的约束条件是否完全一致。
    2. 数值稳定性: 在处理大型或复杂的线性规划问题时,数值稳定性是一个重要的问题。遗传算法在求解这类问题时可能会遇到数值不稳定的情况,导致无解的结果。尝试检查问题的数值稳定性,或者尝试不同的遗传算法变种和参数设置。
    3. 算法参数设置: 在遗传算法的参数设置中,某些参数(如进化代数、停滞判断阈值等)可能需要调整以适应您特定的问题。增加进化代数或调整停滞计数器和其他相关参数可能有助于找到解。
    4. 问题复杂性: 有些线性规划问题可能非常复杂,即使是高效的算法也可能难以找到解。在这种情况下,可能需要考虑简化问题或使用其他求解方法。
    5. 与Matlab实现对比: 由于您提到Matlab的fgoalattain函数能够求解该问题,您可以尝试更仔细地对比Python实现与Matlab实现之间的差异,包括问题定义、约束处理、数值精度等,确保两个实现的等价性。

    最后,确保您使用的第三方库(如geatpy)是最新版本的,并且与您的Python环境兼容。如果这些解决方案仍然无法解决问题,可能需要更深入地检查问题的具体细节或寻求专家帮助。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月29日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?