numpy 最小化--单纯形法

rkttyhzu  于 2023-01-20  发布在  其他
关注(0)|答案(3)|浏览(120)

我正在使用scipy.optimish.linprog库来计算单纯形法的最小化。我正在我的教科书中研究这个问题,我希望有人能给我指出正确的方向,因为我没有得到我期望的输出。问题是:

Minimize          w = 10*y1 + 15*y2 + 25*y3
Subject to:       y1 + y2 + y3 >= 1000
                  y1 - 2*y2    >= 0
                            y3 >= 340
with              y1 >= 0, y2 >= 0

我为此编写的代码是:

import numpy as np
import pandas as pd
from scipy.optimize import linprog
A = np.array([
[1, 1, 1],
[1,-2, 0],
[0, 0, 1]])
b = np.array([1000,0,340])
c = np.array([-10,-15,-25])
res = linprog(c, A_ub=A, b_ub=b,
bounds=(0, None))
print('Optimal value:', res.fun, '\nX:', res.x)

其输出为:

Optimal value: -18400.0
X: [   0.  660.  340.]

我希望它是:

Optimal value: -15100.0
X: [   660.  0.  340.]

我似乎找不到这个函数的一致性,但也许这是我使用它的方式。

xj3cbfub

xj3cbfub1#

你把输入设置得有点错误;请参见the manual。具体来说,您有许多符号错误。
1.向量c的符号错误;linprog使c x最小化,因此c应该正好是w = c x中的系数
1.向量b和矩阵A的符号错误。应反转它们的符号,以便从约束f(x) >= const的形式切换到linprog方法所需的形式,即小于或等于,即-f(x) <= - const
1.您缺少最后两个约束。
1.您建议的最小值为〈0,这显然是不可能的,因为w = 10*x1 + 15*x2 + 25*x3总是正的,您的约束为x1,x2,x3>=0
正确代码为:

import numpy as np
from scipy.optimize import linprog

A = np.array([[-1, -1, -1], [-1,2, 0], [0, 0, -1], [-1, 0, 0], [0, -1, 0]])
b = np.array([-1000, 0, -340, 0, 0])
c = np.array([10,15,25])

res = linprog(c, A_ub=A, b_ub=b,bounds=(0, None))

print('Optimal value:', res.fun, '\nX:', res.x)
# python2
# ('Optimal value:', 15100.0, '\nX:', array([ 660.,    0.,  340.]))
# python3
# Optimal value: 15099.999961403426 
# X: [6.59999996e+02 1.00009440e-07 3.40000000e+02]
vfhzx4xs

vfhzx4xs2#

由于y1和y2的正性可以在bounds =(0,None)下得到保证,因此代码简化如下:

import numpy as np
from scipy.optimize import linprog

A = np.array([[-1, -1, -1], [-1,2, 0], [0, 0, -1]])
b = np.array([-1000, 0, -340])
c = np.array([10,15,25])

res = linprog(c, A_ub=A, b_ub=b,bounds=(0, None))
print('Optimal value:', res.fun, '\nX:', res.x)
    • 输出:**
Optimal value: 15099.999961403195 

X: [6.59999996e+02 1.00009440e-07 3.40000000e+02]
fwzugrvs

fwzugrvs3#

clc;
format longG
%inputan data
n=12;
c=21401;
K=349500;
p=6282.627;
h=823.529;
tau=1;
M=10000000;
x0=2852;
G=100000;
d=zeros(1,n);
d_=zeros(1,n);
z=zeros(1,n);
dtopi=zeros(1,n);
%data permintaan produk sandal per periode
d(1)=42148;
d(2)=23880;
d(3)=30400;
d(4)=26240;
d(5)=28992;
d(6)=23244;
d(7)=25000;
d(8)=28500;
d(9)=23212;
d(10)=31200;
d(11)=30400;
d(12)=28800;

dbar=mean2(d);
disp('dbar')
disp(dbar)
for k=1:n
dtopi(k)=abs(d(k)-dbar);
end
disp('maks dtopi')
disp(max(dtopi'))
for k=1:n
z(k)=(d(k)-dbar)/max(dtopi);
end
disp('z lama')
disp(z')
Z=sum(abs(z));
if(Z>=1)
for i=1:n
z(i)=1/n;
end
disp('z baru')
disp(z')
for k=1:n
d_(k)=d(k)-max(dtopi)*z(k);
end
end
disp('dk')
disp(d_')
for i=1:n
y_(i)=0;
end
for i=1:n
for j=1:i
y_(i) = y_(i)+d_(j);
end
disp('yi')
disp(y_(i))
end
%deviasi maksimum data sandal
d_g=max(dtopi);
%matriks
S1=ones(n);
S2=tril(S1); %matriks segitiga bawah
S3=eye(n); %matriks identitas
S4=zeros(n); %matriks zero
% matriks Ax=b
A=[h*S2 S4 -1*S3 h*tau*S3 h*S2;
-p*S2 S4 -1*S3 p*tau*S3 p*S2;
S4 S4 S4 -1*S3 -1*S3;
S3 -M*S3 S4 S4 S4;
S2 S4 S4 S3 S2];
disp('a')
disp(A)
b=[h*(-x0+y_(1)); h*(-x0+y_(2)); h*(-x0+y_(3)); h*(-x0+y_(4)); h*(-x0+y_(5)); h*(-x0+y_(6));
h*(-x0+y_(7)); h*(-x0+y_(8)); h*(-x0+y_(9)); h*(-x0+y_(10)); h*(-x0+y_(11)); h*(-x0+y_(12));
p*(x0-y_(1)); p*(x0-y_(2)); p*(x0-y_(3)); p*(x0-y_(4)); p*(x0-y_(5)); p*(x0-y_(6));
p*(x0-y_(7)); p*(x0-y_(8)); p*(x0-y_(9)); p*(x0-y_(10)); p*(x0-y_(11)); p*(x0-y_(12));
-d_g; -d_g; -d_g; -d_g; -d_g; -d_g; -d_g; -d_g; -d_g; -d_g; -d_g; -d_g;
0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
G-x0+y_(1); G-x0+y_(2); G-x0+y_(3); G-x0+y_(4); G-x0+y_(5); G-x0+y_(6)
G-x0+y_(7); G-x0+y_(8); G-x0+y_(9); G-x0+y_(10); G-x0+y_(11); G-x0+y_(12)];
disp('b')
disp(b)
D=[c; c; c; c; c; c; c; c; c; c; c; c;
K; K; K; K; K; K; K; K; K; K; K; K;
1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;
0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0];
disp('D')
disp(D)
LB=[0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;
0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;
0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0];
disp('LB')
disp(LB)
UB=[25000; 25000; 25000; 25000; 25000; 25000;
25000; 25000; 25000; 25000; 25000; 25000;
1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1;
inf; inf; inf; inf; inf; inf; inf; inf; inf; inf; inf; inf;
25000; 25000; 25000; 25000; 25000; 25000;
25000; 25000; 25000; 25000; 25000; 25000;
inf; inf; inf; inf; inf; inf; inf; inf; inf;
inf; inf; inf];
disp('UB')
disp(UB)
x=linprog(D,A,b,[],[],LB,UB);

有人能帮我把这个matlab代码转换成python吗?我卡在linprog里了,出错了

相关问题