문제

말이 있습니다.그것은 갈 필요가 있는 지점에서 B 지점 B 점 C 를 마지막으로 점 C 점 D.당신이 그것을 필요 거기에 다섯에 대한 일 최소 금액 가능합니다.에는 다음 세 가지가 있습니다 화주에 대한 각 다리가 각각 자신의 다른 시간과 비용에 대한 각 다리:

Array
(
    [leg0] => Array
        (
            [UPS] => Array
                (
                    [days] => 1
                    [cost] => 5000
                )

            [FedEx] => Array
                (
                    [days] => 2
                    [cost] => 3000
                )

            [Conway] => Array
                (
                    [days] => 5
                    [cost] => 1000
                )

        )

    [leg1] => Array
        (
            [UPS] => Array
                (
                    [days] => 1
                    [cost] => 3000
                )

            [FedEx] => Array
                (
                    [days] => 2
                    [cost] => 3000
                )

            [Conway] => Array
                (
                    [days] => 3
                    [cost] => 1000
                )

        )

    [leg2] => Array
        (
            [UPS] => Array
                (
                    [days] => 1
                    [cost] => 4000
                )

            [FedEx] => Array
                (
                    [days] => 1
                    [cost] => 3000
                )

            [Conway] => Array
                (
                    [days] => 2
                    [cost] => 5000
                )

        )

)

어떻게 당신을 찾는 것에 대해 최적의 조합 프로그래밍 방식으로?

내 최고의 시도는 지금까지(세 번째 또는 네 번째 알고리즘)입니다:

  1. 긴 발송인에 대한 각 다리
  2. 을 제거"가장 비싸다"하나
  3. 을 찾아 가장 저렴한 송하인에 대한 각 다리
  4. 계산 총 비용 및 일
  5. 면 일은 허용,마무리 다른 사람,goto1

신속하게 조롱에서 PHP(주는 배열을 테스트 아래에 거침없이 작동,하지만 당신이 그것을 시도와 테스트 배열 위에서,그것을 찾지 않습니다 올바른 조합):

$shippers["leg1"] = array(
    "UPS"    => array("days" => 1, "cost" => 4000),
    "Conway" => array("days" => 3, "cost" => 3200),
    "FedEx"  => array("days" => 8, "cost" => 1000)
);

$shippers["leg2"] = array(
    "UPS"    => array("days" => 1, "cost" => 3500),
    "Conway" => array("days" => 2, "cost" => 2800),
    "FedEx"  => array("days" => 4, "cost" => 900)
);

$shippers["leg3"] = array(
    "UPS"    => array("days" => 1, "cost" => 3500),
    "Conway" => array("days" => 2, "cost" => 2800),
    "FedEx"  => array("days" => 4, "cost" => 900)
);    

$times = 0;
$totalDays = 9999999;

print "<h1>Shippers to Choose From:</h1><pre>";
print_r($shippers);
print "</pre><br />";

while($totalDays > $maxDays && $times < 500){
            $totalDays = 0;
            $times++;
            $worstShipper = null;
            $longestShippers = null;
            $cheapestShippers = null;

            foreach($shippers as $legName => $leg){
                //find longest shipment for each leg (in terms of days)
                unset($longestShippers[$legName]);
                $longestDays = null;        

                if(count($leg) > 1){
                    foreach($leg as $shipperName => $shipper){
                        if(empty($longestDays) || $shipper["days"] > $longestDays){
                            $longestShippers[$legName]["days"] = $shipper["days"];
                            $longestShippers[$legName]["cost"] = $shipper["cost"];
                            $longestShippers[$legName]["name"] = $shipperName;
                            $longestDays = $shipper["days"];
                        }
                    }           
                }
            }

            foreach($longestShippers as $leg => $shipper){
                $shipper["totalCost"] = $shipper["days"] * $shipper["cost"];

                //print $shipper["totalCost"] . " &lt;?&gt; " . $worstShipper["totalCost"] . ";";

                if(empty($worstShipper) || $shipper["totalCost"] > $worstShipper["totalCost"]){
                    $worstShipper = $shipper;
                    $worstShipperLeg = $leg;
                }
            }

            //print "worst shipper is: shippers[$worstShipperLeg][{$worstShipper['name']}]" . $shippers[$worstShipperLeg][$worstShipper["name"]]["days"];
            unset($shippers[$worstShipperLeg][$worstShipper["name"]]);

            print "<h1>Next:</h1><pre>";
            print_r($shippers);
            print "</pre><br />";

            foreach($shippers as $legName => $leg){
                //find cheapest shipment for each leg (in terms of cost)
                unset($cheapestShippers[$legName]);
                $lowestCost = null;

                foreach($leg as $shipperName => $shipper){
                    if(empty($lowestCost) || $shipper["cost"] < $lowestCost){
                        $cheapestShippers[$legName]["days"] = $shipper["days"];
                        $cheapestShippers[$legName]["cost"] = $shipper["cost"];
                        $cheapestShippers[$legName]["name"] = $shipperName;
                        $lowestCost = $shipper["cost"];
                    }
                }

                //recalculate days and see if we are under max days...
                $totalDays += $cheapestShippers[$legName]['days'];  
            }
            //print "<h2>totalDays: $totalDays</h2>";
        }

        print "<h1>Chosen Shippers:</h1><pre>";
        print_r($cheapestShippers);
        print "</pre>";

