private static Double calculateCost_Network(
     int i, IChromosome chromos, IMSApplication app, IMSProvider prov) {
   MSApplicationNode node = app.getNodes().get(i);
   Double cpu_cost = cpuCost(node, prov);
   Double r_cost = ramCost(node, prov);
   Double s_cost = storageCost(node, prov);
   Double net_cost = netCost(i, chromos, app, prov);
   // System.out.println(r_cost + " + " + s_cost);
   return r_cost + s_cost + cpu_cost + net_cost;
 }
  @Override
  public double evaluateGlobalPolicy(
      int gene_index,
      IChromosome chromos,
      IMSApplication app,
      IMSProvider prov,
      InternetEstimator internet) {
    List<MSApplicationNode> nodes = app.getNodes();
    MSApplicationNode node = nodes.get(gene_index);
    Double budget = (Double) node.getCharacteristic().get(Constant.BUDGET);
    Double cost = calculateCost_Network(gene_index, chromos, app, prov);

    ((CIntegerGene) chromos.getGene(gene_index)).setAllocationCost(cost);

    Double maxCost = budget;
    double distance = calculateDistance_ErrHandling(cost, budget, maxCost);

    return distance * getWeight();
  }
  private static double netCost(
      int gene_index, IChromosome chromos, IMSApplication app, IMSProvider prov) {
    Double costPerNet = (Double) prov.getNetwork().getCharacteristic().get(Constant.COST_BW);

    Gene[] genes = chromos.getGenes();
    int current_prov = (int) genes[gene_index].getAllele();
    MSApplicationNode curr_node = app.getNodes().get(gene_index); // this is safe
    int geneVmId = curr_node.getID();
    MSApplication am = (MSApplication) app;
    double cost = 0;
    Set<ApplicationEdge> set = am.getEdges();
    for (ApplicationEdge e : set) {
      if (e.getSourceVmId() == geneVmId) {
        int target_index = MSPolicy.getGeneIndexFromNodeId(e.getTargetVmId(), genes, app);

        int tProvId = (int) genes[target_index].getAllele();
        cost += CostComputer.computeLinkCost(e, geneVmId, current_prov, tProvId, costPerNet);
      }
    }
    return cost;
  }