Jump to content
BulForum.com

Какво ви минава през главата


Recommended Posts

  • Replies 107k
  • Created
  • Last Reply

Сортираш ги по големина числата и почваш да събираш първото с последното предпоследното с второто и така. Първите двама с последните двама в една група 3и 4 с 13 и 14 и така. Това ти е оптималния вариант според мен. Поне това се сещам за 2 минути размисъл

 

Сега се сещам и варианти където може да не е точно така, и да се наложи последния да е с последните 3, но горе долу идеята е да се сортират и да се правят комбинации първи с последен. Може би вариатн е да се съберат всички 16, да се получи средна стойност и от сортираните да се почне да се събират до достигане на средния сбор или 4-ки.

Link to comment
Share on other sites

Точно така!

В перфектния вариант, въпросните числа са с имена.

 

Ще ти го напиша от любов към спорта. 

 

А колкото до статията хората се опитват да го решат културно без да пробват всички възможни варианти, само че при теб тези варианти са много малко (списъка е само 16 елемента и се дели на 4 групи по 4 елемента) - това пълното изчерпване на вариантите ще мине за отрицателно време и няма какво да се мисли

Link to comment
Share on other sites

Ок, ще чакам!

Пиеш много скъпи уискита, ама за бира ще се разберем... :D

 

Аз го написах ама верно хората правилно говорят там за оптимизации. Бройката на вариантите е 416 и javascript-a загива 

Link to comment
Share on other sites

Аз го написах ама верно хората правилно говорят там за оптимизации. Бройката на вариантите е 416 и javascript-a загива

Ако въведените числа ги събереш и разделиш на броя на групите и пробваш да въртиш числата че да приближат полученото число няма ли да помогне да изрежеш вариантите
Link to comment
Share on other sites

Миро, не се сещам какво имаш предвид и как би помогнало. Ето го кода (слагам го в спойлер че е дългичък като за пост иначе като код е ок). Ако искаш модифицирай го

 

 

<!DOCTYPE>

<html>
<head>
    <title>Test</title>

    <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
    <style>
        #form_controls label {
            width: 80px;
            text-align: right;
            padding-right: 5px;
        }

        .controls {
            margin-bottom: 5px;
        }

        .controls input {
            margin-right: 5px;
        }
    </style>
</head>
<body>


    <div class="container">
        <div class="row">
            <form class="span4">
                <fieldset class="form-inline">
                    <legend>Legend</legend>
                    <div id="form_controls"></div>
                    <div class="form-actions">
                        <button class="btn btn-primary" id="btnSplit">Find Best Partitioning</button>
                    </div>
                </fieldset>
            </form>
            <div class="span8">
                <legend>Results</legend>
                <div id="results" class="row">

                </div>
            </div>
        </div>
    </div>

    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>
    <script>

        var bestSplit;
        var bestSplitDelta = 9999;

        
        function EvaluateSplit(items) {
            var teams = [[],[],[],[]];
            var teamWeight = [0, 0, 0, 0];
            var teamSize = [0, 0, 0, 0];
            for (var i = 0; i < 16; i++) {
                teams[items[i].team].push(i);
                teamWeight[items[i].team] += items[i].weight;
            }
            for (var i = 0; i < 4; i++) if (teams[i].length != 4) return; // invalid teams

            var minWeight = Math.min.apply(null, teamWeight);
            var maxWeight = Math.max.apply(null, teamWeight);
            
            teamDelta = maxWeight - minWeight;

            if (teamDelta < bestSplitDelta) {
                bestSplit = teams;
                bestSplitDelta = teamDelta;
            }
        }

        function SplitItems(ndx, items) {
            for (var i = 0; i < 4; i++) {
                $("#t" + i).text(i);
                items[ndx].team = i;
                if (ndx < 15) {
                    SplitItems(ndx + 1, items);
                } else {
                    EvaluateSplit(items);
                }
            }
        }


        function DisplayBestSplit(items) {
            $("#results").html("");
            console.log(bestSplit);
            for (var t = 0; t < 4; t++) {
                var $div = $("<div class='span2'></div>");
                var teamWeidht = 0;
                for (var n = 0; n < 4; n++) {
                    $div.append(items[bestSplit[t][n]].description);
                    teamWeight += items[bestSplit[t][n]].weight;
                }
                $div.append("team weight: " + teamWeight);
                $("#results").append($div);
            }
        }

        function InitializeForm() {
            for (var i = 1; i <= 16; i++) {
                var $div = $("<div class='controls'><label>" + i + ".</label></div>");
                var $inp1 = $("<input type='text' placeholder='description' class='input-medium' />").attr("id", "name" + i);
                var $inp2 = $("<input type='number' placeholder='weight' class='input-mini' />").attr("id", "weight" + i);
                $inp1.val("item #" + i);
                $inp2.val((Math.random() * 150).toFixed(0));
                $div.append($inp1).append($inp2).append("<span id='t"+i+"'></span>");
                $("#form_controls").append($div);
            }

            $("#btnSplit").click(function (event) {
                event.preventDefault();
                var items = [];
                for (var i = 1; i <= 16; i++) {
                    var rec = {
                        description: $("#name" + i).val(),
                        weight: $("#weight" + i).val(),
                        team: 0
                    };
                    items.push(rec);
                }
                bestSplitDelta = 9999;
                SplitItems(0,items);
                DisplayBestSplit(items);
            });
        }

        InitializeForm();
    </script>
</body>
</html>

 

 

Проблема е че онази функция върти 16 броя цикли от 1 до 4 което ефективно генерира 4 на 16та степен комбинации - т.е. 4 294 967 296. Мислех си че ще е по-бързо но не би. Поне с javascript.

Link to comment
Share on other sites

Има ли някой хайлазин, дето да пътува по-често между София и Пловдив?

