用python做整数规划

该博客展示了如何利用Pyomo库建立混合整数线性规划模型。作者首先定义了模型的参数、变量、目标函数和约束,并在两种不同情况下调整了约束条件。然后,通过随机生成的数据初始化模型,并使用COPT求解器进行五次求解,记录每次的运行时间和目标函数值。
摘要由CSDN通过智能技术生成
import pyomo.environ as pyo

def build_model(v, a=0):
    model = pyo.ConcreteModel()

    # creat indices and sets
    model.I = pyo.Set(initialize=range(1,51))
    model.J = pyo.Set(initialize=list(range(1,201)))

    # #input data
    # mu = 5
    # sigma = 10
    # def c_init(model, i, j):
    #     c_data = np.random.randn(1) * sigma +mu
    # model.f = pyo.Param(model.I, initialize = 50)
    # model.c = pyo.Param(model.I, model.J, initialize = c_init)

    # input data
    model.f = pyo.Param(model.I, initialize = 50)
    model.c = pyo.Param(model.I, model.J, initialize=v)

    # decision varibles
    model.x = pyo.Var(model.I, model.J, within=pyo.Binary)  # give a initial value is crucial
    model.y = pyo.Var(model.I, within=pyo.Binary)

    # objective function
    def Obj_rule(m):
        return pyo.summation(m.f, m.y) + sum(sum(m.c[i,j] * m.x[i,j] for j in m.J) for i in m.I)

    model.Obj = pyo.Objective(rule=Obj_rule)

    # Constraints
    def must_be_served(m, j):
        return sum(m.x[i,j] for i in m.I) == 1

    model.must_be_served_constraints = pyo.Constraint(model.J, rule=must_be_served)

    if a == 0:
        def facility_open(m, i):
            return  sum(m.x[i,j] for j in m.J) <= 100*m.y[i]
        model.facility_open_constraint = pyo.Constraint(model.I,rule=facility_open)
    else:
        def facility_open(m, i,j):
            return m.x[i,j]<= m.y[i]
        model.facility_open_constraint = pyo.Constraint(model.I, model.J, rule=facility_open)
import random
import pyomo.environ as pyo
from pyomo.opt import SolverFactory

import time 

solver = SolverFactory('coptampl')

import Lab5_homework_model1_Q4 as Lab5_homework_model1

def v_init():
    v = dict()
    for i in list(range(1,51)):
        for j in list(range(1,201)):
            #v[i,j] = np.random.randn(1)* 5 + 10
            v[i,j] = random.random()*5 + 10
    return v

for itr in range(5):
    v = v_init()
    
    model1 = Lab5_homework_model1.build_model(v,a=0)
    
    model2 = Lab5_homework_model1.build_model(v,a=1)
    
    time_st1 = time.time()
    results1 = solver.solve(model1, tee = True)
    print(results1)
    time_end1 = time.time()
    print("The solver returned a status of:" + str(results1.solver.status))

    results2 = solver.solve(model2, tee = True)
    print(results2)
    time_end2 = time.time()
    print("The solver returned a status of:" + str(results2.solver.status))

    with open('Q4.txt','a') as f:
        f.write('ObjectVal of model1 for ' + str(itr+1) + ' times result:' +str(pyo.value(model1.Obj)) + '  used time(sec): ' + str(time_end1-time_st1))
        f.write('\r')
        f.write('ObjectVal of model2 for ' + str(itr+1) + ' times result:' +str(pyo.value(model2.Obj)) + '  used time(sec): ' + str(time_end2-time_end1))
        f.write('\r')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值