美文网首页
python的pulp库解决线性规划问题

python的pulp库解决线性规划问题

作者: 一路向后 | 来源:发表于2021-05-30 23:31 被阅读0次

1.问题描述

战术决策问题,某战略轰炸机队指挥官得到了摧毁敌方坦克生产能力的命令. 根据情报, 敌方有四个生产坦克部件的工厂, 位于不同的地方. 只要破坏其中任一工厂的生产设施就可以有效地停止敌方坦克的生产. 根据分析, 执行该任务的最大因素是汽油短缺, 为此项任务只能提供48000加仑汽油.而对于任何一种轰炸机来说, 不论去轰炸哪一个工厂都必须有足够往返的燃料和100加仑备余燃料.该轰炸机队现有重型和中型两种轰炸机, 其燃油消耗量及数量见下表
编号 飞机类型 每千米耗油量 飞机驾数
1 重型 1/2 48
2 中型 1/3 32
各工厂距离空军基地的距离和摧毁目标的概率见下表
工厂 距离/千米 摧毁目标概率(重型/中型)
1 450 0.10 0.08
2 480 0.20 0.16
3 540 0.15 0.12
4 600 0.25 0.20

2.源码实现

import math
import numpy as np
import pulp
  
model = pulp.LpProblem("Problem 3", pulp.LpMinimize)

u = {}
n = 2
m = 4

u[0] = range(0, n)
u[1] = range(0, m)
u[2] = np.array([0.10, 0.08, 0.20, 0.16, 0.15, 0.12, 0.25, 0.20])

a = np.array([0.5, 1/3])
b = np.array([48, 32])
c = {(i, j): u[2][2*j+i] for i in u[0] for j in u[1]}
d = np.array([450, 480, 540, 600])
u[3] = {(i, j): 2*a[i]*d[j]+100 for i in u[0] for j in u[1]}

x = {(i, j): pulp.LpVariable(cat="Integer", lowBound=0, name="x_{0}_{1}".format(i, j)) for i in u[0] for j in u[1]}

model.addConstraint(pulp.LpConstraint(e=pulp.lpSum(u[3][i, j] * x[i, j] for i in u[0] for j in u[1]), sense=pulp.LpConstraintLE, rhs=48000, name="constraint_6"))
constraints = {i: model.addConstraint(pulp.LpConstraint(e=pulp.lpSum(x[i, j] for j in u[1]), sense=pulp.LpConstraintLE, rhs=b[i], name="constraint_{0}".format(i))) for i in u[0]}

objective = pulp.lpSum((math.log(1-c[i,j])*x[i,j]) for i in u[0] for j in u[1])
model.setObjective(objective)

#print(u[3])
#print(c)

status = model.solve()

if pulp.LpStatus[status] == 'Optimal':
    for v in model.variables():
        print(v.name, v.varValue)
                        
    print(f'### Optimal value:{model.objective.value()}')

#print(48*math.log(1-c[0,3])+32*math.log(1-c[1,3]))
#print(48*700+32*500)

3.运行及其结果

$ python3 example.py
x_0_0 0.0
x_0_1 1.0
x_0_2 0.0
x_0_3 45.0
x_1_0 0.0
x_1_1 1.0
x_1_2 0.0
x_1_3 31.0
### Optimal value:-20.26064028952963

4.还原结果

所以应该去2号工厂1驾重型和1驾中型机,去4号工厂45驾重型机和31驾中型机。

相关文章

网友评论

      本文标题:python的pulp库解决线性规划问题

      本文链接:https://www.haomeiwen.com/subject/xxcvsltx.html