最优化方法线性规划求解实现

举报
小康不会AI 发表于 2022/08/31 20:18:27 2022/08/31
【摘要】 最优化方法线性规划求解实现

最优化方法线性规划求解实现

1.概念原理:

如果线性规划问题有可行解,那么该解必须满足 所有不等式要求

2.利用图解法求解最优值

所有不等式要求:

x 1 + x 2 < = 6 x1+x2<=6

x 1 + 2 x 2 < = 8 -x1+2x2<=8

x 1 , x 2 > = 0 x1,x2>=0

求解最大值:

m a x z = x 1 + 3 x 2 max(z= x1+3*x2)

话不多说直接上python咱们画出来:

import numpy as np
import matplotlib.pylab as plt
x2 = np.arange(-10,10.0,0.1)
x22 = np.arange(-10,10,0.1)
x_mark2=np.arange(-10,10,0.1)
x1 = 6-x2
x11=2*x22-8
plt.xlabel("x2")
plt.ylabel("x1")
x_mark1=46/3-3*x_mark2
plt.plot(x2,x1 ,label="x1+x2=6")
plt.plot(x22,x11,label="-x1+2x2=8")
plt.plot(x_mark2,x_mark1,label="x1=46/3-3x2( assume z=46/3)")
plt.title("xk_solve")
plt.ylim(0,10) # 指定y轴的范围,画出来的效果不一样
plt.xlim(0,10) # 指定y轴的范围,画出来的效果不一样
plt.legend()
plt.show()

图解

结论:一目了然,咱们Z的最大值就是46/3,三线交点为(4/3,14/3)

3.求解规划问题

要做一些香肠,现有以下原料可供选择:

原料 成本 可供数量
猪肉 23.32 30
小麦 2.46 20
淀粉 1.86 17
打算做两种香肠:
经济型:(猪肉 > 40%)
优质型:(猪肉> 60%)
一根香肠50克(0.05公斤)。
根据政府规定,我们在香肠中最多可以使用25%的淀粉,现在和屠夫已经签定了购买23公斤猪肉的合同,如果猪肉不使用就会变质。 目前市场有350根经济香肠和500根高级香肠的需求。那么我们如何最有效地生产香肠。

问题分析

直接假设使用猪肉,小麦,和淀粉的kg数分别为x猪,x小,x淀,
则有:

m i n )钱 = 23.32 x + 2.46 x + 1.86 x ( min) 钱= 23.32*x猪+2.46*x小+1.86*x淀

x < = 30 x > = 23 x猪<=30 且 x猪>=23

x < = 20 x > = 0 x小<=20 且 x小>=0

x < = 17 x > = 0 x淀<=17 且 x淀>=0

我们继续假设经济型和优质型香肠有n经,n优,经济型里含猪肉占比p猪经,优质型里含猪肉占比p猪优,经济型里含淀粉占比p淀经,优质型里含淀粉占比p淀优,
则有:

n > = 350 n > = 500 n经>=350 且 n优>=500

p 猪经 > 0.4 p 猪经 < = 1 p猪经>0.4 且p猪经<=1

p 猪优 > 0.6 p 猪优 < = 1 p猪优>0.6 且p猪优<=1

p 淀优 < = 0.25 p 淀优 > = 0 p淀优<=0.25 且p淀优>=0

p 淀经 < = 0.25 p 淀经 > = 0 p淀经<=0.25 且p淀经>=0

0 < = ( 1 p 淀优 p 猪优 ) < = 1 0<=(1-p淀优-p猪优)<=1

0 < = ( 1 p 淀经 p 猪经 ) < = 1 0<=(1-p淀经-p猪经)<=1

x = n p 猪经 + n p 猪优) 0.05 x猪=(n经*p猪经+n优*p猪优)*0.05

x = n ( 1 p 淀经 p 猪经 ) + n ( 1 p 淀优 p 猪优 ) 0.05 x小=(n经*(1-p淀经-p猪经)+n优*(1-p淀优-p猪优))*0.05

x = n p 淀经 + n p 淀优) 0.05 x淀=(n经*p淀经+n优*p淀优)*0.05

所以带入上式: 最低花费公式就为:

m i n )钱 = 23.32 ( n p 猪经 + n p 猪优 ) 0.05 ( min) 钱= 23.32*(n经*p猪经+n优*p猪优)*0.05

