00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef KnapTreeNode_h_
00017 #define KnapTreeNode_h_
00018
00019 #include <utility>
00020
00021 #include "AlpsTreeNode.h"
00022
00023 #include "KnapModel.h"
00024
00025
00026
00027
00028 enum KnapVarStatus {
00029 KnapVarFree,
00030 KnapVarFixedToOne,
00031 KnapVarFixedToZero
00032 };
00033
00034
00035
00036 class KnapNodeDesc : public AlpsNodeDesc {
00037
00038 private:
00039
00040
00041
00042
00043
00044
00045
00048
00049
00050 KnapVarStatus* varStatus_;
00051
00053 int usedCapacity_;
00054 int usedValue_;
00055
00056 public:
00057 #if 0
00058 KnapNodeDesc()
00059 :
00060 usedCapacity_(0),
00061 usedValue_(0)
00062 {
00063 const int n =
00064 dynamic_cast<const KnapModel*>(model_)->getNumItems();
00065 varStatus_ = new KnapVarStatus[n];
00066 std::fill(varStatus_, varStatus_ + n, KnapVarFree);
00067 }
00068 #endif
00069
00070 KnapNodeDesc(KnapModel* m)
00071 :
00072 AlpsNodeDesc(m),
00073 usedCapacity_(0),
00074 usedValue_(0)
00075 {
00076
00077 const int n = dynamic_cast<KnapModel* >(model_)->getNumItems();
00078 varStatus_ = new KnapVarStatus[n];
00079 std::fill(varStatus_, varStatus_ + n, KnapVarFree);
00080 }
00081
00082 KnapNodeDesc(KnapModel* m, KnapVarStatus *& st, int cap, int val)
00083 :
00084
00085 AlpsNodeDesc(m),
00086 varStatus_(0),
00087 usedCapacity_(cap),
00088 usedValue_(val)
00089 {
00090
00091 std::swap(varStatus_, st);
00092 }
00093
00094 virtual ~KnapNodeDesc() { delete[] varStatus_; }
00095
00096
00097
00098
00099 inline void setVarStatus(const int i, const KnapVarStatus status)
00100 { varStatus_[i] = status; }
00101
00102 inline KnapVarStatus getVarStatus(const int i)
00103 { return varStatus_[i]; }
00104
00105 inline const KnapVarStatus* getVarStati() const
00106 { return varStatus_; }
00107
00108 inline int getUsedCapacity() const { return usedCapacity_; }
00109 inline int getUsedValue() const { return usedValue_; }
00110 };
00111
00112
00113
00114 class KnapTreeNode : public AlpsTreeNode {
00115 private:
00116
00117 KnapTreeNode(const KnapTreeNode&);
00118 KnapTreeNode& operator=(const KnapTreeNode&);
00119
00120 private:
00122 int branchedOn_;
00123
00124 public:
00125 KnapTreeNode() : branchedOn_(-1) {
00126 desc_ = new KnapNodeDesc(dynamic_cast<KnapModel* >
00127 (getKnowledgeBroker()->getModel()));
00128 }
00129
00130 KnapTreeNode(KnapModel* model) : branchedOn_(-1) {
00131 desc_ = new KnapNodeDesc(model);
00132 }
00133
00134 KnapTreeNode(KnapNodeDesc*& desc) : branchedOn_(-1) {
00135 desc_ = desc;
00136 desc = 0;
00137
00138
00139 }
00140
00141 ~KnapTreeNode() { }
00142
00143 void setBranchOn(int b) { branchedOn_ = b; }
00144
00145 virtual AlpsTreeNode* createNewTreeNode(AlpsNodeDesc*& desc) const;
00146
00147 virtual int process(bool isRoot = false, bool rampUp = false);
00148
00149 virtual std::vector< CoinTriple<AlpsNodeDesc*, AlpsNodeStatus, double> >
00150 branch();
00151
00152
00153 virtual AlpsEncoded* encode() const;
00154
00155 virtual AlpsKnowledge* decode(AlpsEncoded&) const;
00156 };
00157
00158 #endif