python优化问题,Python中的优化问题

I need to solve a problem. I have 5 devices. They all have 4 kind of I/O types. And there is a target input/output combination. At first step, I want to find all combinations among the devices so that the total I/O number of selected devices are all equal or greater than the target values. Let me explain:

# Devices=[numberof_AI,numberof_AO,numberof_BI,numberof_BO,price]

Device1=[8,8,4,4,200]

Device1=[16,0,16,0,250]

Device1=[8,0,4,4,300]

Device1=[16,8,4,4,300]

Device1=[8,8,2,2,150]

Target=[24,12,16,8]

There are constraints as well. In combinations, max. number of devices can be 5 at most.

At the second step, among the combinations found, I will pick the cheapest one.

Actually, I managed to solve this problem with for loops in Python. I works like a charm. But it takes too much time even though I use cython.

What other options can I benefit from for this kind of problem?

解决方案

You can use a linear programming package like PuLP. (note this also requires you to install an LP library like GLPK).

Here's how you would use it to solve the example you gave:

import pulp

prob = pulp.LpProblem("example", pulp.LpMinimize)

# Variable represent number of times device i is used

n1 = pulp.LpVariable("n1", 0, 5, cat="Integer")

n2 = pulp.LpVariable("n2", 0, 5, cat="Integer")

n3 = pulp.LpVariable("n3", 0, 5, cat="Integer")

n4 = pulp.LpVariable("n4", 0, 5, cat="Integer")

n5 = pulp.LpVariable("n5", 0, 5, cat="Integer")

# Device params

Device1=[8,8,4,4,200]

Device2=[16,0,16,0,250]

Device3=[8,0,4,4,300]

Device4=[16,8,4,4,300]

Device5=[8,8,2,2,150]

# The objective function that we want to minimize: the total cost

prob += n1 * Device1[-1] + n2 * Device2[-1] + n3 * Device3[-1] + n4 * Device4[-1] + n5 * Device5[-1]

# Constraint that we use no more than 5 devices

prob += n1 + n2 + n3 + n4 + n5 <= 5

Target = [24, 12, 16, 8]

# Constraint that the total I/O for all devices exceeds the target

for i in range(4):

prob += n1 * Device1[i] + n2 * Device2[i] + n3 * Device3[i] + n4 * Device4[i] + n5 * Device5[i] >= Target[i]

# Actually solve the problem, this calls GLPK so you need it installed

pulp.GLPK().solve(prob)

# Print out the results

for v in prob.variables():

print v.name, "=", v.varValue

Running this is extremely fast, and I get that n1 = 2 and n2 = 1 and the others are 0.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值