+ 2.46 ( n ( 1 p 淀经 p 猪经 ) + n ( 1 p 淀优 p 猪优 ) ) 0.05 +2.46*(n经*(1-p淀经-p猪经)+n优*(1-p淀优-p猪优))*0.05

+ 1.86 ( n p 淀经 + n p 淀优 ) 0.05 +1.86*(n经*p淀经+n优*p淀优)*0.05

由于n是我们自己设的变量,p也是我们自己设的变量,所以此模型不能用python的线性规划scipy求解。白给!

不过小康必须得给它解出来,咱们可以先用贪心算法,将此题强制转化为一道线性规划问题,我们根据题干我们直接玩贪的,因为淀粉最便宜,我们直接设淀粉直接占0.25,猪肉最贵,那么假设猪肉直接占0.4和0.6.这样,对应的小麦就是0.35和0.15:


import numpy as np
from scipy.optimize import linprog
c = np.array([23.32, 2.46,1.86])
print(linprog(c,bounds=([22, 30], [9.875, 9.875],[10.625,10.625])))#贪心算法10.625<17

我们发现居然全部戳戳有余,甚至猪肉还少用了1kg。那么如果不改变猪肉占比的话,我们还必须把23-22=1(kg)的猪肉给用了,不然臭了。于是我们还要做出超标的香肠。不过可以得出一个线性规划问题,就是这么用1kg猪肉和相应的占比,做出最便宜的预算:

假设n1,n2 为1kg猪肉能制作的经济型,优质型数量,则有:

m i n ( z ) = 23.32 0.4 0.05 n 1 + 0.05 0.6 n 2 min(z)=23.32*(0.4*0.05*n1+0.05*0.6*n2)

+ 2.46 ( 0.35 0.05 n 1 + 0.15 0.05 n 2 ) +2.46*(0.35*0.05*n1+0.15*0.05*n2)

+ 1.86 ( 0.25 0.05 n 1 + 0.25 0.05 n 2 ) +1.86*(0.25*0.05*n1+0.25*0.05*n2)

0.4 0.05 n 1 + 0.05 0.6 n 2 > = 1 0.4*0.05*n1+0.05*0.6*n2>=1

0.35 0.05 n 1 + 0.15 0.05 n 2 < = 20 9.875 0.35*0.05*n1+0.15*0.05*n2<=20-9.875

0.25 0.05 n 1 + 0.25 0.05 n 2 < = 17 10.625 0.25*0.05*n1+0.25*0.05*n2<=17-10.625

n 1 , n 2 > = 0 n1,n2>=0

所以我们直接利用python求出结果:

import numpy as np
from scipy.optimize import linprog
c = np.array([0.5327, 0.7413])
a_ub = np.array([[-0.4*0.05, -0.6*0.05], [0.35*0.05, 0.15*0.05],[0.25*0.05, 0.25*0.05]])
b_ub = np.array([-1, 20-9.875,17-10.625])
print( linprog(c, a_ub, b_ub,  bounds=([0, None], [0, None])))

image.png

也就是说我们要用0个经济,33.3循环个优质来消耗完最后1kg最划算。需要向上取整,则为0个经济,34个优质。

最后我们做出了350根经济香肠,534根优质香肠,经济香肠肉,小麦,淀粉占比分别为0.4,0.35,0.25.优质香肠肉,小麦,淀粉占比分别为0.6,0.15,0.25.一共需要花费557.095+约24.71=581.805(元)

将其不看做线性规划问题解法:

如果不把其看做线性规划,那么我们利用贪心发现他还少用了1kg猪肉,那我们必须适当加大猪肉占比,同时保证价格最低,所以,我们在不减少淀粉的条件下,减少小麦的用量即可,从宏观上看1kg猪肉随机加入到850个香肠中,则一定要有1kg的小麦被移除,所以最后的最低预算是:

m i n ( z ) = ( 22 + 1 ) 23.32 + 2.46 ( 9.875 1 ) + 1.86 10.625 = 577.955 ( ) min(z)=(22+1)*23.32+2.46*(9.875-1)+1.86*10.625= 577.955(元)

可以看出577.955<581.805

这1kg猪肉完全可以随机的加入到850根香肠中的任何一根里面,因为都满足要求,最后生产出来的刚好是预算最低,刚好符合数量要求,并且也用完了23kg猪肉的方案。但这并不是用所学线性规划解决。因为这不是一个线性规划问题。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。