自学内容网 自学内容网

数模方法论-整数规划

一、基本概念

非线性规划的应用包括工程设计、资源分配、经济模型等。在求解过程中,由于非线性特性,常用的方法有梯度法、牛顿法、启发式算法等。求解非线性规划问题时,解的存在性和唯一性通常较难保证,且可能存在多个局部最优解。

        非线性规划是数学建模中处理优化问题的一种方法,尤其在目标函数或约束条件为非线性时。它的基本形式可以表示为:

二、实际应用

1、投资决策问题 

 三、程序代码求解方法

1、例题一

MATLAB求解 
clc,clear
x0=[150 85 150 145 130 0];
y0=[140 85 155 50 150 0];
q=[243 236 220.5 159 230 52];
xy0=[x0; y0];
d0=dist(xy0);   %求矩阵各个列向量之间的距离
d0(find(d0==0))=inf;
a0=asind(8./d0)  %以度为单位的反函数
xy1=x0+i*y0
xy2=exp(i*q*pi/180)
for m=1:6
     for n=1:6
         if n~=m
         b0(m,n)=angle((xy2(n)-xy2(m))/(xy1(m)-xy1(n))); 
         end
     end
end
b0=b0*180/pi;
dlmwrite('txt1.txt',a0,'delimiter', '\t','newline','PC');
dlmwrite('txt1.txt','~','-append');       %往纯文本文件中写LINGO数据的分割符
dlmwrite('txt1.txt',b0,'delimiter', '\t','newline','PC','-append','roffset', 1)
 Python求解 
import numpy as np

# 初始化数据
x0 = np.array([150, 85, 150, 145, 130, 0])
y0 = np.array([140, 85, 155, 50, 150, 0])
q = np.array([243, 236, 220.5, 159, 230, 52])
xy0 = np.vstack((x0, y0))

# 计算距离矩阵
def dist(xy):
    return np.linalg.norm(xy[:, np.newaxis] - xy[:, np.newaxis].T, axis=0)

d0 = dist(xy0)
d0[d0 == 0] = np.inf  # 将距离为0的值设为无穷大

a0 = np.degrees(np.arcsin(8.0 / d0))  # 以度为单位的反正弦

# 复数表示
xy1 = x0 + 1j * y0
xy2 = np.exp(1j * np.radians(q))

# 计算角度矩阵
b0 = np.zeros((6, 6))
for m in range(6):
    for n in range(6):
        if n != m:
            b0[m, n] = np.angle((xy2[n] - xy2[m]) / (xy1[m] - xy1[n]))

b0 = np.degrees(b0)

# 写入文件
np.savetxt('txt1.txt', a0, delimiter='\t', newline='\n')
with open('txt1.txt', 'a') as f:
    f.write('~\n')  # 写入分隔符
    np.savetxt(f, b0, delimiter='\t', newline='\n', fmt='%f', header='', comments='', footer='', encoding='utf-8')

2、例题二

 MATLAB求解 

function [g,h]=fun2(x);
g=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20];  %非线性不等式约束
h=[-x(1)-x(2)^2+2
x(2)+2*x(3)^2-3]; %非线性等式约束

function f=fun1(x);
f=sum(x.^2)+8;

[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')

Python求解

import numpy as np
from scipy.optimize import minimize

# 非线性不等式约束
def constraints_inequality(x):
    return np.array([
        -x[0]**2 + x[1] - x[2]**2,
        x[0] + x[1]**2 + x[2]**3 - 20
    ])

# 非线性等式约束
def constraints_equality(x):
    return np.array([
        -x[0] - x[1]**2 + 2,
        x[1] + 2*x[2]**2 - 3
    ])

# 目标函数
def objective(x):
    return np.sum(x**2) + 8

# 初始猜测
x0 = np.random.rand(3)

# 定义约束
cons = [{'type': 'ineq', 'fun': constraints_inequality},
        {'type': 'eq', 'fun': constraints_equality}]

# 优化
result = minimize(objective, x0, constraints=cons, bounds=[(0, None)]*3)

# 输出结果
print("Optimal solution:", result.x)
print("Objective function value:", result.fun)


原文地址:https://blog.csdn.net/qq_41489047/article/details/142424584

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!