我对优化问题不熟悉,并且正在研究一个简单的最大化问题,我可以用Excel非常简单地解决这个问题。但是,我需要用Python扩展它,并且需要一些帮助
我有一份不同食物的菜单,我需要最大化我的能量输出。例如:
考虑到以下约束条件,我需要最大化能量(e):
问题表述:
变量: X(m,i)→ 二进制变量 ={1,如果选择了宏m和项目i,则为0,否则为}
最大化e(m,i)*X(m,i)
参数: 卡路里(C)——>;每种食物的卡路里(宏量、食物量)
受限制: 对于每m,∑X(m,i)<;=1(每个宏只能选择1项) ∑c(m,i)*X(m,i)/X(i)<;=N(热量消耗限制为常数N)
到目前为止,我认为这是一个带有非线性约束的混合整数问题
如何使用Python解决这个问题?我是否误解了这里的问题
更新:
上面缺少由于mean
而添加的非线性组件。我将问题从total
上的约束更新为mean
上的约束。在一个非数学术语中,我取所有宏相乘后得到的数字的平均值,因为我希望我的平均热量小于常数N
所以从数学上来说, ∑c(m,i)*X(m,i)/X(i)<;=N(平均卡路里消耗量限制为常数N)
正如您已经提到的,
scipy.optimize.minimize
无法处理混合整数问题(MIP)。我们所能做的最多的是尝试通过惩罚方法来解决MIP,即向目标添加惩罚函数,如1.0/eps * np.sum(x*(1 - x))
,其中eps > 0
是给定的惩罚参数x
anp.ndarray
但是,使用MIP解算器解决问题要方便得多。由于您的问题具有众所周知的背包式结构,因此您可以期望即使是非商业MIP解算器(默认情况下,纸浆使用CBC)也能利用问题的底层结构。在这里,我推荐以下公式:
可以这样建模和求解:
这就产生了
相关问题 更多 >
编程相关推荐