2016-08-23 3 views
-1

동물성 식품을 구성하기위한 적절한 성분 비율을 계산해야하는 코드를 실행 중입니다. 그것을하기 위해 나는 MS solver 기초를 사용하고있다. 나는 성분과 영양소에 대한 최소값과 최대 값을 전달하는 모델을 설정했다. (성분 비율은 다소 양분을 방해한다). 나는 동물성 식품의 가장 저렴한 (최소) 비용을 작성해야한다. 여기 내 코드가있다.해석에서 솔버가 최소값을 얻습니다.

private Solution FormularRacao() 
    { 
     var ingredientesRacao = _formulacaoRacao.CarregarIngredientesNutrientesFormulacao(true); 
     var nutrientes = _formulacaoRacao.CarregarIngredientesNutrientesFormulacao(false); 
     var formulacao = _formulacaoRacao.CarregarFormulacao(); 

     SolverContext context = SolverContext.GetContext(); 
     context.ClearModel(); 

     Model model = context.CreateModel(); 

     var objetivo = new SumTermBuilder(ingredientesRacao.Count); 
     var totalIngrediente = new SumTermBuilder(ingredientesRacao.Count); 

     List<SumTermBuilder> listaTotalNutriente = new List<SumTermBuilder>(); 

     //Set decisions 
     foreach (var item in ingredientesRacao) 
     { 
      item.Nome = TratarNome(item.Nome); 

      Decision d = new Decision(Domain.RealRange(Convert.ToDouble(item.Minimo), Convert.ToDouble(item.Maximo)), "d_" + item.Nome); 

      model.AddDecision(d); 

      objetivo.Add(Model.Product(d, Convert.ToDouble(item.Custo))); 
      totalIngrediente.Add(d); 
      listaTotalNutriente.Add(new SumTermBuilder(nutrientes.Count)); 
     } 

     var SomaIngrediente = totalIngrediente.ToTerm(); 

     //sum of decisions values must be equal 100 
     model.AddConstraint("c_totalIngrediente", SomaIngrediente == 100); 

     //totalIngrediente; 
     model.AddGoal("racao", GoalKind.Minimize, objetivo.ToTerm()); 

     int indexIngrediente = 0; 
     int indexNutriente = 0; 

     //each ingredient contributes with nutrients 
     //each nutrient has a min and max set    
     foreach (var ingredienteRacao in ingredientesRacao) 
     { 
      Ingrediente ingrediente = _formulacaoRacao.CarregarIngrediente(ingredienteRacao.Id); 
      indexNutriente = 0; 
      ingredienteRacao.Nome = TratarNome(ingredienteRacao.Nome); 
      Decision d = model.Decisions.First(x => x.Name == "d_" + ingredienteRacao.Nome); 

      foreach (var nutriente in nutrientes) 
      { 
       var valor = new object(); 

       if (nutriente.AminoacidoDigestivo.Equals("S")) 
       { 
        var aminoacidoDigestivo = _formulacaoRacao.CarregarAminoacidoDigestivo(ingredienteRacao.Id); 
        valor = aminoacidoDigestivo.GetType().GetProperty(nutriente.Nome).GetValue(aminoacidoDigestivo, null); 
       } 
       else 
       { 
        nutriente.Nome = TratarNomeNutriente(nutriente.Nome); 
        valor = ingrediente.GetType().GetProperty(nutriente.Nome).GetValue(ingrediente, null); 
       } 

       var proporcaoNutriente = Convert.ToDouble(valor.ToString()) * d; 

       listaTotalNutriente[indexNutriente].Add(proporcaoNutriente/100); 

       if (indexIngrediente == ingredientesRacao.Count - 1) //last iteration 
       { 
        var totalNutriente = listaTotalNutriente[indexNutriente].ToTerm(); 
        if (nutriente.Minimo == nutriente.Maximo) 
         model.AddConstraint("c_" + nutriente.Nome, totalNutriente == Convert.ToDouble(nutriente.Maximo));       
        else 
         model.AddConstraint("c" + nutriente.Nome, Convert.ToDouble(nutriente.Minimo) <= totalNutriente <= Convert.ToDouble(nutriente.Maximo));       
       } 

       indexNutriente++; 
      } 
      indexIngrediente++; 
     }    

     //saves the model 
     TextWriter tw = new StreamWriter("Path\file.oml"); 
     context.SaveModel(FileFormat.OML, tw); 
     tw.Close(); 

     //Imprime o modelo 
     TextWriter txt = new StreamWriter("Path\file.txt"); 
     foreach (var item in model.Constraints.ToList()) 
     { 
      txt.WriteLine(item.Name + ": " + item.Expression); 
      txt.WriteLine(); 
     } 
     txt.Close(); 

     Solution solution = context.Solve(); 

     return solution; 
    } 

결과가 설정의 최소값을 얻습니다. 즉, 해결책을 찾을 수 없습니다. 내 질문입니다 : 왜 각 결정에 대한 적절한 값을 계산하는 대신 결정에 설정된 최소 값을 고려하여 해결자가 있습니까?

+0

무엇이 정확하게 당신의 질문입니까? –

+0

솔버가 적절한 값을 계산하는 대신 결정에 설정된 최소값을 고려하는 이유는 무엇입니까? –

답변

0

모델을 모델링 할 때 실수였습니다. 코드가 정상적으로 작동했습니다. 하지만 그것은 txt 파일을 만들고 모든 제약 조건을 추가하여 문제를 해결하는 데 도움이되었습니다. 따라서 설정했던 제약 조건을 다시 확인하고 모델 파일 (oml)을 만들고이를 Excel로 가져 와서 확인할 수있었습니다. 모든 제약 조건은 모델을 해결하기 위해 설정됩니다. 코드는 내 질문에 업데이 트되므로 필요하면 txt 및 oml 파일을 만드는 방법을 확인할 수 있습니다.

관련 문제