Eğer bir sevkiyat var söylüyorlar. Bu nokta B, C noktasına noktasından B noktasına gitmek gerekir ve nihayet Bunu mümkün para az miktarda beş gün içinde oraya gerekir D. işaret C etmektedir. Her bacak için üç olası nakliyatçılar, kendi farklı zaman ve her bacak için maliyet her vardır:
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
)
)
)
Nasıl programlı iyi kombinasyonunu bulma konusunda gitmek?
Benim en iyi girişimi şimdiye kadar (üçüncü veya dördüncü algoritması):
- Her bacak için uzun gönderen bul
- En "pahalı" bir eleyin
- Her bacak için ucuz gönderen bul
- Toplam maliyeti & hesaplayın günler
- Gün kabul edilebilir ise, bitirmek, başka goto 1
PHP hızlı bir alay-up (aşağıda deney dizisi tıkırında çalışıyor, ancak yukarıdaki deney dizisi ile deneyin, eğer doğru kombinasyonunu bulmak unutmayın):
$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"] . " <?> " . $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>";
Aslında ben tam anlamıyla her kombinasyon (döngüler bir dizi ile) tek tek yapmak ve her birinin toplam "puan" eklemek, ve en iyisini bulmak şey çeşit yapmak zorunda olabilir düşünüyorum ....
EDIT: To clarify, this isn't a "homework" assignment (I'm not in school). It is part of my current project at work.
(Her zaman olduğu gibi) gereksinimleri sürekli değişiyor. Ben bu sorun üzerinde çalışmaya başladı anda geçerli kısıtlamaları verildi, ben A * algoritması bir varyasyonunu kullanıyor olurdu (veya Dijkstra'nın ya da kısa yol veya simplex veya şey). Ama her şey geçişin ve değişen, ve ben şu anda kulüpler nerede bana getiriyor olmuştur.
Ben ki ben bu noktaya yapılır ve sadece bir yol bulma algoritması olan, ben gitmek gerektiğini biliyorum ne ile gitmek onca bok unutmak gerekiyor demektir sanırım.