在GLPK中对不同的等成本变量传播负载

问题描述 投票:1回答:1

GLPK是否有可能将解决方案分散到多个等成本变量上?

假设我在myprog中有这段代码:

from pymprog import *

begin()

loads = var('loads', 3)
load_cost = par('load_cost', [10, 10, 10])

sum (loads[i] for i in range(len(loads))) >= 200

for i in range(len(loads)) :
   loads[i] <= 100

minimize (sum (load_cost[i] * loads[i] for i in range(len(loads))))

solve()
end()

是否有可能要求求解器返回66,66,66三个负载而不是100,100,0?

python glpk
1个回答
1
投票

以下代码段使用gekko优化包解决了您的问题。它会产生您想要的解决方案“66,66,66”:

from gekko import GEKKO    
import numpy as np

#Initialize Model
m = GEKKO()

#initialize variables
x1,x2,x3 = [m.Var() for i in range(3)]
c1,c2,c3 = [m.Param(value=10) for i in range(3)]

#initial values
x1.value = 1
x2.value = 1
x3.value = 1


# lower bounds
x1.lower = 0
x2.lower = 0
x3.lower = 0


# upper bounds
x1.upper = 100
x2.upper = 100
x3.upper = 100


#Equations
m.Equation(x1+x2+x3>=200)

#Objective
m.Obj(x1*c1+x2*c2+x3*c3)

#Set global options
m.options.IMODE = 3 #steady state optimization

#Solve simulation
m.solve()

#Results
print('')
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))

但是,如果选择不同的初始值,解算器可能会找到其他没有均布荷载的解决方案。要强制在负载上平均分配,您应该考虑通过添加一个阴谋项来修改目标函数:

m.Obj(x1*c1+x2*c2+x3*c3+x1*x1+x2*x2+x3*x3)

使用此目标函数,无论您使用什么初始值,结果始终都是所需的。

© www.soinside.com 2019 - 2024. All rights reserved.