Link to comment
Share on other sites

Има ли някой хайлазин, дето да пътува по-често между София и Пловдив?

Насьо... Прати и съвсем малко восъчна паста, щот искам да пробвам нещо, пък не ми се взима цяла кутия заради едната проба.

Link to comment
Share on other sites

Утре ще пътувам,ако има нещо спешно.Само,че съм зает сутринта.Трябва да правя реферат по Човешки ресурси...

Link to comment
Share on other sites

С лека оптимизация това с разделянето тръгна :-)

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Test</title>

    <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css" rel="stylesheet">
    <style>
        #form_controls label {
            width: 80px;
            text-align: right;
            padding-right: 5px;
        }

        .controls {
            margin-bottom: 5px;
        }

        .controls input {
            margin-right: 5px;
        }
    </style>
</head>
<body>


    <div class="container">
        <div class="row">
            <form class="span4">
                <fieldset class="form-inline">
                    <legend>Legend</legend>
                    <div id="form_controls"></div>
                    <div class="form-actions">
                        <button class="btn btn-primary" id="btnSplit">Find Best Partitioning</button>
                    </div>
                </fieldset>
            </form>
            <div class="span8">
                <legend>Results</legend>
                <div id="results" class="row">

                </div>
            </div>
        </div>
    </div>

    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/js/bootstrap.min.js"></script>
    <script>

        var bestSplit;
        var bestSplitDelta = 9999;
        var items;
        var teamWeight = [0, 0, 0, 0];
        var teamSize = [0, 0, 0, 0];
        var numIterations = 0;
        
        function EvaluateSplit() {
            var teams = [[],[],[],[]];
            var teamSize = [0, 0, 0, 0];
            for (var i = 0; i < 16; i++) {
                teams[items[i].team].push(i);
            }
            for (var i = 0; i < 4; i++) if (teams[i].length != 4) return; // invalid teams

            var minWeight = Math.min.apply(null, teamWeight);
            var maxWeight = Math.max.apply(null, teamWeight);
            
            teamDelta = maxWeight - minWeight;

            if (teamDelta < bestSplitDelta) {
                bestSplit = teams;
                bestSplitDelta = teamDelta;
            }
        }

        function SplitItems(ndx) {
            for (var i = 0; i < 4; i++) {
                if (teamSize[i] == 4) continue;
                //$("#t" + i).text(i);
                items[ndx].team = i;
                teamWeight[i] += items[ndx].weight;
                teamSize[i]++;
                numIterations++;
                var teamDelta = 0;
                if (ndx >= 7) {
                    var minWeight = 9999;
                    var maxWeight = 0;
                    for (var t = 0; t < 4; t++) {
                        if (teamSize[t] != 4) continue;
                        if (minWeight > teamWeight[t]) minWeight = teamWeight[t];
                        if (maxWeight < teamWeight[t]) maxWeight = teamWeight[t];
                    }
                    teamDelta = maxWeight - minWeight;
                }

                if (ndx < 15) {
                    if (teamDelta < bestSplitDelta) // skip bad combinations
                        SplitItems(ndx + 1);
                } else {
                    if (teamDelta < bestSplitDelta) {
                        EvaluateSplit();
                    }
                }
                teamSize[i]--;
                teamWeight[i] -= items[ndx].weight;
            }
        }


        function DisplayBestSplit() {
            $("#results").html("");
            for (var t = 0; t < 4; t++) {
                var $div = $("<div class='span2'></div>");
                var tw = 0;
                for (var n = 0; n < 4; n++) {
                    $div.append(items[bestSplit[t][n]].description + " (" + items[bestSplit[t][n]].weight + ")<br/>");
                    tw += items[bestSplit[t][n]].weight;
                }
                $div.append("team weight: " + tw);
                $("#results").append($div);
            }
            var $div2 = $("<div class='span8'></div>");
            $div2.append("<br><br>team difference: " + bestSplitDelta + ", combinations tested: " + numIterations);
            $("#results").append($div2);
        }

        function InitializeForm() {
            for (var i = 1; i <= 16; i++) {
                var $div = $("<div class='controls'><label>" + i + ".</label></div>");
                var $inp1 = $("<input type='text' placeholder='description' class='input-medium' />").attr("id", "name" + i);
                var $inp2 = $("<input type='number' placeholder='weight' class='input-mini' />").attr("id", "weight" + i);
                $inp1.val("item #" + i);
                $inp2.val((Math.random() * 150).toFixed(0));
                $div.append($inp1).append($inp2).append("<span id='t"+i+"'></span>");
                $("#form_controls").append($div);
            }

            $("#btnSplit").click(function (event) {
                event.preventDefault();
                items = [];
                for (var i = 1; i <= 16; i++) {
                    var rec = {
                        description: $("#name" + i).val(),
                        weight: parseFloat($("#weight" + i).val()),
                        team: 0
                    };
                    items.push(rec);
                }
                numIterations = 0;
                teamWeight = [0, 0, 0, 0];
                teamSize = [0, 0, 0, 0];
                bestSplitDelta = 9999;
                SplitItems(0);
                DisplayBestSplit();
            });
        }

        InitializeForm();
    </script>
</body>
</html>

 

 

Това го записваш в един .html файл и си готов :)

Link to comment
Share on other sites

Пишеш си имената на хората, кой колко тежи и ти ги разпределя в отбори с еднаква тежест (сила или каквото искаш там го наречи) по възможно най-оптимален начин , та отборите да са най-равностойни

 

Фиксирани са 16 участника и 4 отбора по 4 човека.

Link to comment
Share on other sites

  • Veno locked this topic

Archived

This topic is now archived and is closed to further replies.

Guest
This topic is now closed to further replies.

×
×
  • Create New...