Вы можете добавить штраф за нарушение цели. Идея состояла бы в том, чтобы ввести две новые переменные решения, скажем under
и over
, и добавить ограничения, которые скажут
problem += gramsOfMeat*1.29 + gramsOfPasta*3.655 + gramsOfOil*9 - target_calories <= under
problem += target_calories - (gramsOfMeat*1.29 + gramsOfPasta*3.655 + gramsOfOil*9) <= over
Затем измените вашу целевую функцию на что-то вроде
problem += c_under * under + c_over * over
где c_under
- штраф за единицу за нахождение под целью, а c_over
- штраф за превышение. (Это параметры.) Если вы хотите наложить жесткую границу на верх / низ, вы можете добавить новые ограничения:
problem += under <= max_under
problem += over <= max_over
, где max_under
и max_over
- максимально допустимые отклонения (опять же, параметры).
Одно замечание: ваша модель немного странная, потому что на самом деле она не имеет целевой функции. Обычно в проблеме диеты вы хотите минимизировать затраты или максимизировать калории или что-то в этом роде, и в целом в линейном программировании вы хотите минимизировать или максимизировать что-то. В вашей модели у вас есть только ограничения. Правда, есть нечто, похожее на целевую функцию -
problem += gramsOfMeat*1.29 + gramsOfPasta*3.655 + gramsOfOil*9 - target_calories
- но поскольку вы ограничили это значение равным 0, это на самом деле не имеет никакого эффекта. Конечно, нет ничего неправильного в отсутствии целевой функции, но это необычно, и я хотел бы упомянуть об этом на случай, если это не то, что вы намеревались.