我试图在长度为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