Rafał Kaczor
Rafał Kaczor

Reputation: 21

limit amount of variables used in solution - oj! Algo & kotlin

im working on app to optimize meal planning. My app has 10 meals (x1-x10) with price, carb value, protein value and calories value. I want to choose always 3 meals from these 10. How to set this limit?

My code:

val model = ExpressionsBasedModel()
        val x1: Variable = model.addVariable("x1").binary().weight(41)
        val x2: Variable = model.addVariable("x2").binary().weight(16)
        val x3: Variable = model.addVariable("x3").binary().weight(32)
        val x4: Variable = model.addVariable("x4").binary().weight(23)
        val x5: Variable = model.addVariable("x5").binary().weight(46)
        val x6: Variable = model.addVariable("x6").binary().weight(1)
        val x7: Variable = model.addVariable("x7").binary().weight(2)
        val x8: Variable = model.addVariable("x8").binary().weight(23)
        val x9: Variable = model.addVariable("x9").binary().weight(5)
        val x10: Variable = model.addVariable("x10").binary().weight(7)



        val protein: Expression = model.addExpression("protein")
                .lower(60)
                .upper(90)
                .set(x1, 20)
                .set(x2, 25)
                .set(x3, 30)
                .set(x4, 15)
                .set(x5, 20)
                .set(x6, 15)
                .set(x7, 5)
                .set(x8, 11)
                .set(x9, 3)
                .set(x10, 25)


        val calories: Expression = model.addExpression("calories")
                .lower(1800)
                .upper(2200)
                .set(x1, 700)
                .set(x2, 600)
                .set(x3, 1000)
                .set(x4, 500)
                .set(x5, 800)
                .set(x6, 300)
                .set(x7, 350)
                .set(x8, 200)
                .set(x9, 300)
                .set(x10, 330)


        val carbs: Expression = model.addExpression("carbs")
                .lower(300)
                .set(x1, 100)
                .set(x2, 100)
                .set(x3, 150)
                .set(x4, 60)
                .set(x5, 150)
                .set(x5, 800)
                .set(x6, 60)
                .set(x7, 70)
                .set(x8, 30)
                .set(x9, 70)
                .set(x10, 50)


        val result: Optimisation.Result = model.maximise()

        println(result)


    }

data class Meal(val name: String, val kcal: Int, val protein: Int, val carbs: Int, val price: Int, var portionLimit: Int){
override fun toString() = name
}

Upvotes: 1

Views: 96

Answers (1)

apete
apete

Reputation: 1320

    val meals: Expression = model.addExpression("meals")
            .level(3)
            .set(x1, 1)
            .set(x2, 1)
            .set(x3, 1)
            .set(x4, 1)
            .set(x5, 1)
            .set(x6, 1)
            .set(x7, 1)
            .set(x8, 1)
            .set(x9, 1)
            .set(x10, 1)

Upvotes: 0

Related Questions