⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inventoryconstraint.java

📁 简介: 今天为网友提供的是JAVA源码
💻 JAVA
字号:
package com.power.pipeengine.Constraint;

import java.util.*;
import com.power.pipeengine.Entity.*;
import com.power.pipeengine.InputData.*;
import com.power.pipeengine.LPModel.*;
import com.power.pipeengine.Variable.*;
import com.power.pipeengine.*;
import com.power.lpsolver.LPSolve.*;

/**
 *
 * <p>Title: PIPE Engine</p>
 * <p>Description: Global Planning Optimization Engine</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * <p>Company: Paraster, Inc.</p>
 * @author Wei Tan
 * @version 1.0
 */

/**
 * InventoryConstraint type deals with the inventory balance at each inventory
 * facility for each bucket.
 */
public class InventoryConstraint
    extends Constraint {
  static ResourceBundle res = ResourceBundle.getBundle(
      "com.power.pipeengine.Res",
      EngineConfig.getInstance().getLocale());
  private static final InventoryConstraint INSTANCE =
      new InventoryConstraint();

  /**
   * Sole class constructor.
   */
  private InventoryConstraint() {
    setConstraintType(res.getString("INVENTORY_CONSRTAINT"));
  }

  public static InventoryConstraint getInstance() {
    return INSTANCE;
  }

  /**
   * stores all inventory constraints.
   */
  private Vector _constraints = new Vector();

  /**
   * Gets all inventory constraints.
   * @return the inventory constraint vector.
   */
  public Vector getConstraints() {
    return _constraints;
  }

  /**
   * Builds all inventory constraint at each facility.
   */
  public void buildConstraints() {
    super.publishMessage();
    Vector invFacilities = DataModel.getInstance().getFacilities().
        getInvFacilities();

    for (int i = 0; i < invFacilities.size(); i++) {
      Facility f = (Facility) invFacilities.elementAt(i);
      Vector products = f.getProducts();
      for (int j = 0; j < products.size(); j++) {
        Product p = (Product) products.elementAt(j);
        buildConstraintsByBucket(f, p);
      }
    }
  }

  /**
   * Builds inventory constraint at a given facility for a given product by
   * buckets.
   * @param f the facility where the constraints are built.
   * @param p the product for which the constraints are built.
   */
  public void buildConstraintsByBucket(Facility f, Product p) {
    Vector buckets = DataModel.getInstance().getCalendar().getBuckets();
    Vector producingRoutes = p.getProducingRoutes();
    Vector sourcingRoutes = p.getSourcingRoutes();
    InventoryVariable invVar = InventoryVariable.getInstance();
    AllocationVariable allocVar = AllocationVariable.getInstance();
    StartsVariable startsVar = StartsVariable.getInstance();
    OutsVariable outsVar = OutsVariable.getInstance();
    BackorderVariable backOrderVar = BackorderVariable.getInstance();
    BackorderOneVariable backOrderOneVar = BackorderOneVariable.getInstance();
    BackorderTwoVariable backOrderTwoVar = BackorderTwoVariable.getInstance();
    ShipOutVariable shipOutVar = ShipOutVariable.getInstance();
    ReceivingVariable rcvVar = ReceivingVariable.getInstance();
    Inventories inventories = DataModel.getInstance().getInventories();
    MinInventories minInvs = DataModel.getInstance().getMinInventories();
    MinInvVariable minInvVar = MinInvVariable.getInstance();
    LostSaleVariable lostSaleVar = LostSaleVariable.getInstance();

    int firstDmdBucket = p.getFirstDemandPeriod();
    boolean hasDemand = p.hasDemand();

    Model mdl = Model.getInstance();
    MemoryManager memMgr = MemoryManager.getInstance();

    for (int i = 0; i < buckets.size(); i++) {

      //add a new constraint to LP solver
      int rowNumber = Model.getInstance().getNumberOfRows();
      //com.power.lpsolver.LPSolve.Constraint con =
      // new com.power.lpsolver.LPSolve.Constraint( "I" + rowNumber + i, rowNumber );
      com.power.lpsolver.LPSolve.Constraint con =
          new com.power.lpsolver.LPSolve.Constraint("I" + rowNumber,
          rowNumber);

      Bucket b = (Bucket) buckets.elementAt(i);
      Bucket prevBucket = null;
      Bucket twoBucketsPrior = null;
      Bucket threeBucketsPrior = null;

      if (i >= 1) {
        prevBucket = (Bucket) buckets.elementAt(i - 1);
        //beginning inventory
        int colIdx = mdl.getModelVariables().addVariable(invVar.getVariable(f,
            p, prevBucket));
        Element elem = memMgr.getElement();
        elem.setProperties(colIdx, 1.0);
        con.addElement(elem);
        this.addMPSElem(con, colIdx, elem);
        //invVar.setObjElement( f, p, prevBucket, true );

      }

      if (i >= 2) {
        twoBucketsPrior = (Bucket) buckets.elementAt(i - 2);
      }

      if (i >= 3) {
        threeBucketsPrior = (Bucket) buckets.elementAt(i - 3);
      }

      //replenishment during the period
      for (int j = 0; j < producingRoutes.size(); j++) {
        Route r = (Route) producingRoutes.elementAt(j);
        if (r.getDestFacilityID() != f.getFacilityID())
          continue;
        if (r.getFacility().getNumWorkingDaysForBucket(b.getBucketID()) == 0) {
          continue;
        }
        Bucket bucket = outsVar.getRouteStartBucket(r, p, b);
        if (bucket != null) {
          int colIdx = mdl.getModelVariables().addVariable(outsVar.getVariable(
              p, b));
          Element elem = memMgr.getElement();
          elem.setProperties(colIdx, 1.0);
          con.addElement(elem);
          this.addMPSElem(con, colIdx, elem);
        }
      }

      //Products shipped in from other inventory points
      //-- need to consider shipment delay time for "b"
      //use mapped shipout variables as receiving variables
      Enumeration origFacilities = f.getOrignatingFacilities().elements();
      while (origFacilities.hasMoreElements()) {
        Vector shipments = (Vector) origFacilities.nextElement();
        for (int idx = 0; idx < shipments.size(); idx++) {
          Shipment s = (Shipment) shipments.elementAt(idx);
          /*if( EngineConfig.getInstance().getCollator().compare(
                s.getToProduct().getProductID(),
                p.getProductID() ) == 0 ) {*/
          if (s.getToProduct().getProductNumber() == p.getProductNumber()) {

            Bucket shipStartBucket = rcvVar.getShippingStartBucket(s, b);
            if (shipStartBucket != null) {
              /*String varName = shipOutVar.getVariable( s.getFromFacility(),
                      f,
                      p,
                      shipStartBucket );*/
              String varName = rcvVar.getVariable(s.getFromFacility(),
                                                  f,
                                                  p,
                                                  b);

              int colIdx = mdl.getModelVariables().addVariable(varName);
              Element elem = memMgr.getElement();
              elem.setProperties(colIdx, 1.0);
              con.addElement(elem);
              this.addMPSElem(con, colIdx, elem);
            }
          }
        }
      }

      //allocation during the period
      for (int k = 0; k < sourcingRoutes.size(); k++) {
        Route r = (Route) sourcingRoutes.elementAt(k);
        if (r.getSrcingFacilityID() != f.getFacilityID())
          continue;

        if (r.getFacility().getNumWorkingDaysForBucket(b.getBucketID()) == 0) {
          continue;
        }
        String varName = allocVar.getVariable(f, p, r, b);

        int colIdx = mdl.getModelVariables().addVariable(varName);
        Element elem = memMgr.getElement();
        elem.setProperties(colIdx, -1.0);
        con.addElement(elem);
        this.addMPSElem(con, colIdx, elem);
      }

      //products shipped out to other inventory points
      Enumeration destFacilities = f.getDestinationFacilities().elements();
      while (destFacilities.hasMoreElements()) {
        Vector shipments = (Vector) destFacilities.nextElement();
        for (int idx = 0; idx < shipments.size(); idx++) {
          Shipment s = (Shipment) shipments.elementAt(idx);
          /*if( EngineConfig.getInstance().getCollator().compare(
                s.getFromProduct().getProductID(),
                p.getProductID() ) == 0 )  {*/
          if (s.getFromProduct().getProductNumber() == p.getProductNumber()) {
            String varName = shipOutVar.getVariable(f,
                s.getToFacility(),
                p,
                b);

            int colIdx = mdl.getModelVariables().addVariable(varName);
            Element elem = memMgr.getElement();
            elem.setProperties(colIdx, -1.0);
            con.addElement(elem);
            this.addMPSElem(con, colIdx, elem);
          }
        }
      }

      int colIdx;
      Element elem = null;

      //if demanded, add backorder, overproduce variables
      if (hasDemand &&
          (b.getBucketID() >= firstDmdBucket)) {
        // if( p.hasDemand( b ) ) {
        //add 1 to priority to avoid division by zero.
        int dmdPriority = p.getDemandPriority(b) + 1;
        //back order variable in this bucket
        String bVar = backOrderVar.getVariable(f, p, b);
        colIdx = mdl.getModelVariables().addVariable(bVar);
        if (EngineConfig.getInstance().isMaxOnTimeDelivery()) {
          backOrderVar.setObjElement(bVar, p, b);
        }

        elem = memMgr.getElement();
        elem.setProperties(colIdx, 1.0);
        con.addElement(elem);
        this.addMPSElem(con, colIdx, elem);

        //back order filled in the bucket after next
        String bOneVar = backOrderOneVar.getVariable(f, p, b);
        colIdx = mdl.getModelVariables().addVariable(bOneVar);
        if (EngineConfig.getInstance().isMaxOnTimeDelivery()) {
          backOrderOneVar.setObjElement(bOneVar, p, b);
        }

        elem = memMgr.getElement();
        elem.setProperties(colIdx, 1.0);
        con.addElement(elem);
        this.addMPSElem(con, colIdx, elem);

        //back order filled in the third bucket from this
        String bTwoVar = backOrderTwoVar.getVariable(f, p, b);
        colIdx = mdl.getModelVariables().addVariable(bTwoVar);
        if (EngineConfig.getInstance().isMaxOnTimeDelivery()) {
          backOrderTwoVar.setObjElement(bTwoVar, p, b);
        }

        elem = memMgr.getElement();
        elem.setProperties(colIdx, 1.0);
        con.addElement(elem);
        this.addMPSElem(con, colIdx, elem);

        //lost sale variable for this bucket (only)
        /*String lsVar = lostSaleVar.getVariable( f, p, b );
             colIdx = mdl.getModelVariables().addVariable( lsVar );
             if( EngineConfig.getInstance().isMaxOnTimeDelivery() ) {
            lostSaleVar.setObjElement( lsVar, p, b );
                                         }
                                         elem = memMgr.getElement();
                                         elem.setProperties( colIdx, 1.0 );
                                         con.addElement( elem );
             this.addMPSElem( con.getMPSRowName(), colIdx, elem );*/
        //  }

        //back order variable for last bucket
        if (b.getBucketID() > firstDmdBucket /*&&
                                            p.hasDemand( prevBucket ) */) {
          String varName = backOrderVar.getVariable(f, p, prevBucket);
          colIdx = mdl.getModelVariables().addVariable(varName);
          elem = memMgr.getElement();
          elem.setProperties(colIdx, -1.0);
          con.addElement(elem);
          this.addMPSElem(con, colIdx, elem);
          if (EngineConfig.getInstance().isMaxProfit()) {
            backOrderVar.setObjElement(varName, p, prevBucket);
          }
        }

        //back order variable for the bucket before last
        if (b.getBucketID() > (firstDmdBucket + 1) /*&&
                                            p.hasDemand( twoBucketsPrior ) */) {
          String varName = backOrderOneVar.getVariable(f, p, twoBucketsPrior);

          colIdx = mdl.getModelVariables().addVariable(varName);
          elem = memMgr.getElement();
          elem.setProperties(colIdx, -1.0);
          con.addElement(elem);
          this.addMPSElem(con, colIdx, elem);
          if (EngineConfig.getInstance().isMaxProfit()) {
            backOrderVar.setObjElement(varName, p, twoBucketsPrior);
          }
        }

        //back order variable for two buckets before
        if (b.getBucketID() > (firstDmdBucket + 2) /*&&
                                            p.hasDemand( threeBucketsPrior ) */) {
          String varName = backOrderTwoVar.getVariable(f, p, threeBucketsPrior);

          colIdx = mdl.getModelVariables().addVariable(varName);
          elem = memMgr.getElement();
          elem.setProperties(colIdx, -1.0);
          con.addElement(elem);
          this.addMPSElem(con, colIdx, elem);
          if (EngineConfig.getInstance().isMaxProfit()) {
            backOrderVar.setObjElement(varName, p, threeBucketsPrior);
          }
        }

      }

      //ending inventory
      colIdx = mdl.getModelVariables().addVariable(invVar.getVariable(f, p, b));
      elem = memMgr.getElement();
      elem.setProperties(colIdx, -1.0);
      con.addElement(elem);
      this.addMPSElem(con, colIdx, elem);
      if (i < (buckets.size() - 1)) {
        //invVar.setObjElement( f, p, b, false );
      }

      //MinInventory requirement
      if (minInvs.hasMinInvReqmt(p, b)) {
        colIdx = mdl.getModelVariables().addVariable(minInvVar.getVariable(f, p,
            b));
        elem = memMgr.getElement();
        elem.setProperties(colIdx, -1.0);
        con.addElement(elem);
        this.addMPSElem(con, colIdx, elem);
      }

      //RHS
      double invQty = inventories.getInventoryQty(p.getProductID(),
                                                  f.getFacilityID(),
                                                  b.getBucketID());
      if (b.getBucketID() < firstDmdBucket) {
        con.setRHS( -invQty);
      }
      else {
        double rhs = -invQty + p.getDemand(b.getBucketID());
        con.setRHS(rhs);
      }

      //store constraint
      con.setSign("=");

      mdl.addConstraint(con);
    }
  }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -