我试图在长度为n的向量中生成p个记录的最佳组合,同时确保(约束)向量中的特定元素包含在解集p中(目前基于二进制值).

我有下面的公式"SIMU_TOTAL_VOLUME",它确实可以确保解决方案集不会超过p个记录,但我不知道如何修改这个公式以确保向量中的特定元素i包含在解决方案集中(即使不是最优的).X7是根据p Select 包含哪些元素的二进制向量.

"劳动日"是一个0的向量,除了一个元素等于1(这对应于我想包含在解集中的元素).我可以按照下面的方法强制这个向量的总和为1,但是我不确定如何将它集成到"simu_total_vol"中,以使解决方案符合它.

抱歉,没有包括所有的相关信息的再现性,但完整的解决方案是非常大的.

simu_total_volume = [m.Intermediate((
(m.max2(0,base_volume[i]*(m.exp(total_vol_fedi[i])-1)) * x3[i] +
m.max2(0,base_volume[i]*(m.exp(total_vol_feao[i])-1)) * x4[i] +
m.max2(0,base_volume[i]*(m.exp(total_vol_diso[i])-1)) * x5[i] +
m.max2(0,base_volume[i]*(m.exp(total_vol_tpro[i])-1)) * x6[i]) + base_volume[i]) * x7[i]) for i in range(n)]

labor_day = [m.Intermediate(x8[i] * el_cppg['holiday_labor_day_flag'].values[i]) for i in range(n)]

#Require labor day to be in output
m.Equation(sum(labor_day) == 1)

#Limit max output
m.Equation(sum(x7)<=p)

m.Maximize(m.sum(simu_total_volume))

m.options.SOLVER=1

try:
    m.solve(disp = True)
except:
    continue

推荐答案

有多种方法可以约束数组中的特定元素.这里有一个完整的例子,它优化了X的元素,以最大限度地减少总成本.每个元素X可以是[0,1],并且可以用sum(X)==2 Select 两个.

from gekko import GEKKO
m = GEKKO(remote=False)
X = m.Array(m.Var,7,lb=0,ub=1,integer=True)
c = [1.2,0.95,1.3,1.0,0.8,1.25,1.4]
m.Equation(sum(X)==2)
m.Minimize(sum([X[i]*c[i] for i in range(7)]))
m.options.SOLVER=1
m.solve()
print(f'X: {X}')

解算器 Select 两个最低的值,对应于0.950.8c个元素:

c = [1.2,0.95,1.3,1.0,0.8,1.25,1.4]
X: [[0.0] [1.0] [0.0] [0.0] [1.0] [0.0] [0.0]]

以下是一些约束解决方案的方法,例如强制始终 Select 最后一个元素:

Add an equation

m.Equation(X[-1]==1)

Set the upper and lower bounds to the specified solution

X[-1].lower=1
X[-1].upper=1

Use the 100 function

m.fix(X[-1],1)

Add an objective as a soft constraint

如果添加硬约束会产生不可行的解,请使用此方法.这将鼓励 Select 首选选项,但如果等式不满足,则不会强制执行.

m.Minimize(100*(X[-1]-1)**2)

Results

所有这些方法都返回 Select 最后一个元素(不是最优的)和成本最低的元素的正确解决方案.

X: [[0.0] [0.0] [0.0] [0.0] [1.0] [0.0] [1.0]]

Python相关问答推荐

Pydantic 2.7.0模型接受字符串日期时间或无

如何使用symy打印方程?

重新匹配{ }中包含的文本,其中文本可能包含{{var}

如何将双框框列中的成对变成两个新列

如何标记Spacy中不包含特定符号的单词?

计算组中唯一值的数量

如何在Raspberry Pi上检测USB并使用Python访问它?

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

使用groupby方法移除公共子字符串

如何指定列数据类型

如何在Python中使用另一个数据框更改列值(列表)

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

提高算法效率的策略?

在二维NumPy数组中,如何 Select 内部数组的第一个和第二个元素?这可以通过索引来实现吗?

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

如何用FFT确定频变幅值

用0填充没有覆盖范围的垃圾箱

遍历列表列表,然后创建数据帧

#将多条一维曲线计算成其二维数组(图像)表示

如何删除剪裁圆的对角线的外部部分