Mid9ts
大学生
Mid9ts的博客

[数学建模]-使用scipy解决非线性规划时矩阵形式约束条件的循环列写方法

1.概述

约束条件的写法,各种教程都有而且写得比我好。不过最近遇见了一个困难便是表达一致但是数量很多的约束条件该怎么写。具体可以翻到下面看看那个例子。

想要一条一条列出约束条件会极其麻烦,所以调用了一个map函数,理解就和数学中的映射一样,给定函数和定义域,返回值域的集合。只要生成了$i$和$j$对应关系的列表,便可以通过map函数生成约束条件的列表。

2.理解

举个例子,如果要得到约束条件$M_{ij}+x_i+x_j \geq 0,(0 \leq i,j \leq 2)$,首先需要生成$i,j$对应关系的列表

i_list=[0,0,0,1,1,1,2,2,2]

j_list=[0,1,2,0,1,2,0,1,2]

def ijs():
    i_s=[]
    j_s=[]
    for m in range(0,2):
        for n in range(0,2):
            i_s.append(m)
            j_s.append(n)
    return i_s,j_s

然后定义约束函数

def cons(i,j):
    return {'type':'ineq','fun':lambda x:M[i,j]+x[i}+x[j]}

接着使用map函数,返回的是字典的列表(?)

i_list,j_list = ijs()
cons0=list(map(cons,i_list,j_list))

此时这种约束条件已经完成了,如果还想添加别的约束条件,可以写成列表的形式,然后相加。比如现在我想添加一个$x_{0}<100$

def cons1()
    cons=[{'type':'ineq','fun':lambda x:100-x[0]}]
    return cons
cons1=cons1()
cons=cons0+cons1

3.例子

$$ \min \sum_{i=0}^2 f(x_i)+4(x_0-40)+4(x_0+x_1-100) $$ $$ s.t. \begin{cases} x_0\geq 40 \\ x_1+x_0\geq 100 \\ x_2+x_1+x_0\geq 180 \\ x_1,x_2 \geq 0\\ x_i\leq 100 \end{cases} $$
from scipy.optimize import minimize
import numpy as np

def prob1(x):  #定义目标函数
    fun=0
    for i in range(0,3):
        fun=fun+(50*x[i]+0.2*x[i]**2)
    fun=fun+4*(x[0]-40)
    fun=fun+4*(x[1]+x[0]-100)
    return fun

def cons1(i):  #定义第一种约束
    return {'type':'ineq','fun':lambda x:(100-x[i])}

def cons2():  #定义第二种约束
    cons=[{'type':'ineq','fun':lambda x:(x[0]-40)},
          {'type':'ineq','fun':lambda x:(x[0]+x[1]-100)},
          {'type':'ineq','fun':lambda x:(x[0]+x[1]+x[2]-180)},
          {'type':'ineq','fun':lambda x:(x[1])},
          {'type':'ineq','fun':lambda x:(x[2])}]
    return cons

def i_in_cons1():
    return [0,1,2]

cons1_i=i_in_cons1()
cons1=list(map(cons1,cons1_i))
cons2=cons2()
cons=cons1+cons2

x0=np.zeros((1,3))
res = minimize(prob1,x0,constraints=cons)
print(res)

结果

      fun: 11279.9999998037
     jac: array([77.99987793, 78.00012207, 78.00012207])
 message: 'Optimization terminated successfully'
    nfev: 16
     nit: 4
    njev: 4
  status: 0
 success: True
       x: array([49.99960038, 60.00012136, 70.00027826])
# # #
首页      科研      代码      [数学建模]-使用scipy解决非线性规划时矩阵形式约束条件的循环列写方法

发表评论

textsms
account_circle
email

Mid9ts的博客

[数学建模]-使用scipy解决非线性规划时矩阵形式约束条件的循环列写方法
1.概述 约束条件的写法,各种教程都有而且写得比我好。不过最近遇见了一个困难便是表达一致但是数量很多的约束条件该怎么写。具体可以翻到下面看看那个例子。 想要一条一条列出约束…
扫描二维码继续阅读
2022-04-06