我需要解决类似于背包问题的优化问题。我在这篇文章中详细介绍了优化问题:knapsack optimization with dynamic variables我实际上需要使用python而不是OPL,所以我安装了docplex和clpex包以便使用cplex优化框架。
所以这里是我想用docplex转换为python的OPL代码
{string} categories=...;
{string} groups[categories]=...;
{string} allGroups=union (c in categories) groups[c];
{string} products[allGroups]=...;
{string} allProducts=union (g in allGroups) products[g];
float prices[allProducts]=...;
int Uc[categories]=...;
float Ug[allGroups]=...;
float budget=...;
dvar boolean z[allProducts]; // product out or in ?
dexpr int xg[g in allGroups]=(1<=sum(p in products[g]) z[p]);
dexpr int xc[c in categories]=(1<=sum(g in groups[c]) xg[g]);
maximize
sum(c in categories) Uc[c]*xc[c]+
sum(c in categories) sum(g in groups[c]) Uc[c]*Ug[g]*xg[g];
subject to
{
ctBudget:
sum(p in allProducts) z[p]*prices[p]<=budget;
}
{string} solution={p | p in allProducts : z[p]==1};
execute
{
writeln("solution = ",solution);
}
这是我的第一次代码尝试:
from collections import namedtuple
from docplex.mp.model import Model
# ------------------------------------