|
Á¦ ¸ñ |
Callback ÇÔ¼ö¿¡¼ Á¦°øÇÏ´Â ÇÔ¼ö¸¦ »ç¿ëÇϼ¼¿ä |
|
ÀÛ¼ºÀÚ |
¼Ò°æÃ¶ |
ÀÛ¼ºÀÏ |
2002-01-21 |
Á¶È¸¼ö |
1598 ȸ |
|
÷ºÎÆÄÀÏ |
÷ºÎµÈ ÆÄÀϾøÀ½.
|
|
ÇöÀç ¹®Á¦°¡ µÇ´Â ¿¹»ó ºÎºÐÀº, name class¸¦ »ç¿ëÇÏ´Â ºÎºÐ°ú, callback ÇÔ¼ö ³»¿¡¼ º¯¼öÀÇ °ªÀ» °¡Á®¿À´Â ºÎºÐÀÔ´Ï´Ù.
ù¹øÂ°, name class¸¦ »ç¿ëÇÏ´Â ºÎºÐÀÔ´Ï´Ù. ÀÌ ºÎºÐÀº ÀÌ¹Ì ilocplex.h ÆÄÀÏ¿¡¼ Á¦°øÇϰí Àֱ⠶§¹®¿¡, ¿©±â¼ ´Ù½Ã ³Ö¾îÁÙ Çʿ䰡 ¾ø½À´Ï´Ù. (#include ¸¦ ÇØÁÖ½Ã¸é µË´Ï´Ù.)
callbackÀ» »ç¿ëÇÑ ¿¹Á¦¸¦ Çϳª º¸¿©µå¸®°Ú½À´Ï´Ù.
#include ILOSTLBEGIN
IloNum oldObj = 10000; IloNum newObj = 0;
ILOMIPCALLBACK1(MyCallback, IloNumVarArray, vars) {
newObj = getIncumbentObjValue();
IloNum i = 1; if (oldObj > newObj) { cout() << \"Solution value = \" << newObj << endl; cout() << \"Values = \" << getIncumbentValue(vars[i])<< endl; cout() << \"Iterations = \" << getNiterations() << endl; oldObj = newObj; } }
int main() { ... IloCplex cplex(env); cplex.use(MyCallback(env, vars)); // À§¿¡ ¼±¾ðÇÑ callback ÇÔ¼ö »ç¿ë ... }
µÎ¹øÂ°, callback ÇÔ¼ö ³»¿¡¼ º¯¼öÀÇ °ªÀ» ºÒ·¯¿À´Â °úÁ¤¿¡¼ ¹®Á¦°¡ ¹ß»ýÇßÀ» ¼öµµ ÀÖ½À´Ï´Ù. callback ÇÔ¼ö ³»¿¡¼ ¹Ì¸® Á¦°øµÇ´Â ¸â¹öÇÔ¼öµéÀÌ ¸¹ÀÌ Àֱ⠶§¹® IloEnv °´Ã¼¿Í IloCplex °´Ã¼´Â Àμö·Î ³Ñ°ÜÁÖÁö ¾ÊÀ¸¼Åµµ µË´Ï´Ù. µû¶ó¼, ÇöÀçÀÇ ¸ñÀûÇÔ¼ö°ªÀ» °¡Á®¿À±â À§ÇØ »ç¿ëµÇ´Â getIncumbentObjValue() ÇÔ¼öó·³, ÇöÀçÀÇ º¯¼ö°ªÀ» °¡Á®¿À±â À§ÇÑ ÇÔ¼ö·Î getIncumbentValue(const IloNumVar var)°¡ Á¦°øµÇ°í ÀÖÀ¸´Ï ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇØ º¸½Ã±â ¹Ù¶ø´Ï´Ù.
:¹ÚÀμø´ÔÀÇ ±ÛÀÔ´Ï´Ù.
:¾È³çÇϼ¼¿ä. CPLEX7.0 concert tech.¸¦ »ç¿ë ÁßÀÎ KAIST ÀüÀÚ°ú ¹ÚÀμøÀÔ´Ï´Ù. :Áö³ ¹ø¿¡ ´äº¯Áּż °¨»çÇÕ´Ï´Ù. :±×·±µ¥ ¶Ç ¹®Á¦°¡ »ý°Ü¼¿ä. : :ÀÏ´Ü callback ÇÔ¼ö´Â ¸¸µé¾ú½À´Ï´Ù. :ÇÔ¼ö ¾È¿¡¼ feasible solutionÀÇ °ªµéÀ» ÀúÀåÇÏ°í ½ÍÀºµ¥¿ä... :cplex.getValue()¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇϴµ¥, : :\"0x101b352c¿¡ ÀÖ´Â ¸í·ÉÀÌ 0x00000004ÀÇ ¸Þ¸ð¸®¸¦ ÂüÁ¶Çß½À´Ï´Ù. :¸Þ¸ð¸®´Â writtenµÉ ¼ö ¾ø¾ù½À´Ï´Ù.\" : :¶ó´Â ÀÀ¿ë ÇÁ·Î±×·¥ ¿À·ù ¸Þ½ÃÁö°¡ ¶ß´Â±º¿ä... :¾î¶»°Ô ÇØ¾ß ¿À·ù ¸Þ¼¼Áö ¾øÀÌ solutionÀÇ °ªÀ» ¾òÀ» ¼ö ÀÖÀ»±î¿ä? : :Á¦°¡ ¸¸µç callback ÇÔ¼ö´Â ´ÙÀ½°ú °°½À´Ï´Ù. :==== :#define MIPCALLBACK2(name, type1, x1, type2, x2) \\ :class name : public IloCplex::MIPCallback {\\ : type1 x1;\\ : type2 x2;\\ :public:\\ : name(type1 xx1, type2 xx2) : x1(xx1), x2(xx2) {}\\ : void main();\\ :};\\ :void name::main() : :IloNum newObj, oldObj=100000; : : :MIPCALLBACK2(MyCallback, IloCplex, cplex, IloNumVarArray, var) { : newObj=getIncumbentObjValue(); : if (oldObj>newObj){ : : IloInt i=1; : if ( var[i].getName() ) cout << var[i].getName() << cplex.getValue(var[i]) << endl; : oldObj=newObj; : } :} : |
|
|
|