Avatar billede kapedersen Nybegynder
25. oktober 2015 - 00:19 Der er 11 kommentarer

Kombination / linear programing

Hej

Er der nogle der kan hjælpe med et stykke program kode til at løse følgende?

Jeg har 10 spande med forskellig vægt og vil gerne finde den kombination der er tættest på 5 kg
How to do

Mvh Kim
Avatar billede arne_v Ekspert
25. oktober 2015 - 00:25 #1
Hvad med noget saa banalt som 3 variable mindif, spand1 og spand2 plus 2 for loekker som lobeber igennem all kombinationer?
Avatar billede arne_v Ekspert
25. oktober 2015 - 00:26 #2
Eller maa det godt vaere mere end to spande?
Avatar billede kapedersen Nybegynder
25. oktober 2015 - 07:27 #3
Hej Arne_V

Alle kombinationer fra 1 spand til  10 spande må indgå for at få en kombination der ligger tættest på 5kg uden at være under 5 kg, jeg glemte at skrive i mit indlæg at resultatet af kombinationen ikke må være mindre end 5kg
Avatar billede kapedersen Nybegynder
25. oktober 2015 - 18:16 #4
Er knapsack noget der kan bruges?  Men matematik der ligger over mit niveau
Avatar billede arne_v Ekspert
25. oktober 2015 - 19:38 #5
Saa skal man nok over i noget recursion.

Hvis man vil bruge brute force.

Jeg ved ikke om der er noget smart matematik. Det er muligt.
Avatar billede kapedersen Nybegynder
25. oktober 2015 - 20:11 #6
Kunne man regne  alle kombinationer og derefter løbe dem igennem for at finde den bedste?
Avatar billede arne_v Ekspert
25. oktober 2015 - 20:45 #7
Det er det jeg mener med brute force.
Avatar billede arne_v Ekspert
25. oktober 2015 - 20:46 #8
Ide:


Imports System
Imports System.Collections.Generic
Imports System.Linq

Namespace E
    Public Class Optimizer
        Public Structure Result
            Public Value As Double
            Public NoBuckets As Integer
            Public Buckets As Integer()
        End Structure
        Private Shared Sub BruteForce(targetval As Double, bucketvals As List(Of Double), ix As Integer, len As Integer, work As Integer(), ByRef res As Result)
            For i As Integer = ix To bucketvals.Count - 1
                work(len) = i
                len += 1
                Dim val As Double = work.Take(len).Sum(Function(v) bucketvals(v))
                If val < targetval Then
                    If i < bucketvals.Count - 1 Then
                        BruteForce(targetval, bucketvals, i + 1, len, work, res)
                    End If
                Else
                    If val < res.Value Then
                        res.Value = val
                        res.NoBuckets = len
                        res.Buckets = DirectCast(work.Clone(), Integer())
                    End If
                End If
                len -= 1
            Next
        End Sub
        Public Shared Function BruteForce(targetval As Double, bucketvals As List(Of Double)) As Result
            Dim res As New Result()
            res.Value = Double.MaxValue
            res.NoBuckets = 0
            res.Buckets = New Integer(bucketvals.Count - 1) {}
            BruteForce(targetval, bucketvals, 0, 0, New Integer(bucketvals.Count - 1) {}, res)
            Return res
        End Function
    End Class

    Public Class Program
        Private Shared Sub Test(targetval As Double, bucketvals As List(Of Double))
            Dim res As Optimizer.Result = Optimizer.BruteForce(targetval, bucketvals)
            Console.WriteLine("{0} : {1}", res.Value, [String].Join(",", res.Buckets.Take(res.NoBuckets).Select(Function(v) v.ToString()).ToArray()))
        End Sub
        Public Shared Sub Main(args As String())
            Dim a As New List(Of Double)() From { 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9 }
            Test(5.0, a)
            Test(5.1, a)
            Test(5.2, a)
            Test(5.3, a)
            Test(5.325, a)
            Test(5.35, a)
            Test(5.4, a)
            Test(10.0, a)
            Console.ReadKey()
        End Sub
    End Class
End Namespace
Avatar billede kapedersen Nybegynder
25. oktober 2015 - 21:01 #9
Ja hvorfor ik, har du testet? Jeg prøver lige imorgen
Avatar billede arne_v Ekspert
25. oktober 2015 - 23:31 #10
Jeg har koert det.

:-)
Avatar billede kapedersen Nybegynder
26. oktober 2015 - 09:49 #11
Hej Arne_V

Har du mulighed for at give mig et eksempel i Structured text også?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester