纸浆多指标插件
PuLP-MiA的Python项目详细描述
PuLP MiA是一个多索引的纸浆插件。 创建它是为了简化多索引变量的工作 当形成约束和目标函数时。在
安装
安装pulp mia的最简单方法是通过PyPi
如果您的系统上有pip:
pip install pulp-mia
否则,请按照PyPi页面上的下载说明进行操作。在
- 纸浆MiA要求:
- Python>;=3.4
- PuLP>;=1.6.10(有关详细信息,请参阅PuLP自述文件)
示例
使用Task()创建新的LP任务。要使用名称MyTask并在调试模式下创建,请使用
^{pr2}$调试模式更新任何更改的变量列表。 释放模式只在解决Lp问题之前更新。在
使用VariablesType标志设置变量类型
task = Task(VariablesType='Integer') # Continuous, Integer, Boolean
连续是默认类型。在
要形成任务,请使用Constraint()类。在
创建目标函数(标准)使用
c = Constraint('MAX') # 'MAX, 'MIN'
要设置旧变量或新变量的系数,请使用
c.setCoeff(('v'), 0.3) # v-indicator with weight 0.3 c.setCoeff(('p'), 0.7) # p-indicator with weight 0.7
设置任务使用的目标函数
task.setObjective(c)
要创建一些约束,请使用
a = Constraint('<=') # '<=', '==', '>='
要设置旧变量或新变量的系数,请使用
# 50x11 + 100x12 + 50x21 + 100x22 <= 200 a.setCoeff(('x', 1, 1), 50) a.setCoeff(('x', 1, 2), 100) a.setCoeff(('x', 2, 1), 50) a.setCoeff(('x', 2, 2), 100)
要设置a-constraint中所有变量的行组合和,请使用
a.setBValue(200)
设置任务使用限制
task.addConstraint(a)
让我们创建一个使用v-indicator和p-indicator的约束
a = Constraint('==') a.setCoeff(('x', 1, 1), 1) a.setCoeff(('x', 1, 2), 1) a.setCoeff(('v'), -1) # v = x11 + x12 task.addConstraint(a) a = Constraint('==') a.setCoeff(('x', 2, 1), 1) a.setCoeff(('x', 2, 2), 1) a.setCoeff(('p'), -1) # p = x21 + x22 task.addConstraint(a)
运行自动求解器的纸浆和观察结果使用
from pprint import pprint print(task) # name & size of task print(task.Plan) # solve and show status & objective value print('PLAN') pprint(task.PDict) # show the plan as a dict
一旦解决了计划就在这里。 默认情况下这里没有零变量。充分利用计划
pprint(task.Plan.getPDict(with_zeroe_values=True))
如果你要做一些修改(新的目标或约束),计划就会丢失。在
在求解之前,你可以得到矩阵式的任务元素
print('\nAMatrix') pprint(task.AMatrix) print('\nBVector') pprint(task.BVector) print('\nCVector') pprint(task.CVector)
查看任务中生成的变量、状态和目标使用值
pprint(task._Variables) print('\nStatus', task.Status) print('\nObjective', task.PValue)
最后,要得到生成的纸浆问题,使用
prob = task.Prob
现在看看palp MiA如何解决一些分配问题
from itertools import product from pprint import pprint from pulp_mia import Task, Constraint # SETS i_set = list(range(5)) j_set = list(range(2)) m_set = list(range(2)) g_set = list(range(4)) s_set = list(range(5)) k_set = list(range(5)) t_zad = 0.3 t_s_set = [0.05*(s + 1) for s in s_set] G = [1, 0.5, 0.36, 0.5] k_set_var = [0.5*(k + 1) for k in k_set] def get_p(k, g): return 1/(G[g]/(1.7*k_set_var[k]) + 1) alfa_p = 0.5 alfa_v = 0.5 # task task = Task(debug=True) # Objective c_new = Constraint('MAX') c_new.setCoeff(('v'), alfa_v/len(i_set)) for i, j, m, g, s, k in product(i_set, j_set, m_set, g_set, s_set, k_set): c_new.setCoeff(('x', i, j, m, g, s, k), alfa_p*get_p(k, g)/(1/(min(G)/(1.7*max(k_set_var)) + 1)*len(i_set))) task.setObjective(c_new) # Constraints # Constraint 1 for i, m, g, s, k in product(i_set, m_set, g_set, s_set, k_set): a_new = Constraint('<=') for j in j_set: a_new.setCoeff(('x', i, j, m, g, s, k), 1) a_new.setBValue(1) task.addConstraint(a_new) # Constraint 1.5 for i in i_set: a_new = Constraint('<=') for j, m, g, s, k in product(j_set, m_set, g_set, s_set, k_set): a_new.setCoeff(('x', i, j, m, g, s, k), 1) a_new.setBValue(1) task.addConstraint(a_new) # Constraint 2 for i, j in product(i_set, j_set): a_new = Constraint('<=') for m, g, s, k in product(m_set, g_set, s_set, k_set): a_new.setCoeff(('x', i, j, m, g, s, k), 1) a_new.setBValue(1) task.addConstraint(a_new) # Constraint 3 for j in j_set: a_new = Constraint('<=') for i, m, g, s, k in product(i_set, m_set, g_set, s_set, k_set): a_new.setCoeff(('x', i, j, m, g, s, k), t_s_set[s]) a_new.setBValue(t_zad) task.addConstraint(a_new) # Constraint 4 a_new = Constraint('==') for i, j, m, g, s, k in product(i_set, j_set, m_set, g_set, s_set, k_set): a_new.setCoeff(('x', i, j, m, g, s, k), 1) a_new.setCoeff(('v'), -1) a_new.setBValue(0) task.addConstraint(a_new) print(task) print(task.Plan) print('PLAN') pprint(task.PDict)
版权所有Dmitriy A.Pavlov(dpavlov239@mail.ru)麻省理工学院授权
有关版权信息,请参阅许可证文件。在
- 项目
标签: