如何修改CPLEX中基于tuple筛选夜间作业集合的代码
问题原因
你原代码的筛选逻辑存在错误:你定义的nightyes集合是所有作业的nightyes取值集合,对应你给出的示例数据,这个集合实际值为{0,1}。你在筛选集合D时引入了无关的n in nightyes迭代,只要nightyes集合里存在值为1的元素,所有作业都会被判定为符合条件,自然会返回全部作业。
正确修改方案
你不需要额外定义nightyes集合,直接匹配每个tuple元素自身的nightyes属性即可,修改后代码如下:
tuple night { int jobs; int nightyes; } {night} jobsnotturni = {<1,1>, <2,0>,<3,0>,<4,1>,<5,1>}; // 直接筛选当前tuple的nightyes属性等于1的作业 {int} D = {i.jobs | i in jobsnotturni : i.nightyes == 1};
修改后生成的D就是你预期的{1,4,5}。
如果你出于其他逻辑需要必须保留nightyes集合的定义,需要把迭代变量n和当前i的属性绑定,写法如下(该写法冗余,不推荐使用):
tuple night { int jobs; int nightyes; } {night} jobsnotturni = {<1,1>, <2,0>,<3,0>,<4,1>,<5,1>}; {int} nightyes = {i.nightyes|i in jobsnotturni }; // 绑定n等于当前i的nightyes属性再判断是否为1 {int} D = {i.jobs|i in jobsnotturni, n in nightyes : n == i.nightyes && n == 1};
内容的提问来源于stack exchange,提问作者Francesca
相关产品推荐
相关产品推荐

