minimize函数约束条件的循环列写(Python)

minimize函数约束条件的循环列写(Python)

我们知道python的scipy.optimize库中的minimize函数经常用来解决最优化问题,它对约束的条件有一定的格式,详见大佬的例子
https://blog.csdn.net/HappyRocking/article/details/92574229?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
但是当变量很多,但是约束又相同时,我们如何来列写约束条件呢?总不能一条条地输进去吧?之前我是先循环列写字符串格式的约束,再用eval来执行,最近经过老师一句话指点,我学会了利用map来更加简单地列写,分享给大家。
map的功能详见:https://blog.csdn.net/quanlingtu1272/article/details/95482253?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
简单说就是把一个参数代入函数来执行,当这个参数是list格式时,就可以实现循环执行某个函数并返回一串结果。
具体如何来循环列写约束条件见下面的代码,我举了一个简单的例子:

#约束条件 0<=xi<=20,i=1,...,5 这里一共五个变量,从x1到x5,拥有相同格式的约束条件  
#目标函数 xi求和最大  
from scipy.optimize import minimize  
  
number=[]  
for i in range(5):        #写一个列表来存需要循环的数字,本例是12345  
    number.append(i)  
      
def cons1(a): #列写第一种约束  
    return {'type': 'ineq', 'fun': lambda x: x[a]-0}  
  
def cons2(a): #列写第二种约束  
    return {'type': 'ineq', 'fun': lambda x: 20-x[a]}  
#后面其他约束同理  
  
def function(n,x):  #定义目标函数  
    purpose=0  
    for i in range(n):  
        purpose+=x[i]  #这里定义目标函数为累加  
    return purpose  
  
def zeros(n):  #给定变量初值  
    x0=[]  
    for i in range(n):  
        x0.append(0)  #这里假设给定各变量初值为零  
    return x0  
  
n=5  
fun=lambda x:-function(n,x) #因为是求最大值,而minimize是求最小值,所以加个负号  
x0=zeros(n)  
#利用map将number列表代入约束中,由于number的元素是1,2,3,...,这相当于循环列写了约束  
a=list(map(cons1,number))  #python3不要忘记用list  
b=list(map(cons2,number))  
#有更多约束时同理  
c=a+b #将约束列表合为一个列表  
res = minimize(fun,x0,constraints=c) # 求解最优化问题 这里约束使用了list形式  
print(res) #打印输出结果

输出结果如下:

fun: -99.99999999999979
     jac: array([-1., -1., -1., -1., -1.])
 message: 'Optimization terminated successfully.'
    nfev: 28
     nit: 4
    njev: 4
  status: 0
 success: True
       x: array([20., 20., 20., 20., 20.])

这里各个x均取最大值20,目标函数最大值为100
本人不才,望各位指正,欢迎交流!!!

  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
位置 mov ah, 0 ; 功能号为0,移动光标 int 10h ; 调用BIOS中断10h jmp input_password ; 继续输入密码 input_password_done: mov [password+di], 0 ;可以使用Python中的数学优化库`scipy`来求解带有约束条件的含对数的函数的 在密码末尾添加一个0,表示字符串结束 ret ; 返回 input_password endp ; 输出一个以$结尾最大值。具体步骤如下: 1. 安装`scipy`库: ``` pip install scipy ``` 的字符串 print_string proc mov ah, 09h ; 功能号为09h,显示字符串 print_string_loop: 2. 导入相应的库: ```python import numpy as np from scipy.optimize import minimize ``` 3. 定义 mov al, [si] ; 加载字符串中的字符到AL cmp al, '$' ; 如果遇到$,则目标函数约束条件: ```python def objective(x): return -np.log(x[0]) - np.log(x[结束循环 je print_string_done mov ah, 0eh ; 功能号为0eh,显示字符 int1]) def constraint(x): return x[0] + x[1] - 1 # 定义初始值和约束 10h ; 调用BIOS中断10h inc si ; 增加字符串指针 jmp print_string_loop ;条件类型 x0 = [0.5, 0.5] cons = {'type': 'eq', 'fun': constraint} 继续循环 print_string_done: ret ; 返回 print_string endp end start ``` 这个汇编程序实现了输入密码并用星号代替显示、检查密码文件是否存在、读取密码文件中的密码、将``` 4. 调用`minimize`函数求解最大值: ```python sol = minimize(objective, x0,密码写入密码文件等功能。你可以在 DOSBox 中使用 MASM 来汇编和链接这个程序,然后运 method='SLSQP', constraints=cons) ``` 其中,`method`参数指定了求解的优化算法,行它进行测试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值