最小化输出数量

2024-09-28 03:16:08 发布

您现在位置:Python中文网/ 问答频道 /正文

对于线性优化问题,我想包括一个惩罚。如果总和大于0,则每个选项的惩罚(惩罚[(i)])应为1,如果惩罚为0,则为0。有办法吗?你知道吗

罚款定义为:

penalties = {}
for i in A: 
    penalties[(i)]=(lpSum(choices[i][k] for k in B))/len(C)
prob += Objective Function + sum(penalties)

例如:

penalties[(0)]=0
penalties[(1)]=2
penalties[(3)]=6
penalties[(4)]=0

罚款总额应为:

sum(penalties)=0+1+1+0= 2 

Tags: inforlen定义选项线性choicessum
1条回答
网友
1楼 · 发布于 2024-09-28 03:16:08

是的。您需要做的是创建二进制变量:use_ith_row。如果第i行的choices[i][k]中的任何一个==1为>;=0(否则为0),则此变量的解释为==1。你知道吗

目标函数中的惩罚项必须是sum(use_ith_row[i] for i in A)。你知道吗

您最不需要的是强制执行上述规则的约束集:

for i in A:
    lpSum(choices[i][k] for k in B) <= use_ith_row[i]*M

最后,您需要选择足够大的M,以便当use_ith_row为1时,上面的约束没有限制效果(您通常可以很容易地计算出这个界限)。选择一个太大的M也会起作用,但会使你的问题解决得更慢。你知道吗

另外,我不知道C是什么,也不知道你为什么要除以它的长度——但通常情况下,如果这个惩罚是次要的,你会对它进行加权,这样你的主要目标的改进总是会得到更大的权重。你知道吗

相关问题 更多 >

    热门问题