22 if (!cp_model->has_objective())
return;
24 if (cp_model->objective().vars_size() == 1) {
27 const int old_ref = cp_model->objective().vars(0);
28 const int64 old_coeff = cp_model->objective().coeffs(0);
29 const double muliplier =
static_cast<double>(std::abs(old_coeff));
31 cp_model->mutable_objective()->set_vars(0,
NegatedRef(old_ref));
33 if (muliplier != 1.0) {
35 CHECK(cp_model->objective().domain().empty());
37 double old_factor = cp_model->objective().scaling_factor();
38 if (old_factor == 0.0) old_factor = 1.0;
39 const double old_offset = cp_model->objective().offset();
40 cp_model->mutable_objective()->set_scaling_factor(old_factor * muliplier);
41 cp_model->mutable_objective()->set_offset(old_offset / muliplier);
43 cp_model->mutable_objective()->set_coeffs(0, 1.0);
53 for (
int i = 0; i < cp_model->objective().vars_size(); ++i) {
54 const int ref = cp_model->objective().vars(i);
57 cp_model->objective().coeffs(i) * (
RefIsPositive(ref) ? 1 : -1);
58 const int64 value1 = cp_model->variables(
var).domain(0) * coeff;
59 const int64 value2 = cp_model->variables(
var).domain(
60 cp_model->variables(
var).domain_size() - 1) *
67 const int obj_ref = cp_model->variables_size();
69 IntegerVariableProto* obj = cp_model->add_variables();
70 Domain obj_domain(min_obj, max_obj);
71 if (!cp_model->objective().domain().empty()) {
79 LinearConstraintProto*
ct = cp_model->add_constraints()->mutable_linear();
82 *(
ct->mutable_vars()) = cp_model->objective().vars();
83 *(
ct->mutable_coeffs()) = cp_model->objective().coeffs();
84 ct->add_vars(obj_ref);
88 cp_model->mutable_objective()->clear_vars();
89 cp_model->mutable_objective()->clear_coeffs();
90 cp_model->mutable_objective()->add_vars(obj_ref);
91 cp_model->mutable_objective()->add_coeffs(1);
92 cp_model->mutable_objective()->clear_domain();
We call domain any subset of Int64 = [kint64min, kint64max].
Domain IntersectionWith(const Domain &domain) const
Returns the intersection of D and domain.
void EncodeObjectiveAsSingleVariable(CpModelProto *cp_model)
Domain ReadDomainFromProto(const ProtoWithDomain &proto)
bool RefIsPositive(int ref)
void FillDomainInProto(const Domain &domain, ProtoWithDomain *proto)
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...