数模方法论-整数规划
一、基本概念
非线性规划的应用包括工程设计、资源分配、经济模型等。在求解过程中,由于非线性特性,常用的方法有梯度法、牛顿法、启发式算法等。求解非线性规划问题时,解的存在性和唯一性通常较难保证,且可能存在多个局部最优解。
非线性规划是数学建模中处理优化问题的一种方法,尤其在目标函数或约束条件为非线性时。它的基本形式可以表示为:
二、实际应用
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)