을 수 있다고 생각하는 실제로 어떤 종류의 것은 어디서 나는 그들 각각의 조합을 하나 하나를(와의 시리즈 루프)및 추가"총 점수를"각각을 찾아 최고의 하나입니다....

편집:을 명확히,이 아닌"숙제"을 할당(I'm not 학교에서).그것의 현재 프로젝트에서 작동합니다.

의 요구 사항(으로 항상)되었을 끊임없이 변화하고 있습니다.면 나는 받았다는 현재 제약 조건에서 시간을 일하기 시작했에서 이 문제,나는 것을 사용하여 어떤 변형의*알고리즘(또는트라 또는 가장 짧은 경로 또는 단순하거나 뭔가).그러나 모든 것이 되었습핑 및 변경,그리고 제 내가 어디에서 지금이다.

그래서 나는 내가 필요로 하는 것은 쓰레기를 나는 이 시점에 그냥 내가 무엇을 알고 나는 가야 하는 경로를 찾는 알고리즘이 있습니다.

도움이 되었습니까?

해결책

할 수 있의 일부를 변경 가장 짧은 경로를 알고리즘, 처럼,트라의,무게 각 경로에 의해 비용한 시간을 추적하고 나가지 말라 특정 경로를 따라하면 시간을 초과하의 임계값입니다.해 가장 저렴한 가져오는 당신의 임계하는 방법

다른 팁

소리처럼 당신이 무슨은"선형 프로그래밍 문제".그것도 같은 소리를 문제 없습니다.

고전적인 솔루션을 LP 문제는"단순한 방법".Google 니다.

그러나 사용하는 방법이 있어야 합니다 문제는 올바르게 책정을 설명하는 귀하의 요구 사항입니다.

여전히,그것이 가능할 수 있을 열거 가능한 모든 경로가 있기 때문에,같은 작은 설정합니다.그런 일이 없 규모,하지만.

소리는 작업에 대한 Dijkstra 알고리즘:

Dijkstra 알고리즘 생각하여 컴퓨터 네덜란드 과학자 Edsger 트라 1959 년 1 그래프 탐색 알고리즘을 해결하는 하나의 소스는 가장 짧은 경로를 문제에 대한 그래프를 비는 부정적인 경로 가장자리 비용,출력하는 가장 짧은 경로 나무입니다.이 알고리즘은 종종에서 사용 라우팅이라고 합니다.

거기에는 또한 구현에서 세부 정보니다.

내가 알고 있다면 나만을 처리했 5 개 도시에서 미리 정해진 주문뿐이었다는 3 개의 노선 사이에 인접한 도시로,나는 짐승입니다.아점에서는 우아한입니다.

는 경우,다른 한편으로는,이 숙제이고 내가 했을 생산하는 알고리즘을 실제로 할 수 있는 규모로,나는 아마 다른 방법으로 접근하고 있습니다.

로 Baltimark 말했다,이것은 기본적으로 선형 프로그래밍 문제입니다.는 경우에만 계수를 위한 선적회사(1 위해 포함되지 않은 경우 0 포함)지(바이너리)정수에 대한 각 다리,이 것을 더 쉽게 무료로 일치하.지금 당신은 당신을 찾을 필요가 일부(바이너리)정수 선형 프로그래밍(ILP)휴리스틱으로 문제가 NP-어렵습니다.보 에 위키백과 정수 선형 프로그래밍 에 대한 링크를;에 나선형 프로그래밍은 물론 우리는 적어도 사용 점과 바.

실제로 이제는 나의 생각,그것이 특별한 경우 무료로 일치하지 않고 실제 ILP 의 금액으로 일하지 않는 문제로 그것은 <=5.이제 시작하여 가장 저렴한 운반대를 위한 첫 번째 선택(콘웨이는 5:1000).다음 당신은 선택을 다시 아직 가장 저렴한 결과,8 개 일 4000 통화 단위는 너무 많은 그래서 우리가 중단하다.에 의하려고 다른 사람도 우리는 그들은 모두 결과를 일>5 그래서 우리는 첫 번째 선택하려고 두 번째 저렴한(페더럴 익스프레스 2:3000)다음에서 두 번째 및 페더럴 익스프레스에서는 마지막입니다.이것은 우리에게 총 4 개의 일 9000 통화 단위입니다.

우리는 다음을 사용할 수 있는 이 비용을 치른 검색 트리에서는 일부에 의해 subtree 단계의 결과 비용이 더 큰 것 중 하나는 우리가 발견했는 이미 떠나는 하위트리 unsearched 에서는 점이다.이대로 우리가 알고 있는 검색에 트리를 생성하지 않는 더 나은 결과로 우리가 여기 때 비용할 수 없습니다.

소망이 어슬렁거리는 도움이트:).

배낭 문제.무게는 일에 운송 중,그리고 이익을 해야$5000-의 비용 다.을 제거하는 모든 비용 및 부정적인 거기에서 간다!

내가 생각하는트라의 알고리즘을 찾기 위한 가장 짧은 경로입니다.

cmcculloh 한 최소한의 비용을 받는 조건 그것을 얻을 거기에서 5 일입니다.

그래서 단지를 찾는 가장 빠른 방법으로 얻을 수 없는 그가 가장 저렴한,그리고 얻기 위해 가장 저렴한지 않을 것이다,그것을 얻을 거기에 필요한 양의 시간입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top